#!/bin/sh # usage: # $0 boot-ram - use memory-only overlay # $0 boot-new [dev name] [loop file] [megabytes] - create new luks-encrypted overlay # $0 boot-overwrite [dev name] [loop file] [megabytes] - overwrite with new luks overlay # $0 boot-luks [dev name] [loop file] - boot existing luks-encrypted overlay # $0 boot-gpg [key id] [gnupg homedir] [???] - boot any device signed with the key . lvm-create.sh . common.sh exec 4>&1 debug_log error() { local sleep=3 clear >&4 echo "error -- ${*:-:(}" >&4 if [ $sleep -gt 0 ]; then echo "will try again in $sleep seconds..." >&4 sleep $sleep fi bootmenu do_trigger no_panic exit } badopts= fs= while [ $# -ge 1 ]; do case $1 in --fs=*) fs="${1#--fs=}"; shift; continue ;; --*) echo "error: unknown option $1"; badopts=true; shift; continue ;; esac break done [ -z "$badopts" ] || error 'usage error' [ $# -ge 2 -o "$1" = 'boot-ram' ] || error 'usage error' remountrw() { local fs="$1" dev="$2" loopfile="$3" if [ "$fs" = hfsplus ]; then mountpoint="/mnt/${dev##*/}" umount "$dev" || error fsck.hfsplus -q "$dev" || error mount -o force "$dev" "$mountpoint" || error else mount -o remount,rw "$dev" || error fi } hwclock_to_system() { local fs="$1" UTC=UTC case "$fs" in ntfs|vfat) UTC=LOCAL ;; esac printf '0.0 0 0.0\n0\n%s' $UTC > /etc/adjtime hwclock --hctosys } case "$1" in boot-ram) mkdir /cdrom /btrfs bootwait samizdat-cdrom losetup_layers || error modprobe btrfs || error btrfs device scan || error uuid=$(choose_uuid) || error [ "$uuid" ] || error mount -t btrfs -o loop,subvol=ROOT UUID="$uuid" /btrfs memtotal=$(sed -ne 's/MemTotal: *//p' /proc/meminfo) ramdisk=$((1024 * ${memtotal% *} / 2)) [ $ramdisk -ge 256 ] || ramdisk=256 modprobe brd rd_size=$ramdisk btrfs device add /dev/ram0 /btrfs mount -o rw,remount /btrfs mount -o move /btrfs /root mkdir /root/cdrom mount -o move /cdrom /root/cdrom bootdone root-mounted ;; boot-overwrite|boot-new|boot-luks) dev="$2" loopfile="$3" megs="$4" [ "$1" != 'boot-new' -o ! -e "$loopfile" ] || error remountrw "$fs" "$dev" "$loopfile" || error hwclock_to_system "$fs" if [ "$1" = 'boot-overwrite' ]; then rm "$loopfile" "$loopfile"k fi init_gpg || error if [ "$1" = 'boot-luks' ]; then open_samizdat "$loopfile" "$loopfile"k || error exit fi start_meter "Allocating ${megs}MB in '$loopfile' on $dev..." if init_samizdat "$loopfile" "$megs" "$loopfile"k; then stop_meter done. else stop_meter error! rm "$loopfile" "$loopfile"k dmsetup remove samizdatcrypt # TODO: more teardown error fi ;; *) error "Unimplemented boot command: $*" ;; esac # vim:ts=2 sw=2 et