build-root-filesystem.sh 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #!/bin/sh
  2. set -e
  3. wheel_gid=1
  4. phys_gid=3
  5. utmp_gid=5
  6. window_uid=13
  7. window_gid=13
  8. CP="cp"
  9. # cp on macOS and BSD systems do not support the -d option.
  10. # gcp comes with coreutils, which is already a dependency.
  11. OS="$(uname -s)"
  12. if [ "$OS" = "Darwin" ] || echo "$OS" | grep -qe 'BSD$'; then
  13. CP="gcp"
  14. fi
  15. die() {
  16. echo "die: $*"
  17. exit 1
  18. }
  19. if [ "$(id -u)" != 0 ]; then
  20. die "this script needs to run as root"
  21. fi
  22. [ -z "$SERENITY_SOURCE_DIR" ] && die "SERENITY_SOURCE_DIR is not set"
  23. [ -d "$SERENITY_SOURCE_DIR/Base" ] || die "$SERENITY_SOURCE_DIR/Base doesn't exist"
  24. umask 0022
  25. printf "installing base system... "
  26. if ! command -v rsync >/dev/null; then
  27. die "Please install rsync."
  28. fi
  29. if rsync --chown 2>&1 | grep "missing argument" >/dev/null; then
  30. rsync -aH --chown=0:0 --inplace "$SERENITY_SOURCE_DIR"/Base/ mnt/
  31. rsync -aH --chown=0:0 --inplace Root/ mnt/
  32. else
  33. rsync -aH --inplace "$SERENITY_SOURCE_DIR"/Base/ mnt/
  34. rsync -aH --inplace Root/ mnt/
  35. chown -R 0:0 mnt/
  36. fi
  37. SERENITY_ARCH="${SERENITY_ARCH:-i686}"
  38. LLVM_VERSION="${LLVM_VERSION:-13.0.0}"
  39. if [ "$SERENITY_TOOLCHAIN" = "Clang" ]; then
  40. TOOLCHAIN_DIR="$SERENITY_SOURCE_DIR"/Toolchain/Local/clang/
  41. $CP "$TOOLCHAIN_DIR"/lib/"$SERENITY_ARCH"-pc-serenity/* mnt/usr/lib
  42. mkdir -p mnt/usr/include/"$SERENITY_ARCH"-pc-serenity
  43. $CP -r "$TOOLCHAIN_DIR"/include/c++ mnt/usr/include
  44. $CP -r "$TOOLCHAIN_DIR"/include/"$SERENITY_ARCH"-pc-serenity/c++ mnt/usr/include/"$SERENITY_ARCH"-pc-serenity
  45. elif [ "$SERENITY_ARCH" != "aarch64" ]; then
  46. $CP "$SERENITY_SOURCE_DIR"/Toolchain/Local/"$SERENITY_ARCH"/"$SERENITY_ARCH"-pc-serenity/lib/libgcc_s.so mnt/usr/lib
  47. $CP "$SERENITY_SOURCE_DIR"/Toolchain/Local/"$SERENITY_ARCH"/"$SERENITY_ARCH"-pc-serenity/lib/libstdc++.a mnt/usr/lib
  48. $CP -r "$SERENITY_SOURCE_DIR"/Toolchain/Local/"$SERENITY_ARCH"/"$SERENITY_ARCH"-pc-serenity/include/c++ mnt/usr/include
  49. fi
  50. # If umask was 027 or similar when the repo was cloned,
  51. # file permissions in Base/ are too restrictive. Restore
  52. # the permissions needed in the image.
  53. chmod -R g+rX,o+rX "$SERENITY_SOURCE_DIR"/Base/* mnt/
  54. chmod 660 mnt/etc/WindowServer.ini
  55. chown $window_uid:$window_gid mnt/etc/WindowServer.ini
  56. echo "/bin/sh" > mnt/etc/shells
  57. if [ -f mnt/bin/su ]; then
  58. chown 0:$wheel_gid mnt/bin/su
  59. chmod 4750 mnt/bin/su
  60. fi
  61. if [ -f mnt/bin/passwd ]; then
  62. chown 0:$wheel_gid mnt/bin/passwd
  63. chmod 4755 mnt/bin/passwd
  64. fi
  65. if [ -f mnt/bin/ping ]; then
  66. chown 0:$wheel_gid mnt/bin/ping
  67. chmod 4755 mnt/bin/ping
  68. fi
  69. if [ -f mnt/bin/traceroute ]; then
  70. chown 0:$wheel_gid mnt/bin/traceroute
  71. chmod 4755 mnt/bin/traceroute
  72. fi
  73. if [ -f mnt/bin/keymap ]; then
  74. chown 0:$phys_gid mnt/bin/keymap
  75. chmod 4750 mnt/bin/keymap
  76. fi
  77. if [ -f mnt/bin/shutdown ]; then
  78. chown 0:$phys_gid mnt/bin/shutdown
  79. chmod 4750 mnt/bin/shutdown
  80. fi
  81. if [ -f mnt/bin/reboot ]; then
  82. chown 0:$phys_gid mnt/bin/reboot
  83. chmod 4750 mnt/bin/reboot
  84. fi
  85. if [ -f mnt/bin/pls ]; then
  86. chown 0:$wheel_gid mnt/bin/pls
  87. chmod 4750 mnt/bin/pls
  88. fi
  89. if [ -f mnt/bin/utmpupdate ]; then
  90. chown 0:$utmp_gid mnt/bin/utmpupdate
  91. chmod 2755 mnt/bin/utmpupdate
  92. fi
  93. if [ -f mnt/usr/Tests/Kernel/TestMemoryDeviceMmap ]; then
  94. chown 0:0 mnt/usr/Tests/Kernel/TestMemoryDeviceMmap
  95. chmod 4755 mnt/usr/Tests/Kernel/TestMemoryDeviceMmap
  96. fi
  97. if [ -f mnt/usr/Tests/Kernel/TestProcFSWrite ]; then
  98. chown 0:0 mnt/usr/Tests/Kernel/TestProcFSWrite
  99. chmod 4755 mnt/usr/Tests/Kernel/TestProcFSWrite
  100. fi
  101. chmod 0400 mnt/res/kernel.map
  102. chmod 0400 mnt/boot/Kernel
  103. chmod 0400 mnt/boot/Kernel.debug
  104. chmod 600 mnt/etc/shadow
  105. chmod 755 mnt/res/devel/templates/*.postcreate
  106. echo "done"
  107. printf "creating initial filesystem structure... "
  108. for dir in bin etc proc mnt tmp boot mod var/run; do
  109. mkdir -p mnt/$dir
  110. done
  111. chmod 700 mnt/boot
  112. chmod 700 mnt/mod
  113. chmod 1777 mnt/tmp
  114. echo "done"
  115. printf "creating utmp file... "
  116. touch mnt/var/run/utmp
  117. chown 0:$utmp_gid mnt/var/run/utmp
  118. chmod 664 mnt/var/run/utmp
  119. echo "done"
  120. printf "setting up device nodes folder... "
  121. mkdir -p mnt/dev
  122. echo "done"
  123. printf "setting up sysfs folder... "
  124. mkdir -p mnt/sys
  125. echo "done"
  126. printf "writing version file... "
  127. GIT_HASH=$( (git log --pretty=format:'%h' -n 1 | cut -c1-7) || true )
  128. printf "[Version]\nMajor=1\nMinor=0\nGit=%s\n" "$GIT_HASH" > mnt/res/version.ini
  129. echo "done"
  130. printf "installing users... "
  131. mkdir -p mnt/root
  132. mkdir -p mnt/home/anon
  133. mkdir -p mnt/home/anon/Desktop
  134. mkdir -p mnt/home/anon/Downloads
  135. mkdir -p mnt/home/nona
  136. rm -fr mnt/home/anon/js-tests mnt/home/anon/web-tests mnt/home/anon/cpp-tests mnt/home/anon/wasm-tests
  137. mkdir -p mnt/home/anon/cpp-tests/
  138. cp "$SERENITY_SOURCE_DIR"/README.md mnt/home/anon/
  139. cp -r "$SERENITY_SOURCE_DIR"/Userland/Libraries/LibJS/Tests mnt/home/anon/js-tests
  140. cp -r "$SERENITY_SOURCE_DIR"/Userland/Libraries/LibWeb/Tests mnt/home/anon/web-tests
  141. cp -r "$SERENITY_SOURCE_DIR"/Userland/DevTools/HackStudio/LanguageServers/Cpp/Tests mnt/home/anon/cpp-tests/comprehension
  142. cp -r "$SERENITY_SOURCE_DIR"/Userland/Libraries/LibCpp/Tests/parser mnt/home/anon/cpp-tests/parser
  143. cp -r "$SERENITY_SOURCE_DIR"/Userland/Libraries/LibCpp/Tests/preprocessor mnt/home/anon/cpp-tests/preprocessor
  144. cp -r "$SERENITY_SOURCE_DIR"/Userland/Libraries/LibWasm/Tests mnt/home/anon/wasm-tests
  145. cp -r "$SERENITY_SOURCE_DIR"/Userland/Libraries/LibJS/Tests/test-common.js mnt/home/anon/wasm-tests
  146. if [ -n "$SERENITY_COPY_SOURCE" ] ; then
  147. printf "\ncopying Serenity's source... "
  148. rm -fr mnt/home/anon/Source/serenity
  149. mkdir -p mnt/home/anon/Source/serenity
  150. git clone --depth=1 file://"$SERENITY_SOURCE_DIR" mnt/home/anon/Source/serenity
  151. rm -fr mnt/home/anon/Source/serenity/.git
  152. fi
  153. chmod 700 mnt/root
  154. chmod 700 mnt/home/anon
  155. chmod 700 mnt/home/nona
  156. chown -R 100:100 mnt/home/anon
  157. chown -R 200:200 mnt/home/nona
  158. echo "done"
  159. printf "adding some desktop icons... "
  160. ln -sf /bin/Browser mnt/home/anon/Desktop/
  161. ln -sf /bin/TextEditor mnt/home/anon/Desktop/Text\ Editor
  162. ln -sf /bin/Help mnt/home/anon/Desktop/
  163. ln -sf /home/anon mnt/home/anon/Desktop/Home
  164. chown -R 100:100 mnt/home/anon/Desktop
  165. echo "done"
  166. printf "installing shortcuts... "
  167. ln -sf Shell mnt/bin/sh
  168. ln -sf test mnt/bin/[
  169. echo "done"
  170. printf "installing 'checksum' variants... "
  171. ln -sf checksum mnt/bin/md5sum
  172. ln -sf checksum mnt/bin/sha1sum
  173. ln -sf checksum mnt/bin/sha256sum
  174. ln -sf checksum mnt/bin/sha512sum
  175. echo "done"
  176. # Run local sync script, if it exists
  177. if [ -f "${SERENITY_SOURCE_DIR}/sync-local.sh" ]; then
  178. sh "${SERENITY_SOURCE_DIR}/sync-local.sh"
  179. fi