From 61a047b623e86334546e510717dd68cb482f932b Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Thu, 25 Feb 2021 16:01:35 -0500 Subject: partvi: fixes related to key-only mode fixed race condition in kpartx fix for sfdisk kernel reload ptable failure cleaned up some code duplication created make keymu target amended make clean target --- partitions/Makefile | 13 +++++-- src/partvi | 109 +++++++++++++++++++++++++++------------------------- 2 files changed, 66 insertions(+), 56 deletions(-) diff --git a/partitions/Makefile b/partitions/Makefile index a1a7fea..f8ef259 100644 --- a/partitions/Makefile +++ b/partitions/Makefile @@ -9,17 +9,22 @@ whole.img: key.img: partvi key -.PHONY: usb emu key +.PHONY: usb emu key emu-key keymu usb: whole.img usb=$$(usb) && sudo dd status=progress if="$<" of="$$usb" +emu = qemu-system-x86_64 -m 800 -enable-kvm -boot c + emu: whole.img - qemu-system-x86_64 -m 800 -enable-kvm -boot c "$<" + $(emu) $< + +emu-key keymu: key.img + $(emu) $< key: key.img usb=$$(usb) && \ sudo dd status=progress bs=1048576 if="$<" of="$$usb" && \ - sudo qemu-system-x86_64 -m 800 -enable-kvm -boot c "$$usb" + sudo $(emu) "$$usb" clean: - rm -rf _build whole.img + rm -rf _build whole.img key.img diff --git a/src/partvi b/src/partvi index ddf4e45..154e35f 100755 --- a/src/partvi +++ b/src/partvi @@ -174,6 +174,7 @@ iterate_partitions() imgfile=$builddir/$img + check_for_key_only_skip || continue "$@" || return done } @@ -207,7 +208,6 @@ create_ptable_conf() partition-table) start=$((start + devsz)); return;; efi-system-partition) typecode=C12A7328-F81F-11D2-BA4B-00A0C93EC93B ;; dm-verity-data|dm-verity-hashes) - check_for_key_only_skip || return 0 case "$name" in samizdat-rootfs|samizdat-root-patch) typecode=4f68bce3-e8cd-4db1-96e7-fbcaf984b709 ;; samizdat-root-patch-verity) typecode=2c7357ed-ebd2-46d9-aec1-23d437ec2bf5 ;; @@ -249,38 +249,6 @@ create_ptable_conf() start=$((start + devsz)) } -KEY_ONLY= -if [ "$1" = 'key' ] -then - KEY_ONLY=y -fi - -set -e - -builddir=_build -mkdir -p "$builddir" - -iterate_partitions build_partition_image - -if [ "$UID" = 0 ] -then sudo= -else sudo=sudo -fi - -if [ "$KEY_ONLY" ] -then - target=key.img -else - target=whole.img -fi - -if whole=$(losetup -j "$target" -O NAME --noheadings) -then - quietly $sudo umount *.mnt - quietly $sudo kpartx -dv "$whole" - quietly $sudo losetup -D -fi - sfdisk_init() { local DEV LAST LAST_LBA @@ -315,9 +283,11 @@ pee_on_table() : > "$DOS_TABLE_FILE" iterate_partitions create_ptable_conf - set -x - $sudo sfdisk "$dev" < "$GPT_TABLE_FILE" || return - $sudo sfdisk -Y dos "$dev" < "$DOS_TABLE_FILE" || return + ( + set -x + $sudo sfdisk --no-tell-kernel "$dev" < "$GPT_TABLE_FILE" || return + $sudo sfdisk --no-tell-kernel -Y dos "$dev" < "$DOS_TABLE_FILE" || return + ) } check_for_key_only_skip() @@ -332,19 +302,67 @@ check_for_key_only_skip() clone_parts_to_target() { - check_for_key_only_skip || return 0 f=$(readlink -e _build/"${f%.conf}") || return ficlonerange.py "$f" "$target" } +cleanup() +{ + for f in part*.conf + do + mnt=${f%.conf}.mnt + if mountpoint -q "$mnt" + then + loudly $sudo umount "$mnt" + $sudo rmdir "$mnt" + fi + done + if [ "$whole" ] + then + loudly $sudo kpartx -sd "$whole" + loudly $sudo losetup -d "$whole" + fi +} + +KEY_ONLY= +if [ "$1" = 'key' ] +then + KEY_ONLY=y +fi + +set -e + +builddir=_build +mkdir -p "$builddir" + +if [ "$UID" = 0 ] +then sudo= +else sudo=sudo +fi + +if [ "$KEY_ONLY" ] +then + target=key.img +else + target=whole.img +fi + +iterate_partitions build_partition_image + +if whole=$(losetup -j "$target" -O NAME --noheadings) +then + cleanup + whole= +fi truncate -s0 "$target" iterate_partitions clone_parts_to_target $sudo losetup -L -f "$target" whole=$(losetup -j "$target" -O NAME --noheadings) -(pee_on_table "$whole") || exit +pee_on_table "$whole" +$sudo kpartx -su "$whole" -$sudo kpartx -u "$whole" +trap cleanup EXIT for f in part*.conf do @@ -381,16 +399,3 @@ do done loudly $sudo eatmydata -- grub-install --target=i386-pc --recheck --boot-directory="$BOOT_DIR" "$whole" -loudly $sudo eatmydata -- grub-install --target=x86_64-efi --recheck --removable --efi-directory="$EFI_DIR" "$whole" - -for f in part*.conf -do - mnt=${f%.conf}.mnt - if mountpoint -q "$mnt" - then - loudly $sudo umount "$mnt" - $sudo rmdir "$mnt" - fi -done -loudly $sudo kpartx -d "$whole" -loudly $sudo losetup -d "$whole" -- cgit v1.2.3