logo

bootstrap-initrd

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

init.sh (4857B)


  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 || die
  107. pdpmake selfcheck || die
  108. pdpmake install || die
  109. pdpmake clean || die
  110. export PATH="$oldpath"
  111. }
  112. build_sbase() {
  113. cd /src/sbase-*/
  114. for i in ed sed
  115. do
  116. $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
  117. done
  118. }
  119. build_oyacc() {
  120. cd /src/yacc-oyacc-*/
  121. # config.h wrote in make-root.sh due to lack of cat
  122. $CC $CFLAGS \
  123. -D_GNU_SOURCE -D__unused= \
  124. -o /bin/yacc *.c
  125. }
  126. export CC=tcc
  127. export CFLAGS="-Os -Wall -Wextra"
  128. build_oyacc
  129. export SHELL="/bin/oksh"
  130. export YACC="yacc"
  131. build_pdpmake || die
  132. build_sbase || die
  133. # stubs for utilities currently missing from utils-std
  134. build_stubs || die
  135. build_hierloom_devtools_m4 || die
  136. build_utils_std || die
  137. export MAKEFLAGS="-j$(nproc)"
  138. profile_export PATH="/bin:/usr/bin:/usr/local/bin"
  139. profile_export YACC="yacc"
  140. profile_export STRIP="true"
  141. profile_export INSTALL="install"
  142. profile_export AR="ar"
  143. # re-export due to prior lack of echo
  144. profile_export CC="$CC"
  145. profile_export CFLAGS="$CFLAGS"
  146. # needs: make cat $CC $YACC rm mv $AR true test install mkdir
  147. build_hierloom_devtools </dev/null || die
  148. cat >/bin/hostname <<'EOF'
  149. #!/bin/sh
  150. exec uname -n
  151. EOF
  152. chmod +x /bin/hostname
  153. build_stubs_symlinks || die
  154. build_awk || die
  155. build_hierloom || die
  156. build_bzip2 || die
  157. # Needs /bin/rm
  158. build_zlib_libs </dev/null || die
  159. build_pigz || die
  160. test -f /cacert-*.pem && {
  161. mkdir -p /usr/share/cacert/ || die
  162. mv /cacert-*.pem /usr/share/cacert/cert.pem || die
  163. mkdir -p /etc/ssl || die
  164. ln -s /usr/share/cacert/cert.pem /etc/ssl/cert.pem || die
  165. }
  166. mkdir -p $HOME
  167. cd
  168. if [ "$(date +%Y)" = 1970 ]; then
  169. /etc/setdate.sh
  170. fi
  171. # No /dev/tty1, no getty (as seen in containers)
  172. if ! test -e /dev/tty1
  173. then
  174. times
  175. echo 'Done bootstrapping! Dropping into a shell'
  176. exec /bin/sh -l
  177. fi
  178. cat /proc/uptime
  179. echo 'Done bootstrapping! Dropping into a TTY'
  180. if ! grep -q console= /proc/cmdline
  181. then
  182. getty "/dev/tty1" /bin/sh -l &
  183. else
  184. for arg in $(cat /proc/cmdline); do
  185. case $arg in
  186. console=*)
  187. target=${arg#console=}
  188. device=${target%,*}
  189. # baud=${target#*,}
  190. getty "/dev/${device}" /bin/sh -l &
  191. ;;
  192. esac
  193. done
  194. fi
  195. wait