logo

make-initrd

Unnamed repository; edit this file 'description' to name the repository. git clone https://anongit.hacktivis.me/git/make-initrd.git/

make-initrd.sh (1934B)


  1. #!/bin/sh
  2. # Copyright 2017 Haelwenn (lanodan) Monnier <contact+make-initrd@hacktivis.me>
  3. # SPDX-License-Identifier: ISC
  4. elves="busybox cryptsetup mksh zfs zpool"
  5. modules="zfs"
  6. WORKDIR="$(pwd)"
  7. set -o pipefail
  8. die() {
  9. echo "[Error] die: ${*}"
  10. exit 1
  11. }
  12. [ -n "$1" ] || die "make-initrd takes kernel version as argument"
  13. kver="$1"
  14. out_base="initramfs-${kver}"
  15. if test -e "$out_base"; then
  16. rm -fr "$out_base" || die "Failed: rm -fr $out_base"
  17. fi
  18. mkdir -p "$out_base" || die "Failed: mkdir $out_base"
  19. cd "$out_base" || die "Failed: cd $out_base"
  20. mkdir -p bin dev proc sys newroot etc || die "Failed creating base directories"
  21. ln -s /proc/mounts etc/mtab || die "Failed symlink for /etc/mtab"
  22. ln -s . usr
  23. ln -s lib lib64
  24. ln -s lib lib32
  25. mknod -m 660 dev/console c 5 1
  26. mknod -m 666 dev/urandom c 1 9
  27. mknod -m 666 dev/random c 1 8
  28. #mknod -m 640 dev/mem c 1 1
  29. mknod -m 666 dev/null c 1 3
  30. mknod -m 666 dev/tty c 5 0
  31. mknod -m 666 dev/zero c 1 5
  32. mknod -m 620 dev/tty1 c 4 1
  33. for elf in $elves; do
  34. origin=$(command -v "$elf")
  35. cp "$origin" bin/ || die
  36. done
  37. for mod in $modules; do
  38. modprobe -S "$kver" --show-depends "$mod" | tee -a ./load_modules.sh | while read -r cmd file params; do
  39. mkdir -p "$(dirname ./"$file")" || die
  40. cp -p "$file" ./"$file" || die
  41. done
  42. done
  43. test -f ./load_modules.sh && chmod +x ./load_modules.sh
  44. if [ -f /root/initrd-keyfile ]; then
  45. cp /root/initrd-keyfile ./keyfile || die "copying keyfile"
  46. fi
  47. cp "${WORKDIR}/init" . || die "copying init"
  48. chmod 755 init || die "init chmod"
  49. ln bin/mksh bin/sh || die "default shell link"
  50. for lib in $(find bin -type f -exec lddtree -l {} + | grep -v bin/ | sort | uniq); do
  51. cp "$lib" lib/ || die
  52. done
  53. if find . -print0 | cpio --null -ov --format=newc | xz -9 --check=crc32 > "../${out_base}.img"; then
  54. test -e "/boot/${out_base}.img" && mv "/boot/${out_base}.img" "/boot/${out_base}.img.old"
  55. cp "../${out_base}.img" /boot
  56. fi
  57. cd "${WORKDIR}"