linux-image.sh 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. #!/usr/bin/env bash
  2. set -x
  3. set -euo pipefail
  4. # shellcheck disable=SC1091
  5. . lib.sh
  6. main() {
  7. # arch in the rust target
  8. local arch="${1}" \
  9. kversion=4.19.0-20
  10. local debsource="deb http://http.debian.net/debian/ buster main"
  11. debsource="${debsource}\ndeb http://security.debian.org/ buster/updates main"
  12. local dropbear="dropbear-bin"
  13. local -a deps
  14. local kernel=
  15. local libgcc="libgcc1"
  16. # select debian arch and kernel version
  17. case "${arch}" in
  18. aarch64)
  19. arch=arm64
  20. kernel="${kversion}-arm64"
  21. ;;
  22. armv7)
  23. arch=armhf
  24. kernel="${kversion}-armmp"
  25. ;;
  26. i686)
  27. arch=i386
  28. kernel="${kversion}-686"
  29. ;;
  30. mips|mipsel)
  31. kernel="${kversion}-4kc-malta"
  32. ;;
  33. mips64el)
  34. kernel="${kversion}-5kc-malta"
  35. ;;
  36. powerpc)
  37. # there is no buster powerpc port, so we use jessie
  38. # use a more recent kernel from backports
  39. kversion='4.9.0-0.bpo.6'
  40. kernel="${kversion}-powerpc"
  41. debsource="deb http://archive.debian.org/debian jessie main"
  42. debsource="${debsource}\ndeb http://archive.debian.org/debian jessie-backports main"
  43. debsource="${debsource}\ndeb http://ftp.ports.debian.org/debian-ports unstable main"
  44. debsource="${debsource}\ndeb http://ftp.ports.debian.org/debian-ports unreleased main"
  45. # archive.debian.org Release files are expired.
  46. echo "Acquire::Check-Valid-Until false;" | tee -a /etc/apt/apt.conf.d/10-nocheckvalid
  47. echo "APT::Get::AllowUnauthenticated true;" | tee -a /etc/apt/apt.conf.d/10-nocheckvalid
  48. dropbear="dropbear"
  49. deps=(libcrypt1:"${arch}")
  50. ;;
  51. powerpc64)
  52. # there is no stable port
  53. arch=ppc64
  54. # https://packages.debian.org/en/sid/linux-image-powerpc64
  55. kversion='5.*'
  56. kernel="${kversion}-powerpc64"
  57. libgcc="libgcc-s1"
  58. debsource="deb http://ftp.ports.debian.org/debian-ports unstable main"
  59. debsource="${debsource}\ndeb http://ftp.ports.debian.org/debian-ports unreleased main"
  60. # sid version of dropbear requires these dependencies
  61. deps=(libcrypt1:"${arch}")
  62. ;;
  63. powerpc64le)
  64. arch=ppc64el
  65. kernel="${kversion}-powerpc64le"
  66. ;;
  67. s390x)
  68. arch=s390x
  69. kernel="${kversion}-s390x"
  70. ;;
  71. sparc64)
  72. # there is no stable port
  73. # https://packages.debian.org/en/sid/linux-image-sparc64
  74. kernel='*-sparc64'
  75. libgcc="libgcc-s1"
  76. debsource="deb http://ftp.ports.debian.org/debian-ports unstable main"
  77. debsource="${debsource}\ndeb http://ftp.ports.debian.org/debian-ports unreleased main"
  78. # sid version of dropbear requires these dependencies
  79. deps=(libcrypt1:"${arch}")
  80. ;;
  81. x86_64)
  82. arch=amd64
  83. kernel="${kversion}-amd64"
  84. ;;
  85. *)
  86. echo "Invalid arch: ${arch}"
  87. exit 1
  88. ;;
  89. esac
  90. install_packages ca-certificates \
  91. curl \
  92. cpio \
  93. sharutils \
  94. gnupg
  95. # Download packages
  96. mv /etc/apt/sources.list /etc/apt/sources.list.bak
  97. echo -e "${debsource}" > /etc/apt/sources.list
  98. # Old ubuntu does not support --add-architecture, so we directly change multiarch file
  99. if [ -f /etc/dpkg/dpkg.cfg.d/multiarch ]; then
  100. cp /etc/dpkg/dpkg.cfg.d/multiarch /etc/dpkg/dpkg.cfg.d/multiarch.bak
  101. fi
  102. dpkg --add-architecture "${arch}" || echo "foreign-architecture ${arch}" > /etc/dpkg/dpkg.cfg.d/multiarch
  103. # Add Debian keys.
  104. curl --retry 3 -sSfL 'https://ftp-master.debian.org/keys/archive-key-{7.0,8,9,10}.asc' -O
  105. curl --retry 3 -sSfL 'https://ftp-master.debian.org/keys/archive-key-{8,9,10}-security.asc' -O
  106. curl --retry 3 -sSfL 'https://ftp-master.debian.org/keys/release-{7,8,9,10}.asc' -O
  107. curl --retry 3 -sSfL 'https://www.ports.debian.org/archive_{2020,2021,2022}.key' -O
  108. for key in *.asc *.key; do
  109. apt-key add "${key}"
  110. rm "${key}"
  111. done
  112. # allow apt-get to retry downloads
  113. echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80-retries
  114. apt-get update
  115. mkdir -p "/qemu/${arch}"
  116. chmod 777 /qemu "/qemu/${arch}"
  117. cd "/qemu/${arch}"
  118. apt-get -d --no-install-recommends download \
  119. ${deps[@]+"${deps[@]}"} \
  120. "busybox:${arch}" \
  121. "${dropbear}:${arch}" \
  122. "libtommath1:${arch}" \
  123. "libtomcrypt1:${arch}" \
  124. "libgmp10:${arch}" \
  125. "libc6:${arch}" \
  126. "${libgcc}:${arch}" \
  127. "libstdc++6:${arch}" \
  128. "linux-image-${kernel}:${arch}" \
  129. ncurses-base \
  130. "zlib1g:${arch}"
  131. cd /qemu
  132. # Install packages
  133. root="root-${arch}"
  134. mkdir -p "${root}"/{bin,etc/dropbear,root,sys,dev,proc,sbin,tmp,usr/{bin,sbin},var/log}
  135. for deb in "${arch}"/*deb; do
  136. dpkg -x "${deb}" "${root}"/
  137. done
  138. cp "${root}/boot/vmlinu"* kernel
  139. # initrd
  140. mkdir -p "${root}/modules"
  141. cp -v \
  142. "${root}/lib/modules"/*/kernel/drivers/net/net_failover.ko \
  143. "${root}/lib/modules"/*/kernel/drivers/net/virtio_net.ko \
  144. "${root}/lib/modules"/*/kernel/drivers/virtio/* \
  145. "${root}/lib/modules"/*/kernel/fs/netfs/netfs.ko \
  146. "${root}/lib/modules"/*/kernel/fs/9p/9p.ko \
  147. "${root}/lib/modules"/*/kernel/fs/fscache/fscache.ko \
  148. "${root}/lib/modules"/*/kernel/net/9p/9pnet.ko \
  149. "${root}/lib/modules"/*/kernel/net/9p/9pnet_virtio.ko \
  150. "${root}/lib/modules"/*/kernel/net/core/failover.ko \
  151. "${root}/modules" || true # some file may not exist
  152. rm -rf "${root:?}/boot"
  153. rm -rf "${root:?}/lib/modules"
  154. cat << 'EOF' > "${root}/etc/hosts"
  155. 127.0.0.1 localhost qemu
  156. EOF
  157. cat << 'EOF' > $root/etc/hostname
  158. qemu
  159. EOF
  160. cat << 'EOF' > $root/etc/passwd
  161. root::0:0:root:/root:/bin/sh
  162. EOF
  163. cat << 'EOF' | uudecode -o $root/etc/dropbear/dropbear_rsa_host_key
  164. begin 600 dropbear_rsa_host_key
  165. M````!W-S:"UR<V$````#`0`!```!`0"N!-<%K,3Z.!Z,OEMB2.N\O.$IWQ*F
  166. M#5%(_;(^2YKY_J_.RQW/7U@_MK&J#!Z0_\;EH#98ZW*E1\.<FF%P/*Y.W56-
  167. M31.'EJE`TN@=T5EC(8"Y%3'ZBYH)^WIVJ]S*G/_;#RH\_?S"U^1L_<<.F`O+
  168. MZVI?*]\KTDOT&QV0#B-M;"%_7:\>+3[X=QMH,B<HM$+0E[\B6*^!XKLR@V,K
  169. M)<V80HHK:_#;D]26XKN&CB./EZAC%4)78R!G""4HT@UK<5I4B^$/""`,?*\T
  170. M>*4$RYULV,V3X6]K:7@Q?80"#WXGGQZNFN6CZ7LTDX(F6J[\]F5<0`HEOF:Z
  171. MX;^53`L'4I/A```!``$L:$Z*#6<^3@+O%.[-#/5H+.C'3\#QQZN[1;J>L`8I
  172. MZ_&T'!"J'/Y+?R?55G:M^=]R*-&I3TOJYZA8@&H51ZOAF59'1_>>Z@?E4#)$
  173. MQU)X/RWH51ZB5KSDWJS:D'7GD(!?NAY`C'7\)I:_4)J")QBV/P"RJQGHG'%B
  174. M1BT2LE6676>`1K,0\NIMZTKQNB(IC+88<7#8%_-=P<&6<"9LH>60TSS?3?-C
  175. MN`T36YB/3^<(Q;`N1NT>I9EZS`BAC^-?.:,R\7EL"<4>7E=]^1]B\K9])AQU
  176. MBM\]M;4V(S(6KH-I.4[6>9E+@\UEM.J6:[2LUEEJDG:G:+:/EVF^Y75@(S$`
  177. M``"!`.O+KW=&*CBCHL"11&SVO4/K]$R-]7MV7,3RR)Q[X'0;6.?4JHW!3VR6
  178. M*FGBY--37ZD-+UV.8_+"$<?B"#&K$.[V)F7V2\UY!7(0FZ@A2`0ADDY*J-_B
  179. M4AU&.*GP#F/!I([:?E],.>6PH9)(/E.\G19#G0K`LRM?JWS!58&;D0C1````
  180. M@0"\[@NYWSTW(?Q@:_A*1Y3/AKYO5?S=0"<2>#V-AH6W-NCSDTSRP=2D79FS
  181. M"D?[;.)V>8'#9&I3"MU@+:2\Z%$0-MG0+J'(0>T1_C6?*C=4U0I$DI<=@D]1
  182. H_&DE8Y(OT%%EPG]!$H&5HX*),_D1A2\P=R.7G'`0L%YM-79Y"T">$0``
  183. `
  184. end
  185. EOF
  186. # dropbear complains when this file is missing
  187. touch "${root}/var/log/lastlog"
  188. cat << 'EOF' > $root/init
  189. #!/bin/busybox sh
  190. set -e
  191. /bin/busybox --install
  192. mount -t devtmpfs devtmpfs /dev
  193. mount -t proc none /proc
  194. mount -t sysfs none /sys
  195. mkdir /dev/pts
  196. mount -t devpts none /dev/pts/
  197. # some archs does not have virtio modules
  198. insmod /modules/failover.ko || true
  199. insmod /modules/net_failover.ko || true
  200. insmod /modules/virtio.ko || true
  201. insmod /modules/virtio_ring.ko || true
  202. insmod /modules/virtio_mmio.ko || true
  203. insmod /modules/virtio_pci_legacy_dev.ko || true
  204. insmod /modules/virtio_pci_modern_dev.ko || true
  205. insmod /modules/virtio_pci.ko || true
  206. insmod /modules/virtio_net.ko || true
  207. insmod /modules/netfs.ko || true
  208. insmod /modules/fscache.ko
  209. insmod /modules/9pnet.ko
  210. insmod /modules/9pnet_virtio.ko || true
  211. insmod /modules/9p.ko
  212. ifconfig lo 127.0.0.1
  213. ifconfig eth0 10.0.2.15
  214. route add default gw 10.0.2.2 eth0
  215. mkdir /target
  216. mount -t 9p -o trans=virtio target /target -oversion=9p2000.u || true
  217. exec dropbear -F -E -B
  218. EOF
  219. chmod +x "${root}/init"
  220. cd "${root}"
  221. find . | cpio --create --format='newc' --quiet | gzip > ../initrd.gz
  222. cd -
  223. # Clean up
  224. rm -rf "/qemu/${root}" "/qemu/${arch}"
  225. mv -f /etc/apt/sources.list.bak /etc/apt/sources.list
  226. if [ -f /etc/dpkg/dpkg.cfg.d/multiarch.bak ]; then
  227. mv /etc/dpkg/dpkg.cfg.d/multiarch.bak /etc/dpkg/dpkg.cfg.d/multiarch
  228. fi
  229. # can fail if arch is used (amd64 and/or i386)
  230. dpkg --remove-architecture "${arch}" || true
  231. apt-get update
  232. purge_packages
  233. ls -lh /qemu
  234. }
  235. main "${@}"