aboutsummaryrefslogtreecommitdiff
path: root/tools/boot/rootgen.sh
diff options
context:
space:
mode:
authorRebecca Cran <bcran@FreeBSD.org>2018-12-20 19:39:37 +0000
committerRebecca Cran <bcran@FreeBSD.org>2018-12-20 19:39:37 +0000
commitdb8b56134506840832bec2d1ce07b9e00d4d6d71 (patch)
tree242e3d5aea577a1691fc784b6b35da9690e23d5c /tools/boot/rootgen.sh
parentd5cee48f3e65662051e15c85e4fc1841d72977fe (diff)
downloadsrc-db8b56134506840832bec2d1ce07b9e00d4d6d71.tar.gz
src-db8b56134506840832bec2d1ce07b9e00d4d6d71.zip
Rework UEFI ESP generation
Currently, the installer uses pre-created 800KB FAT12 filesystems that it dd's onto the ESP partition. This changeset improves that by having the installer generate a FAT32 filesystem directly onto the ESP using newfs_msdos and then copying loader.efi into /EFI/freebsd. For live installs it then runs efibootmgr to add a FreeBSD boot entry in the BIOS. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D17947
Notes
Notes: svn path=/head/; revision=342283
Diffstat (limited to 'tools/boot/rootgen.sh')
-rwxr-xr-xtools/boot/rootgen.sh54
1 files changed, 16 insertions, 38 deletions
diff --git a/tools/boot/rootgen.sh b/tools/boot/rootgen.sh
index 87b541bdf4b0..4faf9335ca71 100755
--- a/tools/boot/rootgen.sh
+++ b/tools/boot/rootgen.sh
@@ -5,7 +5,8 @@
passphrase=passphrase
iterations=50000
-do_boot1_efi=0
+# The smallest FAT32 filesystem is 33292 KB
+espsize=33292
#
# Builds all the bat-shit crazy combinations we support booting from,
@@ -16,13 +17,13 @@ do_boot1_efi=0
# Sad panda sez: this runs as root, but could be userland if someone
# creates userland geli and zfs tools.
#
-# This assumes an external prograam install-boot.sh which will install
+# This assumes an external program install-boot.sh which will install
# the appropriate boot files in the appropriate locations.
#
# These images assume ada0 will be the root image. We should likely
# use labels, but we don't.
#
-# ASsumes you've already rebuilt... maybe bad? Also maybe bad: the env
+# Assumes you've already rebuilt... maybe bad? Also maybe bad: the env
# vars should likely be conditionally set to allow better automation.
#
@@ -34,29 +35,6 @@ cpsys() {
(cd $src ; tar cf - .) | (cd $dst; tar xf -)
}
-make_esp()
-{
- local src dst md mntpt
- src=$1
- dst=$2
-
- if [ "${do_boot1_efi}" -eq 1 ]; then
- cp ${src}/boot/boot1.efifat ${dst}
- else
- dd if=/dev/zero of=${dst} count=1 seek=$((100 * 1024 * 1024 / 512))
- md=$(mdconfig -f ${dst})
- newfs_msdos -a 32 /dev/${md}
- mntpt=$(mktemp -d /tmp/stand-test.XXXXXX)
- mount -t msdos /dev/${md} ${mntpt}
-# mkdir -p ${mntpt}/efi/freebsd # not yet
- mkdir -p ${mntpt}/efi/boot
- cp ${src}/boot/loader.efi ${mntpt}/efi/boot/bootx64.efi
- umount ${mntpt}
- rmdir ${mntpt}
- mdconfig -d -u ${md}
- fi
-}
-
mk_nogeli_gpt_ufs_legacy() {
src=$1
img=$2
@@ -78,7 +56,7 @@ mk_nogeli_gpt_ufs_uefi() {
cat > ${src}/etc/fstab <<EOF
/dev/ada0p2 / ufs rw 1 1
EOF
- make_esp ${src} ${img}.p1
+ make_esp_file ${img}.p1 ${espsize} ${src}
makefs -t ffs -B little -s 200m ${img}.p2 ${src}
mkimg -s gpt \
-p efi:=${img}.p1 \
@@ -93,7 +71,7 @@ mk_nogeli_gpt_ufs_both() {
cat > ${src}/etc/fstab <<EOF
/dev/ada0p3 / ufs rw 1 1
EOF
- make_esp ${src} ${img}.p1
+ make_esp_file ${img}.p1 ${espsize} ${src}
makefs -t ffs -B little -s 200m ${img}.p3 ${src}
# p1 is boot for uefi, p2 is boot for gpt, p3 is /
mkimg -b ${src}/boot/pmbr -s gpt \
@@ -155,7 +133,7 @@ mk_nogeli_gpt_zfs_uefi() {
dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
md=$(mdconfig -f ${img})
gpart create -s gpt ${md}
- gpart add -t efi -s 800k -a 4k ${md}
+ gpart add -t efi -s ${espsize}k -a 4k ${md}
gpart add -t freebsd-zfs -l root $md
# install-boot will make this bootable
zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p2
@@ -193,7 +171,7 @@ mk_nogeli_gpt_zfs_both() {
dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
md=$(mdconfig -f ${img})
gpart create -s gpt ${md}
- gpart add -t efi -s 800k -a 4k ${md}
+ gpart add -t efi -s ${espsize}k -a 4k ${md}
gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k
gpart add -t freebsd-zfs -l root $md
# install-boot will make this bootable
@@ -239,7 +217,7 @@ mk_nogeli_mbr_ufs_uefi() {
cat > ${src}/etc/fstab <<EOF
/dev/ada0s2a / ufs rw 1 1
EOF
- make_esp ${src} ${img}.s1
+ make_esp_file ${img}.s1 ${espsize} ${src}
makefs -t ffs -B little -s 200m ${img}.s2a ${src}
mkimg -s bsd -p freebsd-ufs:=${img}.s2a -o ${img}.s2
mkimg -a 1 -s mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
@@ -253,7 +231,7 @@ mk_nogeli_mbr_ufs_both() {
cat > ${src}/etc/fstab <<EOF
/dev/ada0s2a / ufs rw 1 1
EOF
- make_esp ${src} ${img}.s1
+ make_esp_file ${img}.s1 ${espsize} ${src}
makefs -t ffs -B little -s 200m ${img}.s2a ${src}
mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s2a -o ${img}.s2
mkimg -a 2 -s mbr -b ${src}/boot/mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
@@ -313,7 +291,7 @@ mk_nogeli_mbr_zfs_uefi() {
dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
md=$(mdconfig -f ${img})
gpart create -s mbr ${md}
- gpart add -t \!239 -s 800k ${md}
+ gpart add -t efi -s ${espsize}k ${md}
gpart add -t freebsd ${md}
gpart set -a active -i 2 ${md}
gpart create -s bsd ${md}s2
@@ -354,7 +332,7 @@ mk_nogeli_mbr_zfs_both() {
dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
md=$(mdconfig -f ${img})
gpart create -s mbr ${md}
- gpart add -t \!239 -s 800k ${md}
+ gpart add -t efi -s ${espsize}k ${md}
gpart add -t freebsd ${md}
gpart set -a active -i 2 ${md}
gpart create -s bsd ${md}s2
@@ -430,7 +408,7 @@ mk_geli_gpt_ufs_uefi() {
dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
md=$(mdconfig -f ${img})
gpart create -s gpt ${md}
- gpart add -t efi -s 800k -a 4k ${md}
+ gpart add -t efi -s ${espsize}k -a 4k ${md}
gpart add -t freebsd-ufs -l root $md
# install-boot will make this bootable
echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
@@ -466,7 +444,7 @@ mk_geli_gpt_ufs_both() {
dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
md=$(mdconfig -f ${img})
gpart create -s gpt ${md}
- gpart add -t efi -s 800k -a 4k ${md}
+ gpart add -t efi -s ${espsize}k -a 4k ${md}
gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k
gpart add -t freebsd-ufs -l root $md
# install-boot will make this bootable
@@ -547,7 +525,7 @@ mk_geli_gpt_zfs_uefi() {
dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
md=$(mdconfig -f ${img})
gpart create -s gpt ${md}
- gpart add -t efi -s 800k -a 4k ${md}
+ gpart add -t efi -s ${espsize}k -a 4k ${md}
gpart add -t freebsd-zfs -l root $md
# install-boot will make this bootable
echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
@@ -590,7 +568,7 @@ mk_geli_gpt_zfs_both() {
dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
md=$(mdconfig -f ${img})
gpart create -s gpt ${md}
- gpart add -t efi -s 800k -a 4k ${md}
+ gpart add -t efi -s ${espsize}k -a 4k ${md}
gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k
gpart add -t freebsd-zfs -l root $md
# install-boot will make this bootable