buildInitramFs.sh 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #!/bin/bash
  2. set -x
  3. set -e
  4. #Build initramfs image
  5. # This file is part of PrawnOS (https://www.prawnos.com)
  6. # Copyright (c) 2018 Hal Emmerich <hal@halemmerich.com>
  7. # PrawnOS is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License version 2
  9. # as published by the Free Software Foundation.
  10. # PrawnOS is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. # You should have received a copy of the GNU General Public License
  15. # along with PrawnOS. If not, see <https://www.gnu.org/licenses/>.
  16. if [ -z "$1" ]
  17. then
  18. echo "No base file system image supplied"
  19. exit 1
  20. fi
  21. if [ -z "$2" ]
  22. then
  23. echo "No initramfs resources dir supplied"
  24. exit 1
  25. fi
  26. if [ -z "$3" ]
  27. then
  28. echo "No output location supplied"
  29. exit 1
  30. fi
  31. BASE=$1
  32. RESOURCES=$2
  33. OUT_DIR=$3
  34. outmnt=$(mktemp -d -p "$(pwd)")
  35. outdev=/dev/loop7
  36. if [ ! -f $BASE ]
  37. then
  38. echo "No base filesystem, run 'make filesystem' first"
  39. exit 1
  40. fi
  41. #A hacky way to ensure the loops are properly unmounted and the temp files are properly deleted.
  42. #Without this, a reboot is sometimes required to properly clean the loop devices and ensure a clean build
  43. cleanup() {
  44. set +e
  45. umount -l $outmnt > /dev/null 2>&1
  46. rmdir $outmnt > /dev/null 2>&1
  47. losetup -d $outdev > /dev/null 2>&1
  48. set +e
  49. umount -l $outmnt > /dev/null 2>&1
  50. rmdir $outmnt > /dev/null 2>&1
  51. losetup -d $outdev > /dev/null 2>&1
  52. }
  53. trap cleanup INT TERM EXIT
  54. [ ! -d build ] && mkdir build
  55. losetup -P $outdev $$BASE
  56. #mount the root filesystem
  57. mount -o noatime ${outdev}p2 $outmnt
  58. #make a skeleton filesystem
  59. initramfs_src=$outmnt/InstallResources/initramfs_src
  60. rm -rf $initramfs_src*
  61. mkdir -p $initramfs_src
  62. mkdir $initramfs_src/bin
  63. mkdir $initramfs_src/dev
  64. mkdir $initramfs_src/etc
  65. mkdir $initramfs_src/newroot
  66. mkdir $initramfs_src/boot
  67. mkdir $initramfs_src/proc
  68. mkdir $initramfs_src/sys
  69. mkdir $initramfs_src/sbin
  70. mkdir $initramfs_src/run
  71. mkdir $initramfs_src/run/cryptsetup
  72. mkdir $initramfs_src/lib
  73. mkdir $initramfs_src/lib/arm-linux-gnueabihf
  74. mknod -m 622 $initramfs_src/dev/console c 5 1
  75. mknod -m 622 $initramfs_src/dev/tty c 4 0
  76. #install the few tools we need, and the supporting libs
  77. cp $outmnt/bin/busybox $outmnt/sbin/cryptsetup $initramfs_src/bin/
  78. cp $outmnt/lib/arm-linux-gnueabihf/libblkid.so.1 $initramfs_src/lib/arm-linux-gnueabihf/
  79. cp $outmnt/lib/arm-linux-gnueabihf/libuuid.so.1 $initramfs_src/lib/arm-linux-gnueabihf/
  80. cp $outmnt/lib/arm-linux-gnueabihf/libc.so.6 $initramfs_src/lib/arm-linux-gnueabihf/
  81. cp $outmnt/lib/ld-linux-armhf.so.3 $initramfs_src/lib/
  82. cp $outmnt/sbin/blkid $initramfs_src/bin/
  83. cp $outmnt/usr/lib/arm-linux-gnueabihf/libpopt.so.0 $initramfs_src/lib/arm-linux-gnueabihf/libpopt.so.0
  84. cp $outmnt/usr/lib/arm-linux-gnueabihf/libssl.so.1.1 $initramfs_src/lib/arm-linux-gnueabihf/libssl.so.1.1
  85. cp $outmnt/usr/lib/arm-linux-gnueabihf/libcrypto.so.1.1 $initramfs_src/lib/arm-linux-gnueabihf/libcrypto.so.1.1
  86. cp $outmnt/usr/lib/arm-linux-gnueabihf/libargon2.so.1 $initramfs_src/lib/arm-linux-gnueabihf/libargon2.so.1
  87. cp $outmnt/usr/lib/arm-linux-gnueabihf/libjson-c.so.3 $initramfs_src/lib/arm-linux-gnueabihf/libjson-c.so.3
  88. cp $outmnt/lib/arm-linux-gnueabihf/libm.so.6 $initramfs_src/lib/arm-linux-gnueabihf/libm.so.6
  89. cp $outmnt/lib/arm-linux-gnueabihf/libcryptsetup.so.12 $initramfs_src/lib/arm-linux-gnueabihf/libcryptsetup.so.12
  90. cp $outmnt/lib/arm-linux-gnueabihf/libuuid.so.1 $initramfs_src/lib/arm-linux-gnueabihf/libuuid.so.1
  91. cp $outmnt/lib/arm-linux-gnueabihf/libblkid.so.1 $initramfs_src/lib/arm-linux-gnueabihf/libblkid.so.1
  92. cp $outmnt/lib/arm-linux-gnueabihf/libc.so.6 $initramfs_src/lib/arm-linux-gnueabihf/libc.so.6
  93. cp $outmnt/lib/ld-linux-armhf.so.3 $initramfs_src/lib/ld-linux-armhf.so.3
  94. cp $outmnt/lib/arm-linux-gnueabihf/libdevmapper.so.1.02.1 $initramfs_src/lib/arm-linux-gnueabihf/libdevmapper.so.1.02.1
  95. cp $outmnt/lib/arm-linux-gnueabihf/librt.so.1 $initramfs_src/lib/arm-linux-gnueabihf/librt.so.1
  96. cp $outmnt/lib/arm-linux-gnueabihf/libdl.so.2 $initramfs_src/lib/arm-linux-gnueabihf/libdl.so.2
  97. cp $outmnt/lib/arm-linux-gnueabihf/libselinux.so.1 $initramfs_src/lib/arm-linux-gnueabihf/libselinux.so.1
  98. cp $outmnt/lib/arm-linux-gnueabihf/libudev.so.1 $initramfs_src/lib/arm-linux-gnueabihf/libudev.so.1
  99. cp $outmnt/lib/arm-linux-gnueabihf/libpthread.so.0 $initramfs_src/lib/arm-linux-gnueabihf/libpthread.so.0
  100. cp $outmnt/lib/arm-linux-gnueabihf/libpcre.so.3 $initramfs_src/lib/arm-linux-gnueabihf/libpcre.so.3
  101. cp $outmnt/lib/arm-linux-gnueabihf/libgcc_s.so.1 $initramfs_src/lib/arm-linux-gnueabihf/libgcc_s.so.1
  102. #add the init script
  103. cp $RESOURCES/initramfs-init $initramfs_src/init
  104. chmod +x $initramfs_src/init
  105. cp $initramfs_src/init $initramfs_src/sbin/init
  106. #compress and install
  107. rm -rf $outmnt/boot/PrawnOS-initramfs.cpio.gz
  108. cd $initramfs_src
  109. ln -s busybox bin/cat
  110. ln -s busybox bin/mount
  111. ln -s busybox bin/sh
  112. ln -s busybox bin/switch_root
  113. ln -s busybox bin/umount
  114. # store for kernel building
  115. find . -print0 | cpio --null --create --verbose --format=newc | gzip --best > $OUT_DIR/PrawnOS-initramfs.cpio.gz