make-initrd.bash (1889B)
1 #!/bin/bash 2 # Copyright 2017-2018 Haelwenn (lanodan) Monnier <contact@hacktivis.me> 3 # Distributed under the terms of the ISC license 4 5 kv=${1:-$(uname -r)} 6 arc=$(getconf LONG_BIT) 7 out_base=initramfs-${kv} 8 elves="lvm busybox blkid lsblk cryptsetup mksh zfs zpool" 9 WORKDIR="$(pwd)" 10 11 function docp() { 12 local link=${1} prefix 13 [[ -n ${link} ]] || return 14 cp -a {,.}${link} 15 16 [[ -h ${link} ]] && 17 while true; do 18 prefix=${link%/*} 19 link=$(readlink ${link}) 20 [[ ${link%/*} == ${link} ]] && link=${prefix}/${link} 21 cp -a {,.}${link} || die 22 [[ -h ${link} ]] || break 23 done 24 25 return 0 26 } 27 28 test -e $out_base && rm -fr $out_base 29 mkdir -p $out_base && pushd $out_base 30 mkdir -p {usr/,}{bin,lib$arc} dev proc sys newroot etc 31 ln -s lib{$arc,} 32 ln -s /proc/mounts etc/mtab 33 pushd usr && ln -s lib{$arc,} && popd 34 35 mkdir -p lib/modules ; cp -pr /lib/modules/$kv lib/modules 36 37 mknod -m 600 dev/console c 5 1 38 mknod -m 666 dev/urandom c 1 9 39 mknod -m 666 dev/random c 1 8 40 mknod -m 640 dev/mem c 1 1 41 mknod -m 666 dev/null c 1 3 42 mknod -m 666 dev/tty c 5 0 43 mknod -m 666 dev/zero c 1 5 44 mknod -m 640 dev/tty1 c 4 1 45 46 [[ $(echo "$kv" | cut -d'.' -f1 ) -eq 3 ]] && 47 [[ $(echo "$kv" | cut -d'.' -f2) -ge 1 ]] && 48 mknod -m 600 /dev/loop-control c 10 237 49 50 for i in $elves; do 51 cp $(which $i) bin 52 done 53 54 cp "${WORKDIR}/init" . && chmod 755 init || exit 55 ln bin/mksh bin/sh 56 bin/busybox --install usr/bin 57 58 for bin in $(find bin); do 59 ldd $bin >/dev/null || continue 60 for lib in $(ldd $bin | sed -nre 's,.* (/.*lib.*/.*.so.*) .*,\1,p' \ 61 -e 's,.*(/lib.*/ld.*.so.*) .*,\1,p') 62 do 63 mkdir -p ${lib%/*} && docp {,.}$lib 64 done 65 done 66 67 if find . -print0 | cpio --null -ov --format=newc | xz -9 --check=crc32 > ../${out_base}.cpio.xz; then 68 test -e /boot/${out_base}.cpio.xz && mv /boot/${out_base}.cpio.xz /boot/${out_base}.cpio.xz.old 69 cp ../${out_base}.cpio.xz /boot 70 fi 71 72 popd 73 74 unset -v arc kv out_base elves