mkinitrd

Unnamed repository; edit this file 'description' to name the repository.
git clone https://codeberg.org/emmett1/mkinitrd
Log | Files | Refs

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