6 # Builds all the bat-shit crazy combinations we support booting from,
7 # at least for amd64. It assume you have a ~sane kernel in /boot/kernel
8 # and copies that into the ~150MB root images we create (we create the du
9 # size of the kernel + 20MB
11 # Sad panda sez: this runs as root, but could be userland if someone
12 # creates userland geli and zfs tools.
14 # This assumes an external prograam install-boot.sh which will install
15 # the appropriate boot files in the appropriate locations.
17 # These images assume ada0 will be the root image. We should likely
18 # use labels, but we don't.
20 # ASsumes you've already rebuilt... maybe bad? Also maybe bad: the env
21 # vars should likely be conditionally set to allow better automation.
28 # Copy kernel + boot loader
29 (cd $src ; tar cf - .) | (cd $dst; tar xf -)
32 mk_nogeli_gpt_ufs_legacy() {
36 cat > ${src}/etc/fstab <<EOF
37 /dev/ada0p2 / ufs rw 1 1
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
46 mk_nogeli_gpt_ufs_uefi() {
50 cat > ${src}/etc/fstab <<EOF
51 /dev/ada0p2 / ufs rw 1 1
53 # XXX need to make msdos part for this to work XXXX
54 cp ${src}/boot/boot.efifat ${img}.p1
55 makefs -t ffs -B little -s 200m ${img}.p2 ${src}
56 mkimg -s gpt -b ${src}/boot/pmbr \
58 -p freebsd-ufs:=${img}.p2 -o ${img}
59 rm -f ${src}/etc/fstab
62 mk_nogeli_gpt_ufs_both() {
66 cat > ${src}/etc/fstab <<EOF
67 /dev/ada0p3 / ufs rw 1 1
69 # XXX need to make msdos part for this to work XXXX
70 cp ${src}/boot/boot.efifat ${img}.p1
71 makefs -t ffs -B little -s 200m ${img}.p3 ${src}
72 # p1 is boot for uefi, p2 is boot for gpt, p3 is /
73 mkimg -b ${src}/boot/pmbr -s gpt \
74 -p efi:=${src}/boot/boot1.efifat \
75 -p freebsd-boot:=${src}/boot/gptboot \
76 -p freebsd-ufs:=${img}.p3 \
78 rm -f ${src}/etc/fstab
81 mk_nogeli_gpt_zfs_legacy() {
89 pool=nogeli-gpt-zfs-legacy
91 dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
92 md=$(mdconfig -f ${img})
93 gpart create -s gpt ${md}
94 gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k
95 gpart add -t freebsd-zfs -l root $md
96 # install-boot will make this bootable
97 zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p2
98 zpool set bootfs=${pool} ${pool}
99 zfs create -o mountpoint=/ ${pool}/ROOT
100 # NB: The online guides go nuts customizing /var and other mountpoints here, no need
101 cpsys ${src} ${mntpt}
103 # need to make a couple of tweaks
104 cat > ${mntpt}/boot/loader.conf <<EOF
108 cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
109 cp /boot/kernel/opensolaris.ko ${mntpt}/boot/kernel/opensolaris.ko
110 ls -las ${mntpt}/boot
112 zfs umount -f ${pool}/ROOT
113 zfs set mountpoint=none ${pool}/ROOT
114 zpool set bootfs=${pool}/ROOT ${pool}
115 zpool set autoexpand=on ${pool}
117 ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
121 mk_nogeli_gpt_zfs_uefi() {
124 mk_nogeli_gpt_zfs_both() {
127 mk_nogeli_mbr_ufs_legacy() {
131 cat > ${src}/etc/fstab <<EOF
132 /dev/ada0s1a / ufs rw 1 1
134 makefs -t ffs -B little -s 200m ${img}.s1a ${src}
135 mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s1a -o ${img}.s1
136 mkimg -a 1 ${bootmbr} -s mbr -b ${src}/boot/boot0sio -p freebsd:=${img}.s1 -o ${img}
137 rm -f ${src}/etc/fstab
140 mk_nogeli_mbr_ufs_uefi() {
143 mk_nogeli_mbr_ufs_both() {
146 mk_nogeli_mbr_zfs_legacy() {
149 mk_nogeli_mbr_zfs_uefi() {
152 mk_nogeli_mbr_zfs_both() {
155 mk_geli_gpt_ufs_legacy() {
158 mk_geli_gpt_ufs_uefi() {
161 mk_geli_gpt_ufs_both() {
164 mk_geli_gpt_zfs_legacy() {
167 mk_geli_gpt_zfs_uefi() {
170 mk_geli_gpt_zfs_both() {
173 mk_geli_mbr_ufs_legacy() {
176 mk_geli_mbr_ufs_uefi() {
179 mk_geli_mbr_ufs_both() {
182 mk_geli_mbr_zfs_legacy() {
185 mk_geli_mbr_zfs_uefi() {
188 mk_geli_mbr_zfs_both() {
196 mk_sparc64_nogeli_vtoc8_ufs_ofw() {
205 cat > ${src}/etc/fstab <<EOF
206 /dev/ada0a / ufs rw 1 1
208 makefs -t ffs -B big -s 200m ${img} ${src}
209 md=$(mdconfig -f ${img})
210 # For non-native builds, ensure that geom_part(4) supports VTOC8.
211 kldload geom_part_vtoc8.ko
212 gpart create -s VTOC8 ${md}
213 gpart add -t freebsd-ufs ${md}
214 ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
216 rm -f ${src}/etc/fstab
219 qser="-serial telnet::4444,server -nographic"
221 # https://wiki.freebsd.org/QemuRecipes
228 echo "qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt \
229 -bios QEMU_EFI.fd ${qser} \
230 -drive if=none,file=${img},id=hd0 \
231 -device virtio-blk-device,drive=hd0" > $sh
232 # https://wiki.freebsd.org/arm64/QEMU also has
233 # -device virtio-net-device,netdev=net0
234 # -netdev user,id=net0
243 echo "qemu-system-x86_64 --drive file=${img},format=raw ${qser}" > $sh
251 echo "qemu-system-x86_64 -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser}" > $sh
259 echo "qemu-system-x86_64 --drive file=${img},format=raw ${qser}" > $sh
260 echo "qemu-system-x86_64 -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser}" > $sh
272 echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
281 echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" > $sh
284 # Needs UEFI to be supported
290 echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
291 echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" > $sh
295 # qemu-system-mips -kernel /path/to/rootfs/boot/kernel/kernel -nographic -hda /path/to/disk.img -m 2048
297 # Powerpc -- doesn't work but maybe it would enough for testing -- needs details
299 # qemu-system-ppc64 -drive file=/path/to/disk.img,format=raw
302 # qemu-system-sparc64 -drive file=/path/to/disk.img,format=raw
305 SRCTOP=$(make -v SRCTOP)
306 cd ${SRCTOP}/sys/boot
307 OBJDIR=$(make -v .OBJDIR)
308 IMGDIR=${OBJDIR}/boot-images
310 MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX)
312 # Setup the installed tree...
313 DESTDIR=${OBJDIR}/boot-tree
315 mkdir -p ${DESTDIR}/boot/defaults
316 mkdir -p ${DESTDIR}/boot/kernel
317 # XXX boot1 exists only on sparc64
318 cp /boot/boot1 ${DESTDIR}/boot
319 cp /boot/loader ${DESTDIR}/boot
320 cp /boot/kernel/kernel ${DESTDIR}/boot/kernel
321 echo -h -D -S115200 > ${DESTDIR}/boot.config
323 cp /boot/device.hints ${DESTDIR}/boot/device.hints
324 # Assume we're already built
325 make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes
326 # Copy init, /bin/sh, minimal libraries and testing /etc/rc
327 mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin \
328 ${DESTDIR}/lib ${DESTDIR}/libexec \
329 ${DESTDIR}/etc ${DESTDIR}/dev
330 for f in /sbin/halt /sbin/init /bin/sh $(ldd /bin/sh | awk 'NF == 4 { print $3; }') /libexec/ld-elf.so.1; do
333 cat > ${DESTDIR}/etc/rc <<EOF
336 echo "RC COMMAND RUNNING -- SUCCESS!!!!!"
340 # OK. Let the games begin
342 for arch in amd64; do
343 for geli in nogeli geli; do
344 for scheme in gpt mbr; do
345 for fs in ufs zfs; do
346 for bios in legacy uefi both; do
347 # Create sparse file and mount newly created filesystem(s) on it
348 img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
349 sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
350 echo "vvvvvvvvvvvvvvvvvvvvvv Creating $img vvvvvvvvvvvvvvvvvvvvvvv"
352 eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
353 eval qemu_${arch}_${bios} ${img} ${sh}
354 [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
355 echo "^^^^^^^^^^^^^^^^^^^^^^ Creating $img ^^^^^^^^^^^^^^^^^^^^^^^"
366 # Notes for the future
369 for geli in nogeli geli; do
370 for scheme in gpt mbr; do
371 for fs in ufs zfs; do
372 for bios in legacy; do
373 # Create sparse file and mount newly created filesystem(s) on it
374 img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
375 sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
376 echo "vvvvvvvvvvvvvvvvvvvvvv Creating $img vvvvvvvvvvvvvvvvvvvvvvv"
378 eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
379 eval qemu_${arch}_${bios} ${img} ${sh}
380 [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
381 echo "^^^^^^^^^^^^^^^^^^^^^^ Creating $img ^^^^^^^^^^^^^^^^^^^^^^^"
388 for arch in arm aarch64; do
389 for scheme in gpt mbr; do
391 for bios in uboot efi; do
392 # Create sparse file and mount newly created filesystem(s) on it
393 img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
394 sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
395 echo "vvvvvvvvvvvvvvvvvvvvvv Creating $img vvvvvvvvvvvvvvvvvvvvvvv"
397 eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
398 eval qemu_${arch}_${bios} ${img} ${sh}
399 [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
400 echo "^^^^^^^^^^^^^^^^^^^^^^ Creating $img ^^^^^^^^^^^^^^^^^^^^^^^"
405 for arch in powerpc powerpc64; do
406 for scheme in ppc-wtf; do
408 for bios in ofw uboot chrp; do
409 # Create sparse file and mount newly created filesystem(s) on it
410 img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
411 sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
412 echo "vvvvvvvvvvvvvvvvvvvvvv Creating $img vvvvvvvvvvvvvvvvvvvvvvv"
414 eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
415 eval qemu_${arch}_${bios} ${img} ${sh}
416 [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
417 echo "^^^^^^^^^^^^^^^^^^^^^^ Creating $img ^^^^^^^^^^^^^^^^^^^^^^^"
422 for arch in sparc64; do
423 for geli in nogeli; do
424 for scheme in vtoc8; do
427 # Create sparse file and mount newly created filesystem(s) on it
428 img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
429 sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
430 echo "vvvvvvvvvvvvvvvvvvvvvv Creating $img vvvvvvvvvvvvvvvvvvvvvvv"
432 eval mk_${arch}_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
433 eval qemu_${arch}_${bios} ${img} ${sh}
434 [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
435 echo "^^^^^^^^^^^^^^^^^^^^^^ Creating $img ^^^^^^^^^^^^^^^^^^^^^^^"