#!/usr/bin/env zsh # # Copyright © 2009 Nick Bowler # # Generate module listings for an initramfs by searching a subset of the # installed modules for a particular kernel version. Currently, all # filesystem and MD drivers, plus all their (recursive) dependencies, # are included. # # License WTFPL2: Do What The Fuck You Want To Public License, version 2. # This is free software: you are free to do what the fuck you want to. # There is NO WARRANTY, to the extent permitted by law. usage() { echo "usage: modules.zsh kernel-version" 1>&2 exit 1 } out_mkdir_p() { local i base path base=$1 path=(${(s./.)2}) for i in {1..$#path}; do echo "dir $base/${(j./.)path[1,i]} 0755 0 0" done } if [ -z "$1" ]; then usage fi kver=$1 moduledir=/lib/modules/$kver if ! [ -d "$moduledir" ]; then echo "module directory for kernel \`\`$kver'' does not exist." 1>&2 usage fi kmods=(`find $moduledir/kernel/fs $moduledir/kernel/drivers/md \ -type f -name '*.ko' -exec basename {} .ko \;`) paths=() while [ $#kmods -gt 0 ]; do i=${kmods[1]} kmods=(${kmods[2,-1]}) info=`modinfo -k $kver $i` paths+=`echo $info | sed -n 's/^filename:[[:space:]]*//p'` kmods+=(${(s.,.)$(echo $info | sed -n 's/^depends:[[:space:]]*//p')}) done echo "dir $moduledir 0755 0 0" echo "file $moduledir/modules.dep $moduledir/modules.dep 0644 0 0" echo "file $moduledir/modules.alias $moduledir/modules.alias 0644 0 0" for i in $paths; do i=${i#$moduledir/} out_mkdir_p $moduledir $(dirname $i) echo "file $moduledir/$i $moduledir/$i 0644 0 0" done | sort -u