- modsort.sh
#!/bin/bash -e # 1. make INSTALL_MOD_PATH=/tmp/somewhere/usr/local modules_install # 2. Create a new directory where packages are to be created # 3. Run modsort.sh from inside that new directory # # Usage: ./modsort.sh KERNEL PATH # Example: ./modsort.sh 6.6.8-simple64 /tmp/somewhere # # Concept brought in from Tiny Core Linux # Requires squashfs-tools modpack() { cd $BASEPATH OLDDIR=$OLDPWD MODFILE=$1 shift rm -rf /tmp/xtra > /tmp/list for i in $@ do find usr/local/lib/modules/$KERNEL/kernel/${i} -type f >> /tmp/list done tar -cvzf ${OLDDIR}/${MODFILE}.tgz -T /tmp/list for g in `cat /tmp/list`; do rm $g; done mkdir /tmp/xtra tar -C /tmp/xtra -xf ${OLDDIR}/${MODFILE}.tgz cd /tmp mksquashfs xtra ${MODFILE}.ext md5sum ${MODFILE}.ext > $OLDDIR/${MODFILE}.md5 zsyncmake -u ${MODFILE}.ext ${MODFILE}.ext mv ${MODFILE}.ext* $OLDDIR find xtra -type f -exec modinfo '{}' \; >> ${OLDDIR}/${MODFILE}.moddeps grep depends: ${OLDDIR}/${MODFILE}.moddeps | cut -d: -f2 | sed -e 's@^[ ]*@@' -e '/^$/d' -e 's@,@\n@g' | sort | uniq > /tmp/tmpdeps mv /tmp/tmpdeps ${OLDDIR}/${MODFILE}.moddeps cd xtra find -type f > ${OLDDIR}/${MODFILE}.lst rm ${OLDDIR}/${MODFILE}.tgz cd $OLDDIR # Clean the moddeps up a bit, remove everything in the same file for i in `cat ${MODFILE}.moddeps` do grep -q "${i}.ko" ${MODFILE}.lst && sed -i "/^${i}$/d" ${MODFILE}.moddeps done [ -s ${MODFILE}.moddeps ] || rm ${MODFILE}.moddeps } [ $# -ne 2 ] && echo "Usage: $0 KERNELVER PATH" && exit 1 KERNEL=$1 BASEPATH=$2 echo Sorting $KERNEL modules from $BASEPATH [ ! -e ${BASEPATH}/usr/local/lib/modules/${KERNEL} ] && echo "Check Parameters!" && exit 1 [ -f ${BASEPATH}/fs/zfs/zfs.ko ] && modpack zfs-$KERNEL fs/zfs drivers/spl [ -f ${BASEPATH}/arch/x86/kvm/kvm.ko ] && modpack kvm-$KERNEL arch/x86/kvm modpack alsa-modules-$KERNEL sound modpack bluetooth-$KERNEL net/bluetooth drivers/bluetooth modpack net-bridging-$KERNEL net/bridge modpack net-sched-$KERNEL net/sched modpack ipv6-netfilter-$KERNEL net/ipv6 net/ipv4 net/netfilter modpack wireless-$KERNEL net/mac80211 net/wireless drivers/net/wireless modpack nouveau-$KERNEL drivers/gpu/drm/nouveau modpack graphics-$KERNEL drivers/char/agp drivers/gpu drivers/usb/misc/sisusbvga modpack firewire-$KERNEL drivers/firewire modpack hwmon-$KERNEL drivers/hwmon modpack i2c-$KERNEL drivers/i2c modpack raid-dm-$KERNEL drivers/md lib/raid* modpack input-joystick-$KERNEL drivers/input/joy* drivers/input/gameport modpack input-tablet-touchscreen-$KERNEL drivers/input/tablet drivers/input/touchscreen modpack mtd-$KERNEL drivers/mtd modpack usb-serial-$KERNEL drivers/usb/misc/uss* drivers/usb/serial modpack leds-$KERNEL drivers/leds modpack pci-hotplug-$KERNEL drivers/pci/hotplug modpack thinkpad-acpi-$KERNEL drivers/platform/x86/thinkpad_acpi* modpack watchdog-$KERNEL drivers/watchdog modpack ax25-$KERNEL net/ax25 net/rose net/netrom drivers/net/hamradio #modpack irda-$KERNEL net/irda drivers/net/irda drivers/usb/serial/ir-usb* #modpack wimax-$KERNEL net/wimax drivers/net/wimax # Needs to go to the base. mv ${BASEPATH}/usr/local/lib/modules/${KERNEL}/kernel/drivers/scsi/hv_* /tmp mv ${BASEPATH}/usr/local/lib/modules/${KERNEL}/kernel/drivers/scsi/scsi_transport_fc* /tmp mv ${BASEPATH}/usr/local/lib/modules/${KERNEL}/kernel/drivers/media/cec/core/cec.ko* /tmp mv ${BASEPATH}/usr/local/lib/modules/${KERNEL}/kernel/fs/exfat* /tmp modpack scsi-$KERNEL drivers/scsi drivers/message modpack l2tp-$KERNEL net/l2tp modpack sctp-$KERNEL net/sctp modpack v4l-dvb-$KERNEL drivers/media drivers/usb/misc/isight* modpack filesystems-$KERNEL fs/[bcehjmrux]*/* fs/nfsd/* fs/nfs fs/nilfs2 # Meta-extension for original modules EMPTYD=`mktemp -d` mkdir -p ${EMPTYD}/lib ls *.ext > original-modules-$KERNEL.dep mksquashfs $EMPTYD original-modules-$KERNEL.ext md5sum original-modules-$KERNEL.ext > original-modules-$KERNEL.md5 zsyncmake -u original-modules-$KERNEL.ext original-modules-$KERNEL.ext rm -rf $EMPTYD # The rest goes to the base. mv /tmp/hv_* /tmp/scsi_transport_fc* /tmp/cec.ko* /tmp/exfat* ${BASEPATH}/usr/local/lib/modules/${KERNEL}/kernel/drivers/scsi/ cd ${BASEPATH}/usr/local ln -sf /usr/local/lib/modules/${KERNEL}/kernel/ lib/modules/${KERNEL}/kernel.tclocal mkdir -p usr/local/lib/modules/${KERNEL}/kernel/ find lib/modules ! -type d > /tmp/list echo usr/local/lib/modules/${KERNEL}/kernel/ >> /tmp/list tar cvzf ${OLDPWD}/base_modules.tgz -T /tmp/list cd - cp /tmp/list base_modules.tgz.list # Is it 64-bit? is64= case $KERNEL in *64) is64=64 ;; esac # Also convert it to the cpio initrd format mkdir tmp cd tmp tar xf ../base_modules.tgz depmod -a -b . ${KERNEL} rm -f lib/modules/${KERNEL}/*map rm lib/modules/${KERNEL}/modules.symbols find lib usr | cpio -o -H newc | gzip -9 > ../modules${is64}.gz cd .. rm -rf tmp # Some final moddeps cleanup for i in `grep gz base_modules.tgz.list | sed -e 's@.*/@@' -e 's@.ko.gz@@'`; do sed "/^$i\$/d" *moddeps -i; done for i in *moddeps; do [ -s $i ] || rm $i; done echo -e "\n\n"'Done!'