From c470b6ca6075b33c2c696ca34070671ee32a8d76 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Sun, 26 Mar 2017 07:30:09 -0400 Subject: Implement booting already-installed native install This option is only available if the partitions have been renamed to indicate finalization of the install. The code that finalizes the install by renaming the partitions is available, but not yet run after the install. --- src/initrd/btrfs-create.sh | 22 ++++++++++++++++++---- src/initrd/grok-block | 22 +++++++++++++++++++++- src/initrd/menu-select | 10 +++++++++- 3 files changed, 48 insertions(+), 6 deletions(-) (limited to 'src/initrd') diff --git a/src/initrd/btrfs-create.sh b/src/initrd/btrfs-create.sh index b5cc2c5..f31b14d 100644 --- a/src/initrd/btrfs-create.sh +++ b/src/initrd/btrfs-create.sh @@ -184,10 +184,18 @@ partition_new_hard_drive_DESTROYING_EVERYTHING() udevadm settle } +mark_partitions_as_complete() +{ + local dev="$1" + # TODO: Verify existing names + parted "$dev" -sm \ + name 1 samizdat-grub \ + name 2 samizdat-plaintext \ + name 3 samizdat-luks-encrypted +} + open_samizdat() { - local imgfile="$1" keyfile="$2" - open_samizdat_blockdev "$imgfile" "$keyfile" || return local blockdev=/dev/mapper/samizdatcrypt fs # For this part, we don't necessarily need the cdrom. @@ -211,12 +219,18 @@ init_samizdat_lodev() echo "$dev" } -open_samizdat_blockdev() +open_samizdat_blockdev_from_loop() { local imgfile="$1" keyfile="$2" dev - local cryptname=samizdatcrypt dev=$(losetup -f) && losetup "$dev" "$imgfile" || return + open_samizdat_blockdev "$dev" "$keyfile" +} +open_samizdat_blockdev() +{ + local dev="$1" keyfile="$2" + + local cryptname=samizdatcrypt gpg2 --verify "$keyfile" || return # The first --decrypt merely strips the signature. The option is # poorly named for that case. diff --git a/src/initrd/grok-block b/src/initrd/grok-block index 01265b0..1152584 100755 --- a/src/initrd/grok-block +++ b/src/initrd/grok-block @@ -36,6 +36,14 @@ addmenu_chooseroot() "menu-select --fs=$ID_FS_TYPE boot-luks $device ${loopfile:-$device}" } +addmenu_choose_native_root() +{ + local device="$1" loopfile="$2" + addmenu "$device//$device" \ + "[ Boot the system on $device ]" \ + "menu-select --fs=$ID_FS_TYPE boot-native $device" +} + addmenu_makeroot() { local device="$1" loopfile="$2" megs="$3" copy_cdrom="$4" @@ -50,7 +58,7 @@ addmenu_destroy_hard_drive() { local device="$1" ( - addmenu "$device//$loopfile" \ + addmenu "$device//$device" \ "[ Install Samizdat to $device -- THIS DESTROYS ALL DATA ]" \ "menu-select boot-destroy-disk $device" ) & @@ -108,6 +116,13 @@ is_incomplete_samizdat_install() [ "$partition_names" = 'samizdat-grub-incomplete:samizdat-plaintext-incomplete:samizdat-luks-encrypted-incomplete:' ] } +parent_device() +{ + local d="$1" + while [ "$d" != "${d%[0-9]}" ]; do d=${d%[0-9]}; done + printf '%s' "$d" +} + grok_block() { local mountpoint="/mnt/${DEVNAME##*/}" @@ -124,6 +139,11 @@ grok_block() # TODO: make these names more unique case "$ID_PART_ENTRY_NAME" in samizdat-grub-incomplete|samizdat-plaintext-incomplete|samizdat-luks-encrypted-incomplete) return ;; + samizdat-grub|samizdat-plaintext|samizdat-luks-encrypted) + # TODO: Possibly only some of these are complete + addmenu_choose_native_root "$(parent_device "$DEVNAME")" + return + ;; esac if [ "$ID_FS_TYPE" = hfsplus ] && ! fsck.hfsplus -q "$DEVNAME"; then diff --git a/src/initrd/menu-select b/src/initrd/menu-select index 4a141a4..625f775 100755 --- a/src/initrd/menu-select +++ b/src/initrd/menu-select @@ -94,6 +94,13 @@ case "$1" in init_samizdat /dev/mapper/samizdatcrypt '' || error ;; + boot-native) + dev="$2" + init_gpg || error + mount "$dev"2 /gpg || error + open_samizdat_blockdev "$dev"3 /gpg/disk.key || error + open_samizdat || error + ;; boot-overwrite|boot-new|boot-luks) dev="$2" loopfile="$3" @@ -112,7 +119,8 @@ case "$1" in init_gpg || error if [ "$1" = 'boot-luks' ]; then - open_samizdat "$loopfile" "$loopfile"k || error + open_samizdat_blockdev_from_loop "$loopfile" "$loopfile"k || error + open_samizdat || error exit fi -- cgit v1.2.3