summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2017-03-28 16:07:09 -0400
committerAndrew Cady <d@jerkface.net>2017-03-28 16:12:28 -0400
commit5160fd50cf2bf09700c20236cac992a7a85fc943 (patch)
treec4bef4cc1b8a0635222cf83b4927f5fdcdedf635
parent2a575328ac1432c21e0b983d2432f1f64dff0f96 (diff)
Use pxelinux "ipappend" option to choose rootfs source
This fixes the issue described in the first 'netkeys' commit, where the network would need to be available even when it was not used. The "ipappend" option results in a $BOOTIF variable in the initrd environment. This variable is now used to determine whether to wait on the network for a rootfs & keys, or to wait on the boot device becoming available to determine whether it has the keys. That is, there may or may not be a boot device which may or may not have keys and/or rootfs, but we will always know for sure whether it does, therefore there are no races and no waiting on the network unnecessarily. The qemu.sh script was updated to provide the BOOTIF variable when PXE boot is emulated.
-rw-r--r--initramfs-tools/scripts/samizdat19
-rw-r--r--isolinux/pxelinux.cfg/default3
-rw-r--r--src/initrd/btrfs-create.sh24
-rwxr-xr-xsrc/initrd/grok-block7
-rwxr-xr-xsrc/qemu.sh16
5 files changed, 47 insertions, 22 deletions
diff --git a/initramfs-tools/scripts/samizdat b/initramfs-tools/scripts/samizdat
index 515b724..a42b321 100644
--- a/initramfs-tools/scripts/samizdat
+++ b/initramfs-tools/scripts/samizdat
@@ -8,20 +8,29 @@ mountroot()
8 samizdat_install_udev_rules 8 samizdat_install_udev_rules
9 9
10 if [ "${nbdroot%%,*}" ]; then 10 if [ "${nbdroot%%,*}" ]; then
11 # I guess this isn't getting called otherwise? I don't know why this should 11 (. common.sh
12 # be necessary, but it is. 12 sh /scripts/local-top/nbd >/dev/null 2>&1;
13 sh /scripts/local-top/nbd >/dev/null 2>&1 13 bootdone nbd-script) &
14 fi 14 fi
15 15
16 if keys_via_network; then 16 if ! cdrom_has_keys && keys_via_network; then
17 wait_for_gnupghome_tar "$tftp_key_server" 17 bootwait nbd-script
18 wait_for_gnupghome_tar "$tftp_key_server"
18 fi 19 fi
20
19 bootwait samizdat-gpg 21 bootwait samizdat-gpg
20 bootmenu 22 bootmenu
21 bootwait root-mounted 23 bootwait root-mounted
22 chvt 1 24 chvt 1
23} 25}
24 26
27cdrom_has_keys()
28{
29 [ ! "$BOOTIF" ] || return
30 bootwait samizdat-cdrom
31 [ -d /cdrom/gnupghome ]
32}
33
25# Sets $tftp_key_server or returns false. 34# Sets $tftp_key_server or returns false.
26keys_via_network() 35keys_via_network()
27{ 36{
diff --git a/isolinux/pxelinux.cfg/default b/isolinux/pxelinux.cfg/default
index 77796b3..4dc57fc 100644
--- a/isolinux/pxelinux.cfg/default
+++ b/isolinux/pxelinux.cfg/default
@@ -2,4 +2,5 @@ default samizdat
2label samizdat 2label samizdat
3 linux linux/vmlinuz 3 linux linux/vmlinuz
4 initrd linux/initrd.img 4 initrd linux/initrd.img
5 append boot=samizdat components quiet splash nbdroot=192.168.10.1,samizdat.btrfs nbddev=/dev/nbd0 ip=dhcp netkeys 5 ipappend 0x3
6 append boot=samizdat components quiet splash nbdroot=192.168.10.1,samizdat.btrfs nbddev=/dev/nbd0 netkeys
diff --git a/src/initrd/btrfs-create.sh b/src/initrd/btrfs-create.sh
index a1a53ed..8a0cd87 100644
--- a/src/initrd/btrfs-create.sh
+++ b/src/initrd/btrfs-create.sh
@@ -27,22 +27,28 @@ ceil4()
27 printf '%d\n' "$x" 27 printf '%d\n' "$x"
28} 28}
29 29
30cdrom_has_rootfs()
31{
32 [ ! "$BOOTIF" ] || return
33 bootwait samizdat-cdrom
34 [ -d /cdrom/rootfs ]
35}
36
30losetup_layers() 37losetup_layers()
31{ 38{
32 if netbooting; then 39 if cdrom_has_rootfs; then
40 local fs fs_rw
41 for fs in /cdrom/rootfs/*.btrfs; do
42 fs_rw=/"${fs##*/}".rw
43 dd if=/dev/zero of="$fs_rw" bs=1M count=10
44 losetup_snapshot "$fs" "$fs_rw" || return
45 done
46 else
33 bootwait samizdat-nbd-dev 47 bootwait samizdat-nbd-dev
34 dd if=/dev/zero of=/nbd0.rw bs=1M count=10 48 dd if=/dev/zero of=/nbd0.rw bs=1M count=10
35 dm_snapshot /dev/nbd0 /nbd0.rw 49 dm_snapshot /dev/nbd0 /nbd0.rw
36 return 50 return
37 fi 51 fi
38
39 bootwait samizdat-cdrom
40 local fs fs_rw
41 for fs in /cdrom/rootfs/*.btrfs; do
42 fs_rw=/"${fs##*/}".rw
43 dd if=/dev/zero of="$fs_rw" bs=1M count=10
44 losetup_snapshot "$fs" "$fs_rw" || return
45 done
46} 52}
47 53
48init_samizdat() 54init_samizdat()
diff --git a/src/initrd/grok-block b/src/initrd/grok-block
index 3ad0432..f44ed19 100755
--- a/src/initrd/grok-block
+++ b/src/initrd/grok-block
@@ -150,8 +150,11 @@ grok_block()
150 # because while it's mounted, the dmsetup stuff will fail with device busy. 150 # because while it's mounted, the dmsetup stuff will fail with device busy.
151 /dev/nbd0) 151 /dev/nbd0)
152 if [ -e /bootwait/samizdat-nbd-dev ] 152 if [ -e /bootwait/samizdat-nbd-dev ]
153 then return 153 then
154 else wait_for_files_ /sys/block/nbd0/pid 154 return
155 else
156 bootwait nbd-script
157 wait_for_files_ /sys/block/nbd0/pid
155 fi 158 fi
156 ;; 159 ;;
157 esac 160 esac
diff --git a/src/qemu.sh b/src/qemu.sh
index b095eb8..3b8cdec 100755
--- a/src/qemu.sh
+++ b/src/qemu.sh
@@ -12,6 +12,8 @@ layered=${samizdat_iso_dir}/${iso%.iso}.layered.iso
12 12
13initrd.sh || { echo "initrd.sh failed" >&2; exit 1; }; 13initrd.sh || { echo "initrd.sh failed" >&2; exit 1; };
14 14
15[ "$NO_NET" ] || USE_NET=y
16
15NET='tap,vlan=0,ifname=tap0,script=no,downscript=no' 17NET='tap,vlan=0,ifname=tap0,script=no,downscript=no'
16 18
17[ "$SLOW_BOOT" ] || QEMU_LOADS_LINUX=y 19[ "$SLOW_BOOT" ] || QEMU_LOADS_LINUX=y
@@ -21,9 +23,13 @@ NET='tap,vlan=0,ifname=tap0,script=no,downscript=no'
21 23
22initrd=${samizdat_isolinux_dir}/linux/initrd.img 24initrd=${samizdat_isolinux_dir}/linux/initrd.img
23kernel=${samizdat_isolinux_dir}/linux/vmlinuz 25kernel=${samizdat_isolinux_dir}/linux/vmlinuz
24 kcmdline_NET='boot=samizdat components quiet splash nbdroot=192.168.10.1,samizdat.btrfs nbddev=/dev/nbd0 ip=dhcp netkeys'
25kcmdline_CDROM_NET='boot=samizdat components quiet splash nbdroot=192.168.10.1,samizdat.btrfs nbddev=/dev/nbd0 ip=dhcp'
26kcmdline_CDROM='boot=samizdat components quiet splash' 26kcmdline_CDROM='boot=samizdat components quiet splash'
27kcmdline_CDROM_NET="${kcmdline_CDROM} nbdroot=192.168.10.1,samizdat.btrfs nbddev=/dev/nbd0 ip=dhcp"
28kcmdline_NET="${kcmdline_CDROM_NET} netkeys"
29
30MAC='52-54-00-12-34-56'
31
32kcmdline_BOOTIF="BOOTIF=01-$MAC"
27 33
28set -- 34set --
29if [ "$USE_ISO" ]; then 35if [ "$USE_ISO" ]; then
@@ -40,7 +46,7 @@ if [ "$USE_ISO" ]; then
40 fi 46 fi
41else 47else
42 if [ "$QEMU_LOADS_LINUX" ]; then 48 if [ "$QEMU_LOADS_LINUX" ]; then
43 set -- "$@" -initrd "$initrd" -kernel "$kernel" -append "$kcmdline_NET" 49 set -- "$@" -initrd "$initrd" -kernel "$kernel" -append "$kcmdline_NET $kcmdline_BOOTIF"
44 else 50 else
45 set -- "$@" -boot n 51 set -- "$@" -boot n
46 fi 52 fi
@@ -49,8 +55,8 @@ fi
49set -x 55set -x
50sudo qemu-system-x86_64 -enable-kvm -smp 2 -m 640 -k en-us \ 56sudo qemu-system-x86_64 -enable-kvm -smp 2 -m 640 -k en-us \
51 -vga qxl \ 57 -vga qxl \
52 -net nic,vlan=0,model=virtio \ 58 -net nic,vlan=0,model=virtio,macaddr=$MAC \
53 -net "$NET" \ 59 ${USE_NET:+ -net "$NET"} \
54 -rtc base=localtime \ 60 -rtc base=localtime \
55 -hda "$disk" \ 61 -hda "$disk" \
56 "$@" 62 "$@"