#!/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-destroy-disk [dev-name] - install to a fresh hard disk . btrfs-create.sh . common.sh exec 4>&1 debug_log error() { local sleep=3 clear >&4 echo "error -- ${*:-:(}" >&4 echo "error -- ${*:-:(}" >/dev/tty1 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' -o "$1" = boot-destroy-disk ] || 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 } clear >/dev/tty1 echo -n "Samizdat is attempting to load the root filesystem..." >/dev/tty1 chvt 1 case "$1" in boot-ram) read _ memtotal_kb _ < /proc/meminfo # This doesn't make sense to me, but setting rd_size _lower_ than total # memory seems to be what breaks things ('btrfs device add' hangs forever). # Somehow you can fill up the filesystem and there's still space for # programs and btrfs does not complain. I don't know what is going on here. # BTW, I verified with blockdev that the device size really is being # specified in KB here. I did not really believe it. modprobe brd rd_nr=1 rd_size=$memtotal_kb init_samizdat /dev/ram0 '' || { umount /root/cdrom umount /root/outerfs umount /root error } bootdone root-mounted ;; boot-destroy-disk) dev="$2" umount /plaintext || true partition_new_hard_drive_DESTROYING_EVERYTHING "$dev" || error mkfs.btrfs -f "$dev"2 || error mkdir /plaintext mount "$dev"2 /plaintext || error init_samizdat_blockdev "$dev"3 /plaintext/disk.key || error init_samizdat /dev/mapper/samizdatcrypt '' || error mark_partitions_as_complete "$dev" bootdone root-mounted ;; boot-native) dev="$2" umount /plaintext || true open_samizdat_blockdev "$dev"3 - || error open_samizdat || error open_samizdat 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 if [ "$1" = 'boot-luks' ]; then open_samizdat_blockdev_from_loop "$loopfile" "$loopfile"k || error open_samizdat || error open_samizdat bootdone root-mounted exit fi start_meter "Allocating ${megs}MB in '$loopfile' on $dev..." if newdev=$(init_samizdat_lodev "$loopfile" "$megs") && init_samizdat_blockdev "$newdev" "$loopfile"k && init_samizdat /dev/mapper/samizdatcrypt "$loopfile"; then stop_meter done. bootdone root-mounted 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