logo

bootstrap-initrd

Linux initrd to bootstrap from a small binary seed git clone https://anongit.hacktivis.me/git/bootstrap-initrd.git/

init.sh (4900B)


  1. #!/bin/oksh
  2. # bootstrap-initrd: Linux initrd to bootstrap from a small binary seed
  3. # SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
  4. # SPDX-License-Identifier: MPL-2.0
  5. set -ex -o pipefail
  6. die() {
  7. echo "die: $*"
  8. rescueshell
  9. }
  10. rescueshell() {
  11. exec $SHELL -l
  12. }
  13. profile_export() {
  14. export "$@"
  15. echo "export '$@'" >>/etc/profile
  16. }
  17. build_awk() {
  18. cd /src/awk-*/
  19. yacc -d -b awkgram awkgram.y
  20. pdpmake -e HOSTCC=$CC
  21. cp -p a.out /bin/awk
  22. }
  23. build_stubs() {
  24. for i in ls grep cp getty mount reboot
  25. do
  26. $CC $CFLAGS -o "/bin/$i" "/src/${i}-stub.c" || die "Failed compiling $i stub"
  27. done
  28. }
  29. build_stubs_symlinks() {
  30. ln -s grep /bin/egrep || die
  31. ln -s grep /bin/fgrep || die
  32. ln -s cat /bin/sort || die
  33. }
  34. build_pdpmake() {
  35. cd /src/pdpmake-*/
  36. $CC $CFLAGS -o /bin/pdpmake *.c
  37. }
  38. build_bzip2() {
  39. cd /src/bzip2-*/
  40. pdpmake -f Makefile-libbz2_so CC=$CC || die
  41. ln -s libbz2.so.1.0.8 libbz2.so
  42. pdpmake -f Makefile bzip2 CC=$CC || die
  43. ln libbz2.so.1.0.8 /lib/libbz2.so.1.0.8
  44. ln -s libbz2.so.1.0.8 /lib/libbz2.so
  45. ln -s libbz2.so.1.0.8 /lib/libbz2.so.1.0
  46. ln bzip2 /bin/bzip2
  47. ln -s bzip2 /bin/bunzip2
  48. ln -s bzip2 /bin/bzcat
  49. pdpmake clean
  50. }
  51. build_zlib_libs() {
  52. cd /src/zlib-*/
  53. ./configure --prefix=/usr </dev/null
  54. # generate crc32.h
  55. pdpmake crc32 CFLAGS="${CFLAGS} -DMAKECRCH"
  56. ./crc32
  57. pdpmake check
  58. pdpmake install
  59. pdpmake clean
  60. }
  61. build_pigz() {
  62. cd /src/pigz-*/
  63. # Makefile placeholders for zopfli/deflate.h and zopfli/util.h
  64. touch deflate.h util.h
  65. pdpmake CC=$CC ZOP= ZOPFLI= CFLAGS="${CFLAGS} -DNOZOPFLI"
  66. cp -p pigz /bin
  67. ln -s pigz /bin/unpigz
  68. ln -s pigz /bin/gzip
  69. ln -s pigz /bin/ungzip
  70. pdpmake clean
  71. }
  72. build_hierloom_devtools_m4() {
  73. cd /src/heirloom-devtools-*/m4/
  74. $YACC -o m4y.c m4y.y
  75. $CC $CFLAGS -D_GNU_SOURCE m4.c m4ext.c m4macs.c m4y.c version.c -o /bin/m4
  76. }
  77. build_hierloom_devtools() {
  78. cd /src/heirloom-devtools-*/
  79. for cmd in lex
  80. do
  81. pdpmake "$cmd"/Makefile
  82. pdpmake -C "$cmd" RANLIB=true
  83. pdpmake -C "$cmd" RANLIB=true install
  84. pdpmake -C "$cmd" RANLIB=true clean
  85. done
  86. }
  87. build_hierloom() {
  88. cd /src/heirloom/
  89. mkdir -p /usr/5bin /usr/5lib /etc/default /usr/5bin/s42 /usr/5bin/posix2001 /usr/ucb/
  90. for cmd in libcommon diff tar sort comm find stty
  91. do
  92. pdpmake "$cmd"/Makefile
  93. pdpmake -C "$cmd" CC=$CC AR="ar" RANLIB=true
  94. pdpmake -C "$cmd" CC=$CC AR="ar" RANLIB=true install
  95. pdpmake -C "$cmd" CC=$CC AR="ar" RANLIB=true clean
  96. done
  97. ln -fs /usr/5bin/sort /bin/sort
  98. mv /usr/5bin/find /usr/bin/find
  99. }
  100. build_utils_std() {
  101. cd /src/utils-std-*/
  102. oldpath="$PATH"
  103. export PATH="$PATH:$PWD/cmd/"
  104. pdpmake -f bootstrap.mk || die
  105. MAKE=pdpmake oksh ./configure PREFIX=/usr || die
  106. pdpmake cmd/mkdir || die
  107. pdpmake all || die
  108. pdpmake selfcheck
  109. pdpmake install || die
  110. pdpmake clean || die
  111. export PATH="$oldpath"
  112. }
  113. build_sbase() {
  114. cd /src/sbase-*/
  115. for i in ed sed
  116. do
  117. $CC -D_DEFAULT_SOURCE -D_NETBSD_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_FILE_OFFSET_BITS=64 -Os -o "/bin/${i}" "${i}.c" libutil/*.c libutf/*.c
  118. done
  119. }
  120. build_oyacc() {
  121. cd /src/yacc-oyacc-*/
  122. # config.h wrote in make-root.sh due to lack of cat
  123. $CC $CFLAGS \
  124. -D_GNU_SOURCE -D__unused= \
  125. -o /bin/yacc *.c
  126. }
  127. export CC=tcc
  128. export CFLAGS="-Os -Wall -Wextra"
  129. build_oyacc
  130. export SHELL="/bin/oksh"
  131. export YACC="yacc"
  132. build_pdpmake || die
  133. build_sbase || die
  134. # stubs for utilities currently missing from utils-std
  135. build_stubs || die
  136. build_hierloom_devtools_m4 || die
  137. build_utils_std || die
  138. export MAKEFLAGS="-j$(nproc)"
  139. profile_export PATH="/bin:/usr/bin:/usr/local/bin"
  140. profile_export YACC="yacc"
  141. profile_export STRIP="true"
  142. profile_export INSTALL="install"
  143. profile_export AR="ar"
  144. # re-export due to prior lack of echo
  145. profile_export CC="$CC"
  146. profile_export CFLAGS="$CFLAGS"
  147. # needs: make cat $CC $YACC rm mv $AR true test install mkdir
  148. build_hierloom_devtools </dev/null || die
  149. cat >/bin/hostname <<'EOF'
  150. #!/bin/sh
  151. exec uname -n
  152. EOF
  153. chmod +x /bin/hostname
  154. build_stubs_symlinks || die
  155. build_awk || die
  156. build_hierloom || die
  157. build_bzip2 || die
  158. # Needs /bin/rm
  159. build_zlib_libs </dev/null || die
  160. build_pigz || die
  161. test -f /distfiles/cacert-*.pem && {
  162. mkdir -p /usr/share/cacert/ || die
  163. mv /distfiles/cacert-*.pem /usr/share/cacert/cert.pem || die
  164. mkdir -p /etc/ssl || die
  165. ln -s /usr/share/cacert/cert.pem /etc/ssl/cert.pem || die
  166. }
  167. mkdir -p $HOME
  168. cd
  169. if [ "$(date +%Y)" = 1970 ]; then
  170. /etc/setdate.sh
  171. fi
  172. # No /dev/tty1, no getty (as seen in containers)
  173. if ! test -e /dev/tty1
  174. then
  175. times
  176. echo 'Done bootstrapping! Dropping into a shell'
  177. exec /bin/sh -l
  178. fi
  179. cat /proc/uptime
  180. echo 'Done bootstrapping! Dropping into a TTY'
  181. if ! grep -q console= /proc/cmdline
  182. then
  183. getty "/dev/tty1" /bin/sh -l &
  184. else
  185. for arg in $(cat /proc/cmdline); do
  186. case $arg in
  187. console=*)
  188. target=${arg#console=}
  189. device=${target%,*}
  190. # baud=${target#*,}
  191. getty "/dev/${device}" /bin/sh -l &
  192. ;;
  193. esac
  194. done
  195. fi
  196. wait