#!/bin/bash die() { printf 'Error: %s\n' "$*" >&2 exit 1 } KiB() { printf %s $(("$1" * 1024)) } MiB() { KiB $(KiB "$1") } . samizdat-paths.sh || die 'samizdat-paths.sh not found' : ${GPG_INPUT_DIR:=/cdrom/gnupghome} if [[ $UID != 0 ]] then exit 1 fi for d in "$samizdat_linux_dir" "$GPG_INPUT_DIR" do if ! test -d "$d" then exit 1 fi done end_keys=256 # megs target=fallacy.img.tmp 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-keys btrfs 64MiB ${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" rsync -a --info=STATS "$GPG_INPUT_DIR"/ "$mnt"/gnupghome/ rsync -a --info=STATS "$samizdat_linux_dir"/ "$mnt"/linux/ boot_dir=$mnt/boot mkdir -p "$boot_dir"/grub cp -a grub.cfg "$boot_dir"/grub # grub-install -v -d "$samizdat_grub_efi_dir"/grub/i386-pc --boot-directory "$mnt"/boot "$dev" grub-install -v --boot-directory "$boot_dir" "$dev" } release_target() { umount "$mnt" kpartx -d "$dev" losetup -d "$dev" } set -e if [ ! -e "$target" ] then initialize_target partition_target make_target_bootable release_target fi qemu-system-x86_64 -enable-kvm -drive file="$target",format=raw # rm -f "$target"