rootgen.sh 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891
  1. #!/bin/sh
  2. # $FreeBSD$
  3. passphrase=passphrase
  4. iterations=50000
  5. # The smallest FAT32 filesystem is 33292 KB
  6. espsize=33292
  7. dev=vtbd0
  8. #
  9. # Builds all the bat-shit crazy combinations we support booting from,
  10. # at least for amd64. It assume you have a ~sane kernel in /boot/kernel
  11. # and copies that into the ~150MB root images we create (we create the du
  12. # size of the kernel + 20MB
  13. #
  14. # Sad panda sez: this runs as root, but could be userland if someone
  15. # creates userland geli and zfs tools.
  16. #
  17. # This assumes an external program install-boot.sh which will install
  18. # the appropriate boot files in the appropriate locations.
  19. #
  20. # These images assume ${dev} will be the root image. We should likely
  21. # use labels, but we don't.
  22. #
  23. # Assumes you've already rebuilt... maybe bad? Also maybe bad: the env
  24. # vars should likely be conditionally set to allow better automation.
  25. #
  26. . $(dirname $0)/install-boot.sh
  27. cpsys() {
  28. src=$1
  29. dst=$2
  30. # Copy kernel + boot loader
  31. (cd $src ; tar cf - .) | (cd $dst; tar xf -)
  32. }
  33. mk_nogeli_gpt_ufs_legacy() {
  34. src=$1
  35. img=$2
  36. cat > ${src}/etc/fstab <<EOF
  37. /dev/${dev}p2 / ufs rw 1 1
  38. EOF
  39. makefs -t ffs -B little -s 200m ${img}.p2 ${src}
  40. mkimg -s gpt -b ${src}/boot/pmbr \
  41. -p freebsd-boot:=${src}/boot/gptboot \
  42. -p freebsd-ufs:=${img}.p2 -o ${img}
  43. rm -f ${src}/etc/fstab
  44. }
  45. mk_nogeli_gpt_ufs_uefi() {
  46. src=$1
  47. img=$2
  48. cat > ${src}/etc/fstab <<EOF
  49. /dev/${dev}p2 / ufs rw 1 1
  50. EOF
  51. make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
  52. makefs -t ffs -B little -s 200m ${img}.p2 ${src}
  53. mkimg -s gpt \
  54. -p efi:=${img}.p1 \
  55. -p freebsd-ufs:=${img}.p2 -o ${img}
  56. rm -f ${src}/etc/fstab
  57. }
  58. mk_nogeli_gpt_ufs_both() {
  59. src=$1
  60. img=$2
  61. cat > ${src}/etc/fstab <<EOF
  62. /dev/${dev}p3 / ufs rw 1 1
  63. EOF
  64. make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
  65. makefs -t ffs -B little -s 200m ${img}.p3 ${src}
  66. # p1 is boot for uefi, p2 is boot for gpt, p3 is /
  67. mkimg -b ${src}/boot/pmbr -s gpt \
  68. -p efi:=${img}.p1 \
  69. -p freebsd-boot:=${src}/boot/gptboot \
  70. -p freebsd-ufs:=${img}.p3 \
  71. -o ${img}
  72. rm -f ${src}/etc/fstab
  73. }
  74. mk_nogeli_gpt_zfs_legacy() {
  75. src=$1
  76. img=$2
  77. mntpt=$3
  78. geli=$4
  79. scheme=$5
  80. fs=$6
  81. bios=$7
  82. pool=nogeli-gpt-zfs-legacy
  83. dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
  84. md=$(mdconfig -f ${img})
  85. gpart create -s gpt ${md}
  86. gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k
  87. gpart add -t freebsd-zfs -l root $md
  88. # install-boot will make this bootable
  89. zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p2
  90. zpool set bootfs=${pool} ${pool}
  91. zfs create -po mountpoint=/ ${pool}/ROOT/default
  92. # NB: The online guides go nuts customizing /var and other mountpoints here, no need
  93. cpsys ${src} ${mntpt}
  94. # need to make a couple of tweaks
  95. cat >> ${mntpt}/boot/loader.conf <<EOF
  96. cryptodev_load=YES
  97. zfs_load=YES
  98. EOF
  99. cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
  100. cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
  101. cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
  102. # end tweaks
  103. zfs umount -f ${pool}/ROOT/default
  104. zfs set mountpoint=none ${pool}/ROOT/default
  105. zpool set bootfs=${pool}/ROOT/default ${pool}
  106. zpool set autoexpand=on ${pool}
  107. zpool export ${pool}
  108. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  109. mdconfig -d -u ${md}
  110. }
  111. mk_nogeli_gpt_zfs_uefi() {
  112. src=$1
  113. img=$2
  114. mntpt=$3
  115. geli=$4
  116. scheme=$5
  117. fs=$6
  118. bios=$7
  119. pool=nogeli-gpt-zfs-uefi
  120. dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
  121. md=$(mdconfig -f ${img})
  122. gpart create -s gpt ${md}
  123. gpart add -t efi -s ${espsize}k -a 4k ${md}
  124. gpart add -t freebsd-zfs -l root $md
  125. # install-boot will make this bootable
  126. zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p2
  127. zpool set bootfs=${pool} ${pool}
  128. zfs create -po mountpoint=/ ${pool}/ROOT/default
  129. # NB: The online guides go nuts customizing /var and other mountpoints here, no need
  130. cpsys ${src} ${mntpt}
  131. # need to make a couple of tweaks
  132. cat >> ${mntpt}/boot/loader.conf <<EOF
  133. cryptodev_load=YES
  134. zfs_load=YES
  135. EOF
  136. cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
  137. cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
  138. cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
  139. # end tweaks
  140. zfs umount -f ${pool}/ROOT/default
  141. zfs set mountpoint=none ${pool}/ROOT/default
  142. zpool set bootfs=${pool}/ROOT/default ${pool}
  143. zpool set autoexpand=on ${pool}
  144. zpool export ${pool}
  145. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  146. mdconfig -d -u ${md}
  147. }
  148. mk_nogeli_gpt_zfs_both() {
  149. src=$1
  150. img=$2
  151. mntpt=$3
  152. geli=$4
  153. scheme=$5
  154. fs=$6
  155. bios=$7
  156. pool=nogeli-gpt-zfs-both
  157. dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
  158. md=$(mdconfig -f ${img})
  159. gpart create -s gpt ${md}
  160. gpart add -t efi -s ${espsize}k -a 4k ${md}
  161. gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k
  162. gpart add -t freebsd-zfs -l root $md
  163. # install-boot will make this bootable
  164. zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3
  165. zpool set bootfs=${pool} ${pool}
  166. zfs create -po mountpoint=/ ${pool}/ROOT/default
  167. # NB: The online guides go nuts customizing /var and other mountpoints here, no need
  168. cpsys ${src} ${mntpt}
  169. # need to make a couple of tweaks
  170. cat >> ${mntpt}/boot/loader.conf <<EOF
  171. cryptodev_load=YES
  172. zfs_load=YES
  173. EOF
  174. cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
  175. cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
  176. cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
  177. # end tweaks
  178. zfs umount -f ${pool}/ROOT/default
  179. zfs set mountpoint=none ${pool}/ROOT/default
  180. zpool set bootfs=${pool}/ROOT/default ${pool}
  181. zpool set autoexpand=on ${pool}
  182. zpool export ${pool}
  183. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  184. mdconfig -d -u ${md}
  185. }
  186. mk_nogeli_mbr_ufs_legacy() {
  187. src=$1
  188. img=$2
  189. cat > ${src}/etc/fstab <<EOF
  190. /dev/${dev}s1a / ufs rw 1 1
  191. EOF
  192. makefs -t ffs -B little -s 200m ${img}.s1a ${src}
  193. mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s1a -o ${img}.s1
  194. mkimg -a 1 -s mbr -b ${src}/boot/boot0sio -p freebsd:=${img}.s1 -o ${img}
  195. rm -f ${src}/etc/fstab
  196. }
  197. mk_nogeli_mbr_ufs_uefi() {
  198. src=$1
  199. img=$2
  200. cat > ${src}/etc/fstab <<EOF
  201. /dev/${dev}s2a / ufs rw 1 1
  202. EOF
  203. make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
  204. makefs -t ffs -B little -s 200m ${img}.s2a ${src}
  205. mkimg -s bsd -p freebsd-ufs:=${img}.s2a -o ${img}.s2
  206. mkimg -a 1 -s mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
  207. rm -f ${src}/etc/fstab
  208. }
  209. mk_nogeli_mbr_ufs_both() {
  210. src=$1
  211. img=$2
  212. cat > ${src}/etc/fstab <<EOF
  213. /dev/${dev}s2a / ufs rw 1 1
  214. EOF
  215. make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
  216. makefs -t ffs -B little -s 200m ${img}.s2a ${src}
  217. mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s2a -o ${img}.s2
  218. mkimg -a 2 -s mbr -b ${src}/boot/mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
  219. rm -f ${src}/etc/fstab
  220. }
  221. mk_nogeli_mbr_zfs_legacy() {
  222. src=$1
  223. img=$2
  224. mntpt=$3
  225. geli=$4
  226. scheme=$5
  227. fs=$6
  228. bios=$7
  229. pool=nogeli-mbr-zfs-legacy
  230. dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
  231. md=$(mdconfig -f ${img})
  232. gpart create -s mbr ${md}
  233. gpart add -t freebsd ${md}
  234. gpart set -a active -i 1 ${md}
  235. gpart create -s bsd ${md}s1
  236. gpart add -t freebsd-zfs ${md}s1
  237. # install-boot will make this bootable
  238. zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}s1a
  239. zpool set bootfs=${pool} ${pool}
  240. zfs create -po mountpoint=/ ${pool}/ROOT/default
  241. # NB: The online guides go nuts customizing /var and other mountpoints here, no need
  242. cpsys ${src} ${mntpt}
  243. # need to make a couple of tweaks
  244. cat >> ${mntpt}/boot/loader.conf <<EOF
  245. cryptodev_load=YES
  246. zfs_load=YES
  247. EOF
  248. cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
  249. cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
  250. cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
  251. # end tweaks
  252. zfs umount -f ${pool}/ROOT/default
  253. zfs set mountpoint=none ${pool}/ROOT/default
  254. zpool set bootfs=${pool}/ROOT/default ${pool}
  255. zpool set autoexpand=on ${pool}
  256. zpool export ${pool}
  257. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  258. mdconfig -d -u ${md}
  259. }
  260. mk_nogeli_mbr_zfs_uefi() {
  261. src=$1
  262. img=$2
  263. mntpt=$3
  264. geli=$4
  265. scheme=$5
  266. fs=$6
  267. bios=$7
  268. pool=nogeli-mbr-zfs-uefi
  269. dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
  270. md=$(mdconfig -f ${img})
  271. gpart create -s mbr ${md}
  272. gpart add -t efi -s ${espsize}k ${md}
  273. gpart add -t freebsd ${md}
  274. gpart set -a active -i 2 ${md}
  275. gpart create -s bsd ${md}s2
  276. gpart add -t freebsd-zfs ${md}s2
  277. # install-boot will make this bootable
  278. zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}s2a
  279. zpool set bootfs=${pool} ${pool}
  280. zfs create -po mountpoint=/ ${pool}/ROOT/default
  281. # NB: The online guides go nuts customizing /var and other mountpoints here, no need
  282. cpsys ${src} ${mntpt}
  283. # need to make a couple of tweaks
  284. cat >> ${mntpt}/boot/loader.conf <<EOF
  285. cryptodev_load=YES
  286. zfs_load=YES
  287. EOF
  288. cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
  289. cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
  290. cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
  291. # end tweaks
  292. zfs umount -f ${pool}/ROOT/default
  293. zfs set mountpoint=none ${pool}/ROOT/default
  294. zpool set bootfs=${pool}/ROOT/default ${pool}
  295. zpool set autoexpand=on ${pool}
  296. zpool export ${pool}
  297. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  298. mdconfig -d -u ${md}
  299. }
  300. mk_nogeli_mbr_zfs_both() {
  301. src=$1
  302. img=$2
  303. mntpt=$3
  304. geli=$4
  305. scheme=$5
  306. fs=$6
  307. bios=$7
  308. pool=nogeli-mbr-zfs-both
  309. dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
  310. md=$(mdconfig -f ${img})
  311. gpart create -s mbr ${md}
  312. gpart add -t efi -s ${espsize}k ${md}
  313. gpart add -t freebsd ${md}
  314. gpart set -a active -i 2 ${md}
  315. gpart create -s bsd ${md}s2
  316. gpart add -t freebsd-zfs ${md}s2
  317. # install-boot will make this bootable
  318. zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}s2a
  319. zpool set bootfs=${pool} ${pool}
  320. zfs create -po mountpoint=/ ${pool}/ROOT/default
  321. # NB: The online guides go nuts customizing /var and other mountpoints here, no need
  322. cpsys ${src} ${mntpt}
  323. # need to make a couple of tweaks
  324. cat >> ${mntpt}/boot/loader.conf <<EOF
  325. cryptodev_load=YES
  326. zfs_load=YES
  327. EOF
  328. cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
  329. cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
  330. cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
  331. # end tweaks
  332. zfs umount -f ${pool}/ROOT/default
  333. zfs set mountpoint=none ${pool}/ROOT/default
  334. zpool set bootfs=${pool}/ROOT/default ${pool}
  335. zpool set autoexpand=on ${pool}
  336. zpool export ${pool}
  337. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  338. mdconfig -d -u ${md}
  339. }
  340. mk_geli_gpt_ufs_legacy() {
  341. src=$1
  342. img=$2
  343. mntpt=$3
  344. geli=$4
  345. scheme=$5
  346. fs=$6
  347. bios=$7
  348. dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
  349. md=$(mdconfig -f ${img})
  350. gpart create -s gpt ${md}
  351. gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k
  352. gpart add -t freebsd-ufs -l root $md
  353. # install-boot will make this bootable
  354. echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
  355. echo ${passphrase} | geli attach -j - ${md}p2
  356. newfs /dev/${md}p2.eli
  357. mount /dev/${md}p2.eli ${mntpt}
  358. cpsys ${src} ${mntpt}
  359. # need to make a couple of tweaks
  360. cat > ${mntpt}/boot/loader.conf <<EOF
  361. geom_eli_load=YES
  362. EOF
  363. cat > ${mntpt}/etc/fstab <<EOF
  364. /dev/${dev}p2.eli / ufs rw 1 1
  365. EOF
  366. cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
  367. # end tweaks
  368. umount -f ${mntpt}
  369. geli detach ${md}p2
  370. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  371. mdconfig -d -u ${md}
  372. }
  373. mk_geli_gpt_ufs_uefi() {
  374. src=$1
  375. img=$2
  376. mntpt=$3
  377. geli=$4
  378. scheme=$5
  379. fs=$6
  380. bios=$7
  381. dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
  382. md=$(mdconfig -f ${img})
  383. gpart create -s gpt ${md}
  384. gpart add -t efi -s ${espsize}k -a 4k ${md}
  385. gpart add -t freebsd-ufs -l root $md
  386. # install-boot will make this bootable
  387. echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
  388. echo ${passphrase} | geli attach -j - ${md}p2
  389. newfs /dev/${md}p2.eli
  390. mount /dev/${md}p2.eli ${mntpt}
  391. cpsys ${src} ${mntpt}
  392. # need to make a couple of tweaks
  393. cat > ${mntpt}/boot/loader.conf <<EOF
  394. geom_eli_load=YES
  395. EOF
  396. cat > ${mntpt}/etc/fstab <<EOF
  397. /dev/${dev}p2.eli / ufs rw 1 1
  398. EOF
  399. cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
  400. # end tweaks
  401. umount -f ${mntpt}
  402. geli detach ${md}p2
  403. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  404. mdconfig -d -u ${md}
  405. }
  406. mk_geli_gpt_ufs_both() {
  407. src=$1
  408. img=$2
  409. mntpt=$3
  410. geli=$4
  411. scheme=$5
  412. fs=$6
  413. bios=$7
  414. dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
  415. md=$(mdconfig -f ${img})
  416. gpart create -s gpt ${md}
  417. gpart add -t efi -s ${espsize}k -a 4k ${md}
  418. gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k
  419. gpart add -t freebsd-ufs -l root $md
  420. # install-boot will make this bootable
  421. echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
  422. echo ${passphrase} | geli attach -j - ${md}p3
  423. newfs /dev/${md}p3.eli
  424. mount /dev/${md}p3.eli ${mntpt}
  425. cpsys ${src} ${mntpt}
  426. # need to make a couple of tweaks
  427. cat > ${mntpt}/boot/loader.conf <<EOF
  428. geom_eli_load=YES
  429. EOF
  430. cat > ${mntpt}/etc/fstab <<EOF
  431. /dev/${dev}p3.eli / ufs rw 1 1
  432. EOF
  433. cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
  434. # end tweaks
  435. umount -f ${mntpt}
  436. geli detach ${md}p3
  437. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  438. mdconfig -d -u ${md}
  439. }
  440. mk_geli_gpt_zfs_legacy() {
  441. src=$1
  442. img=$2
  443. mntpt=$3
  444. geli=$4
  445. scheme=$5
  446. fs=$6
  447. bios=$7
  448. pool=geli-gpt-zfs-legacy
  449. # Note that in this flavor we create an empty p2 ufs partition, and put
  450. # the bootable zfs stuff on p3, just to test the ability of the zfs probe
  451. # probe routines to find a pool on a partition other than the first one.
  452. dd if=/dev/zero of=${img} count=1 seek=$(( 300 * 1024 * 1024 / 512 ))
  453. md=$(mdconfig -f ${img})
  454. gpart create -s gpt ${md}
  455. gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k
  456. gpart add -t freebsd-ufs -s 100m ${md}
  457. gpart add -t freebsd-zfs -l root $md
  458. # install-boot will make this bootable
  459. echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
  460. echo ${passphrase} | geli attach -j - ${md}p3
  461. zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
  462. zpool set bootfs=${pool} ${pool}
  463. zfs create -po mountpoint=/ ${pool}/ROOT/default
  464. # NB: The online guides go nuts customizing /var and other mountpoints here, no need
  465. cpsys ${src} ${mntpt}
  466. # need to make a couple of tweaks
  467. cat >> ${mntpt}/boot/loader.conf <<EOF
  468. cryptodev_load=YES
  469. zfs_load=YES
  470. geom_eli_load=YES
  471. EOF
  472. cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
  473. cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
  474. cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
  475. cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
  476. # end tweaks
  477. zfs umount -f ${pool}/ROOT/default
  478. zfs set mountpoint=none ${pool}/ROOT/default
  479. zpool set bootfs=${pool}/ROOT/default ${pool}
  480. zpool set autoexpand=on ${pool}
  481. zpool export ${pool}
  482. geli detach ${md}p3
  483. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  484. mdconfig -d -u ${md}
  485. }
  486. mk_geli_gpt_zfs_uefi() {
  487. src=$1
  488. img=$2
  489. mntpt=$3
  490. geli=$4
  491. scheme=$5
  492. fs=$6
  493. bios=$7
  494. pool=geli-gpt-zfs-uefi
  495. # Note that in this flavor we create an empty p2 ufs partition, and put
  496. # the bootable zfs stuff on p3, just to test the ability of the zfs probe
  497. # probe routines to find a pool on a partition other than the first one.
  498. dd if=/dev/zero of=${img} count=1 seek=$(( 300 * 1024 * 1024 / 512 ))
  499. md=$(mdconfig -f ${img})
  500. gpart create -s gpt ${md}
  501. gpart add -t efi -s ${espsize}k -a 4k ${md}
  502. gpart add -t freebsd-ufs -s 100m ${md}
  503. gpart add -t freebsd-zfs -l root $md
  504. # install-boot will make this bootable
  505. echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
  506. echo ${passphrase} | geli attach -j - ${md}p3
  507. zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
  508. zpool set bootfs=${pool} ${pool}
  509. zfs create -po mountpoint=/ ${pool}/ROOT/default
  510. # NB: The online guides go nuts customizing /var and other mountpoints here, no need
  511. cpsys ${src} ${mntpt}
  512. # need to make a couple of tweaks
  513. cat >> ${mntpt}/boot/loader.conf <<EOF
  514. cryptodev_load=YES
  515. zfs_load=YES
  516. geom_eli_load=YES
  517. EOF
  518. cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
  519. cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
  520. cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
  521. cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
  522. # end tweaks
  523. zfs umount -f ${pool}/ROOT/default
  524. zfs set mountpoint=none ${pool}/ROOT/default
  525. zpool set bootfs=${pool}/ROOT/default ${pool}
  526. zpool set autoexpand=on ${pool}
  527. zpool export ${pool}
  528. geli detach ${md}p3
  529. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  530. mdconfig -d -u ${md}
  531. }
  532. mk_geli_gpt_zfs_both() {
  533. src=$1
  534. img=$2
  535. mntpt=$3
  536. geli=$4
  537. scheme=$5
  538. fs=$6
  539. bios=$7
  540. pool=geli-gpt-zfs-both
  541. dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
  542. md=$(mdconfig -f ${img})
  543. gpart create -s gpt ${md}
  544. gpart add -t efi -s ${espsize}k -a 4k ${md}
  545. gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k
  546. gpart add -t freebsd-zfs -l root $md
  547. # install-boot will make this bootable
  548. echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
  549. echo ${passphrase} | geli attach -j - ${md}p3
  550. zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
  551. zpool set bootfs=${pool} ${pool}
  552. zfs create -po mountpoint=/ ${pool}/ROOT/default
  553. # NB: The online guides go nuts customizing /var and other mountpoints here, no need
  554. cpsys ${src} ${mntpt}
  555. # need to make a couple of tweaks
  556. cat > ${mntpt}/boot/loader.conf <<EOF
  557. cryptodev_load=YES
  558. zfs_load=YES
  559. geom_eli_load=YES
  560. EOF
  561. cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
  562. cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
  563. cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
  564. cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
  565. # end tweaks
  566. zfs umount -f ${pool}/ROOT/default
  567. zfs set mountpoint=none ${pool}/ROOT/default
  568. zpool set bootfs=${pool}/ROOT/default ${pool}
  569. zpool set autoexpand=on ${pool}
  570. zpool export ${pool}
  571. geli detach ${md}p3
  572. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  573. mdconfig -d -u ${md}
  574. }
  575. # GELI+MBR is not a valid configuration
  576. mk_geli_mbr_ufs_legacy() {
  577. }
  578. mk_geli_mbr_ufs_uefi() {
  579. }
  580. mk_geli_mbr_ufs_both() {
  581. }
  582. mk_geli_mbr_zfs_legacy() {
  583. }
  584. mk_geli_mbr_zfs_uefi() {
  585. }
  586. mk_geli_mbr_zfs_both() {
  587. }
  588. # iso
  589. # pxeldr
  590. # u-boot
  591. # powerpc
  592. mk_sparc64_nogeli_vtoc8_ufs_ofw() {
  593. src=$1
  594. img=$2
  595. mntpt=$3
  596. geli=$4
  597. scheme=$5
  598. fs=$6
  599. bios=$7
  600. cat > ${src}/etc/fstab <<EOF
  601. /dev/${dev}a / ufs rw 1 1
  602. EOF
  603. makefs -t ffs -B big -s 200m ${img} ${src}
  604. md=$(mdconfig -f ${img})
  605. # For non-native builds, ensure that geom_part(4) supports VTOC8.
  606. kldload geom_part_vtoc8.ko
  607. gpart create -s VTOC8 ${md}
  608. gpart add -t freebsd-ufs ${md}
  609. ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
  610. mdconfig -d -u ${md}
  611. rm -f ${src}/etc/fstab
  612. }
  613. qser="-serial telnet::4444,server -nographic"
  614. # https://wiki.freebsd.org/QemuRecipes
  615. # aarch64
  616. qemu_aarch64_uefi()
  617. {
  618. img=$1
  619. sh=$2
  620. echo "qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt \
  621. -bios QEMU_EFI.fd ${qser} \
  622. -drive if=none,file=${img},id=hd0 \
  623. -device virtio-blk-device,drive=hd0" > $sh
  624. chmod 755 $sh
  625. # https://wiki.freebsd.org/arm64/QEMU also has
  626. # -device virtio-net-device,netdev=net0
  627. # -netdev user,id=net0
  628. }
  629. # Amd64 qemu
  630. qemu_amd64_legacy()
  631. {
  632. img=$1
  633. sh=$2
  634. echo "qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser}" > $sh
  635. chmod 755 $sh
  636. }
  637. qemu_amd64_uefi()
  638. {
  639. img=$1
  640. sh=$2
  641. echo "qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser}" > $sh
  642. chmod 755 $sh
  643. }
  644. qemu_amd64_both()
  645. {
  646. img=$1
  647. sh=$2
  648. echo "qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser}" > $sh
  649. echo "qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser}" >> $sh
  650. chmod 755 $sh
  651. }
  652. # arm
  653. # nothing listed?
  654. # i386
  655. qemu_i386_legacy()
  656. {
  657. img=$1
  658. sh=$2
  659. echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
  660. chmod 755 $sh
  661. }
  662. # Not yet supported
  663. qemu_i386_uefi()
  664. {
  665. img=$1
  666. sh=$2
  667. echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" > $sh
  668. chmod 755 $sh
  669. }
  670. # Needs UEFI to be supported
  671. qemu_i386_both()
  672. {
  673. img=$1
  674. sh=$2
  675. echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
  676. echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" >> $sh
  677. chmod 755 $sh
  678. }
  679. make_one_image()
  680. {
  681. local arch=${1?}
  682. local geli=${2?}
  683. local scheme=${3?}
  684. local fs=${4?}
  685. local bios=${5?}
  686. # Create sparse file and mount newly created filesystem(s) on it
  687. img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
  688. sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
  689. echo "vvvvvvvvvvvvvv Creating $img vvvvvvvvvvvvvvv"
  690. rm -f ${img}*
  691. eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
  692. eval qemu_${arch}_${bios} ${img} ${sh}
  693. [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
  694. echo "^^^^^^^^^^^^^^ Created $img ^^^^^^^^^^^^^^^"
  695. }
  696. # mips
  697. # qemu-system-mips -kernel /path/to/rootfs/boot/kernel/kernel -nographic -hda /path/to/disk.img -m 2048
  698. # Powerpc -- doesn't work but maybe it would enough for testing -- needs details
  699. # powerpc64
  700. # qemu-system-ppc64 -drive file=/path/to/disk.img,format=raw
  701. # sparc64
  702. # qemu-system-sparc64 -drive file=/path/to/disk.img,format=raw
  703. # Misc variables
  704. SRCTOP=$(make -v SRCTOP)
  705. cd ${SRCTOP}/stand
  706. OBJDIR=$(make -v .OBJDIR)
  707. IMGDIR=${OBJDIR}/boot-images
  708. mkdir -p ${IMGDIR}
  709. MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX)
  710. # Setup the installed tree...
  711. DESTDIR=${OBJDIR}/boot-tree
  712. rm -rf ${DESTDIR}
  713. mkdir -p ${DESTDIR}/boot/defaults
  714. mkdir -p ${DESTDIR}/boot/kernel
  715. cp /boot/kernel/kernel ${DESTDIR}/boot/kernel
  716. echo -h -D -S115200 > ${DESTDIR}/boot.config
  717. cat > ${DESTDIR}/boot/loader.conf <<EOF
  718. comconsole_speed=115200
  719. EOF
  720. # XXX
  721. cp /boot/device.hints ${DESTDIR}/boot/device.hints
  722. # Assume we're already built
  723. make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes WITHOUT_DEBUG_FILES=yes
  724. if [ $? -ne 0 ]; then
  725. echo "make install failed"
  726. exit 1
  727. fi
  728. # Copy init, /bin/sh, minimal libraries and testing /etc/rc
  729. mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin \
  730. ${DESTDIR}/lib ${DESTDIR}/libexec \
  731. ${DESTDIR}/etc ${DESTDIR}/dev
  732. for f in /sbin/halt /sbin/init /bin/sh /sbin/sysctl $(ldd /bin/sh | awk 'NF == 4 { print $3; }') /libexec/ld-elf.so.1; do
  733. cp $f ${DESTDIR}/$f
  734. done
  735. cat > ${DESTDIR}/etc/rc <<EOF
  736. #!/bin/sh
  737. sysctl machdep.bootmethod
  738. echo "RC COMMAND RUNNING -- SUCCESS!!!!!"
  739. halt -p
  740. EOF
  741. # If we were given exactly 5 args, go make that one image.
  742. if [ $# -eq 5 ]; then
  743. make_one_image $*
  744. exit
  745. fi
  746. # OK. Let the games begin
  747. for arch in amd64; do
  748. for geli in nogeli geli; do
  749. for scheme in gpt mbr; do
  750. for fs in ufs zfs; do
  751. for bios in legacy uefi both; do
  752. make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
  753. done
  754. done
  755. done
  756. done
  757. done
  758. rmdir ${MNTPT}
  759. exit 0
  760. # Notes for the future
  761. for arch in i386; do
  762. for geli in nogeli geli; do
  763. for scheme in gpt mbr; do
  764. for fs in ufs zfs; do
  765. for bios in legacy; do
  766. make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
  767. done
  768. done
  769. done
  770. done
  771. done
  772. for arch in arm aarch64; do
  773. for scheme in gpt mbr; do
  774. fs=ufs
  775. for bios in uboot efi; do
  776. make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
  777. done
  778. done
  779. done
  780. for arch in powerpc powerpc64; do
  781. for scheme in ppc-wtf; do
  782. fs=ufs
  783. for bios in ofw uboot chrp; do
  784. make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
  785. done
  786. done
  787. done
  788. for arch in sparc64; do
  789. for geli in nogeli; do
  790. for scheme in vtoc8; do
  791. for fs in ufs; do
  792. for bios in ofw; do
  793. make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
  794. done
  795. done
  796. done
  797. done
  798. done