#!/bin/bash die() { printf 'Error: %s\n' "$*" >&2 exit 1 } KiB() { printf %s $(("$1" * 1024)) } MiB() { KiB $(KiB "$1") } initialize_target() { rm -f "$target" fallocate -l $(($(KiB 17) + $(MiB $end_keys))) "$target" } partition_target() { parted "$target" -sm -a optimal \ unit B \ mklabel gpt \ mkpart samizdat-grub 1MiB 8MiB \ set 1 bios_grub on \ mkpart samizdat-plaintext btrfs ${start_keys}MiB ${end_keys}MiB } make_target_bootable() { losetup -f "$target" dev=$(losetup -j "$target" -O NAME --noheadings) kpartx -vasas "$dev" kdev=/dev/mapper/${dev##*/} mnt=$target.mnt mkfs.btrfs --mixed "$kdev"p2 mkdir -p "$mnt" mount "$kdev"p2 "$mnt" mkdir -p "$mnt"/boot/grub cp -aL "$GRUB_CONFIG" "$mnt"/boot/grub eatmydata -- grub-install -v --boot-directory "$mnt"/boot "$dev" sync } release_target() { umount "$mnt" kpartx -d "$dev" losetup -d "$dev" } with_target() { local mnt dev target="$1" shift mnt=$target.mnt mkdir -p "$mnt" losetup -f "$target" -o $(MiB $start_keys) dev=$(losetup -j "$target" -O NAME --noheadings) mount "$dev" "$mnt" "$@" umount "$mnt" losetup -d "$dev" } add_keys() { rsync -a --info=STATS "$GPG_INPUT_DIR"/ "$mnt"/gnupghome/ } add_initrd() { rsync -aL --info=STATS "$samizdat_linux_dir"/vmlinuz${version} "$samizdat_linux_dir"/initrd.img${version} "$mnt"/linux/ } add_grub_cfg() { mkdir -p "$mnt"/boot/grub cp -aL "$GRUB_CONFIG" "$mnt"/boot/grub } add_all() { add_keys add_initrd add_grub_cfg } sanity_checks() { [[ $UID = 0 ]] || die "You are not root." for d in "$samizdat_linux_dir" "$GPG_INPUT_DIR" do [ -d "$d" ] || die "Not a directory: $d" done } . samizdat-paths.sh || die 'samizdat-paths.sh not found' samizdat_linux_dir=/boot : ${GPG_INPUT_DIR:=/cdrom/gnupghome} : ${GRUB_CONFIG:=grub.cfg} start_keys=64 # megs end_keys=256 # megs target=fallacy.img.tmp sanity_checks set -e if [ ! -e "$target" ] then initialize_target partition_target make_target_bootable release_target fi if [ "$1" ] then version=-$1 fi cp --reflink=always "$target" "$target".keyed with_target "$target".keyed add_all qemu-system-x86_64 -enable-kvm -smp 2 -m 512 -k en-us -vga qxl -drive file="$target".keyed,format=raw # rm -f "$target"