mkinitrd (3351B)
1 #!/bin/sh 2 # busybox based initramfs script 3 4 add_kmod() { 5 while [ "$1" ]; do 6 kmod=$1; shift 7 path=$(modinfo -k $K -F filename $kmod 2>/dev/null) 8 [ "$path" ] || continue 9 [ -f $W/$path ] && continue 10 add_file $path 11 for firmware in $(modinfo -k $K -F firmware $kmod); do 12 [ -f /lib/firmware/$firmware.xz ] && add_file /lib/firmware/$firmware.xz 13 [ -f /lib/firmware/$firmware ] && add_file /lib/firmware/$firmware 14 done 15 for depends in $(modinfo -k $K -F depends $kmod | tr ',' ' '); do 16 [ "$depends" ] || continue 17 add_kmod $depends 18 done 19 done 20 } 21 22 add_bin() { 23 while [ "$1" ]; do 24 bin=$(which $1); shift 25 [ "$bin" ] || { 26 echo "FAILED: $bin: missing binary" 27 continue 28 } 29 add_file "$bin" 30 [ -L "$bin" ] && bin=$(readlink -f $bin) 31 case $(file -bi $bin) in 32 application/x-pie-executable*) 33 for file in $(ldd $bin | awk '{print $3}'); do 34 add_file $file 35 done;; 36 esac 37 done 38 } 39 40 add_file() { 41 f=$1 42 t=$2 43 m=$3 44 [ -f "$1" ] || { 45 echo "FAILED: $f: missing file" 46 return 47 } 48 if [ -L "$f" ]; then 49 add_file $(readlink -f $1) 50 fi 51 install $([ "$m" ] && echo "-m $m") -D $f $W${2:-$f} 2>/dev/null 52 echo "$([ "$?" = 0 ] && echo OK || echo FAILED): $f" 53 } 54 55 K=$(uname -r) 56 W=/tmp/mkinitrd-xxx 57 O=initrd 58 I=/usr/share/mkinitrd/init 59 60 while [ "$1" ]; do 61 case $1 in 62 -k) K=$2; shift;; 63 -i) I=$2; shift;; 64 -a) A=1;; 65 -h) H=1;; 66 *) O=$1;; 67 esac 68 shift 69 done 70 71 if [ "$H" ]; then 72 cat <<EOF 73 mkinitrd: busybox based initramfs generator. 74 75 Usage: $0 [-ah] [-k kernel] [-i init] [ OUTPUT ] 76 77 -a Auto detect kernel modules 78 -i init Use custom init file (default: /usr/share/mkinitrd/init) 79 -k kernel kernel version 80 -h Show this help message 81 EOF 82 exit 0 83 fi 84 85 if [ "$(id -u)" != 0 ]; then 86 echo "error: this program need to run as root" 87 exit 1 88 fi 89 90 M=/lib/modules/$K 91 92 if [ ! -d "$M" ]; then 93 echo "error: kernel modules directory '$M' not found" 94 exit 1 95 fi 96 97 if [ ! -f "$M"/modules.dep ]; then 98 echo "error: modules.dep file not found, please run 'depmod' first" 99 exit 1 100 fi 101 102 if [ ! "$(command -v busybox)" ]; then 103 echo "error: busybox not found in PATH, please install busybox" 104 exit 1 105 fi 106 107 # create temporary bin path for busybox's applet 108 # we trying to use busybox utils as possible 109 mkdir -p /tmp/busybox-bin.$$ 110 for a in $(busybox --list); do 111 ln -s $(command -v busybox) /tmp/busybox-bin.$$/$a 112 done 113 export PATH=/tmp/busybox-bin.$$:$PATH 114 115 if [ ! -f "$I" ]; then 116 echo "error: init file '$I' not found" 117 exit 1 118 fi 119 120 rm -rf $W 121 mkdir -p $W/$M 122 123 for d in bin dev etc lib proc run sys; do 124 mkdir -p $W/$d 125 done 126 ln -s . $W/usr 127 ln -s bin $W/sbin 128 ln -s lib $W/lib64 129 130 if [ "$A" ]; then 131 for i in /sys/module/*; do 132 add_kmod ${i##*/} 133 echo ${i##*/} >> $W/modules 134 done 135 else 136 for d in \ 137 crypto fs lib drivers/block drivers/md drivers/ata \ 138 drivers/firewire drivers/input/keyboard drivers/input/mouse \ 139 drivers/scsi drivers/message drivers/pcmcia drivers/virtio \ 140 drivers/usb/host drivers/usb/storage drivers/hid; 141 do 142 for f in $(find $M/kernel/$d -name *.ko*); do 143 f=${f##*/}; f=${f%.ko*} 144 add_kmod $f 145 done 146 done 147 fi 148 add_file $M/modules.builtin 149 add_file $M/modules.order 150 depmod -b $W $K 151 152 add_bin busybox 153 add_file $I / 755 154 155 echo '$MODALIAS=.* 0:0 660 @modprobe "$MODALIAS' > $W/etc/mdev.conf 156 157 ( cd $W ; find . | cpio -o -H newc --quiet | gzip -9 ) > "$O" 158 du -sh "$O" 159 rm -rf $W /tmp/busybox-bin.$$ 160 161 exit 0