logo

make-initrd

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

make-initrd.sh (1628B)


  1. #!/bin/sh
  2. # Copyright 2017-2022 Haelwenn (lanodan) Monnier <contact@hacktivis.me>
  3. # SPDX-License-Identifier: ISC
  4. out_base=initramfs-all
  5. elves="busybox blkid lsblk cryptsetup mksh zfs zpool"
  6. WORKDIR="$(pwd)"
  7. die() {
  8. echo "[Error] die: ${*}"
  9. exit 1
  10. }
  11. if test -e "$out_base"; then
  12. rm -fr "$out_base" || die "Failed: rm -fr $out_base"
  13. fi
  14. mkdir -p "$out_base" || die "Failed: mkdir $out_base"
  15. cd "$out_base" || die "Failed: cd $out_base"
  16. mkdir -p bin lib dev proc sys newroot etc || die "Failed creating base directories"
  17. ln -s /proc/mounts etc/mtab || die "Failed symlink for /etc/mtab"
  18. ln -s . usr
  19. ln -s lib lib64
  20. ln -s lib lib32
  21. if test -d "/lib/modules"
  22. then
  23. cp -pr "/lib/modules" lib || die "Failed copying kernel modules"
  24. else
  25. echo "[Warning] '/lib/modules' doesn’t exist"
  26. fi
  27. mknod -m 660 dev/console c 5 1
  28. mknod -m 666 dev/urandom c 1 9
  29. mknod -m 666 dev/random c 1 8
  30. #mknod -m 640 dev/mem c 1 1
  31. mknod -m 666 dev/null c 1 3
  32. mknod -m 666 dev/tty c 5 0
  33. mknod -m 666 dev/zero c 1 5
  34. mknod -m 620 dev/tty1 c 4 1
  35. for elf in $elves; do
  36. origin=$(command -v "$elf")
  37. cp "$origin" bin/ || die
  38. done
  39. cp "${WORKDIR}/init" . || die "copying init"
  40. chmod 755 init || die "init chmod"
  41. ln bin/mksh bin/sh || die "default shell link"
  42. for lib in $(find bin -type f -exec lddtree -l {} + | grep -v bin/ | sort | uniq); do
  43. cp "$lib" lib/ || die
  44. done
  45. if find . -print0 | cpio --null -ov --format=newc | xz -9 --check=crc32 > "../${out_base}.cpio.xz"; then
  46. test -e "/boot/${out_base}.cpio.xz" && mv "/boot/${out_base}.cpio.xz" "/boot/${out_base}.cpio.xz.old"
  47. cp "../${out_base}.cpio.xz" /boot
  48. fi
  49. cd "${WORKDIR}"