diff options
Diffstat (limited to 'src/initrd/menu-select')
-rwxr-xr-x | src/initrd/menu-select | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/initrd/menu-select b/src/initrd/menu-select new file mode 100755 index 0000000..f059052 --- /dev/null +++ b/src/initrd/menu-select | |||
@@ -0,0 +1,123 @@ | |||
1 | #!/bin/sh | ||
2 | # usage: | ||
3 | # $0 boot-ram - use memory-only overlay | ||
4 | # $0 boot-new [dev name] [loop file] [megabytes] - create new luks-encrypted overlay | ||
5 | # $0 boot-overwrite [dev name] [loop file] [megabytes] - overwrite with new luks overlay | ||
6 | # $0 boot-luks [dev name] [loop file] - boot existing luks-encrypted overlay | ||
7 | # $0 boot-gpg [key id] [gnupg homedir] [???] - boot any device signed with the key | ||
8 | |||
9 | . lvm-create.sh | ||
10 | . common.sh | ||
11 | exec 4>&1 | ||
12 | debug_log | ||
13 | |||
14 | error() | ||
15 | { | ||
16 | local sleep=3 | ||
17 | |||
18 | clear >&4 | ||
19 | echo "error -- ${*:-:(}" >&4 | ||
20 | |||
21 | if [ $sleep -gt 0 ]; then | ||
22 | echo "will try again in $sleep seconds..." >&4 | ||
23 | sleep $sleep | ||
24 | fi | ||
25 | bootmenu do_trigger no_panic | ||
26 | exit | ||
27 | } | ||
28 | |||
29 | badopts= | ||
30 | fs= | ||
31 | while [ $# -ge 1 ]; do | ||
32 | case $1 in | ||
33 | --fs=*) fs="${1#--fs=}"; shift; continue ;; | ||
34 | --*) echo "error: unknown option $1"; badopts=true; shift; continue ;; | ||
35 | esac | ||
36 | break | ||
37 | done | ||
38 | [ -z "$badopts" ] || error 'usage error' | ||
39 | |||
40 | [ $# -ge 2 -o "$1" = 'boot-ram' ] || error 'usage error' | ||
41 | |||
42 | remountrw() | ||
43 | { | ||
44 | local fs="$1" dev="$2" loopfile="$3" | ||
45 | if [ "$fs" = hfsplus ]; then | ||
46 | mountpoint="/mnt/${dev##*/}" | ||
47 | umount "$dev" || error | ||
48 | fsck.hfsplus -q "$dev" || error | ||
49 | mount -o force "$dev" "$mountpoint" || error | ||
50 | else | ||
51 | mount -o remount,rw "$dev" || error | ||
52 | fi | ||
53 | } | ||
54 | |||
55 | hwclock_to_system() | ||
56 | { | ||
57 | local fs="$1" UTC=UTC | ||
58 | case "$fs" in ntfs|vfat) UTC=LOCAL ;; esac | ||
59 | printf '0.0 0 0.0\n0\n%s' $UTC > /etc/adjtime | ||
60 | hwclock --hctosys | ||
61 | } | ||
62 | |||
63 | case "$1" in | ||
64 | boot-ram) | ||
65 | read _ memtotal_kb _ < /proc/meminfo | ||
66 | # This doesn't make sense to me, but setting rd_size _lower_ than total | ||
67 | # memory seems to be what breaks things ('btrfs device add' hangs forever). | ||
68 | # Somehow you can fill up the filesystem and there's still space for | ||
69 | # programs and btrfs does not complain. I don't know what is going on here. | ||
70 | |||
71 | # BTW, I verified with blockdev that the device size really is being | ||
72 | # specified in KB here. I did not really believe it. | ||
73 | modprobe brd rd_nr=1 rd_size=$memtotal_kb | ||
74 | |||
75 | init_gpg || error | ||
76 | init_samizdat /dev/ram0 '' || { | ||
77 | umount /root/cdrom | ||
78 | umount /root/outerfs | ||
79 | umount /root | ||
80 | error | ||
81 | } | ||
82 | ;; | ||
83 | boot-overwrite|boot-new|boot-luks) | ||
84 | dev="$2" | ||
85 | loopfile="$3" | ||
86 | megs="$4" | ||
87 | |||
88 | [ "$1" != 'boot-new' -o ! -e "$loopfile" ] || error | ||
89 | |||
90 | remountrw "$fs" "$dev" "$loopfile" || error | ||
91 | |||
92 | hwclock_to_system "$fs" | ||
93 | |||
94 | if [ "$1" = 'boot-overwrite' ]; then | ||
95 | rm "$loopfile" "$loopfile"k | ||
96 | fi | ||
97 | |||
98 | init_gpg || error | ||
99 | |||
100 | if [ "$1" = 'boot-luks' ]; then | ||
101 | open_samizdat "$loopfile" "$loopfile"k || error | ||
102 | exit | ||
103 | fi | ||
104 | |||
105 | start_meter "Allocating ${megs}MB in '$loopfile' on $dev..." | ||
106 | |||
107 | if init_samizdat_blockdev "$loopfile" "$megs" "$loopfile"k && | ||
108 | init_samizdat /dev/mapper/samizdatcrypt "$loopfile"; then | ||
109 | stop_meter done. | ||
110 | else | ||
111 | stop_meter error! | ||
112 | rm "$loopfile" "$loopfile"k | ||
113 | dmsetup remove samizdatcrypt | ||
114 | # TODO: more teardown | ||
115 | error | ||
116 | fi | ||
117 | ;; | ||
118 | *) | ||
119 | error "Unimplemented boot command: $*" | ||
120 | ;; | ||
121 | esac | ||
122 | |||
123 | # vim:ts=2 sw=2 et | ||