diff options
Diffstat (limited to 'src/parted-usb.sh')
-rwxr-xr-x | src/parted-usb.sh | 111 |
1 files changed, 48 insertions, 63 deletions
diff --git a/src/parted-usb.sh b/src/parted-usb.sh index 8c3c048..c7040c8 100755 --- a/src/parted-usb.sh +++ b/src/parted-usb.sh | |||
@@ -51,21 +51,6 @@ partition_target() | |||
51 | 51 | ||
52 | make_target_bootable() | 52 | make_target_bootable() |
53 | { | 53 | { |
54 | if [ -b "$target" ] | ||
55 | then | ||
56 | dev=$target | ||
57 | part=$target | ||
58 | mnt=/mnt/${target#/dev/} | ||
59 | else | ||
60 | losetup -f "$target" | ||
61 | dev=$(losetup -j "$target" -O NAME --noheadings) | ||
62 | |||
63 | kpartx -vasas "$dev" | ||
64 | part=/dev/mapper/${dev##*/}p | ||
65 | |||
66 | mnt=$target.mnt | ||
67 | fi | ||
68 | |||
69 | mkfs.btrfs -f --mixed "$part"2 | 54 | mkfs.btrfs -f --mixed "$part"2 |
70 | mkdir -p "$mnt" | 55 | mkdir -p "$mnt" |
71 | mount "$part"2 "$mnt" | 56 | mount "$part"2 "$mnt" |
@@ -77,39 +62,39 @@ make_target_bootable() | |||
77 | sync | 62 | sync |
78 | } | 63 | } |
79 | 64 | ||
80 | release_target_kernel_resources() | 65 | acquire_target_block_devices() |
81 | { | 66 | { |
82 | umount "$mnt" | ||
83 | case "$dev" in | ||
84 | /dev/loop*) | ||
85 | kpartx -d "$dev" | ||
86 | losetup -d "$dev" | ||
87 | ;; | ||
88 | esac | ||
89 | } | ||
90 | |||
91 | with_target() | ||
92 | { | ||
93 | local mnt dev target="$1" | ||
94 | shift | ||
95 | if [ -b "$target" ] | 67 | if [ -b "$target" ] |
96 | then | 68 | then |
69 | dev=$target | ||
70 | part=$target | ||
97 | mnt=/mnt/${target#/dev/} | 71 | mnt=/mnt/${target#/dev/} |
98 | dev=${target}2 | ||
99 | else | 72 | else |
100 | losetup -f "$target" -o $(MiB $start_keys) | 73 | trap release_target_block_devices EXIT |
74 | losetup -f "$target" | ||
101 | dev=$(losetup -j "$target" -O NAME --noheadings) | 75 | dev=$(losetup -j "$target" -O NAME --noheadings) |
76 | |||
77 | kpartx -vasas "$dev" | ||
78 | part=/dev/mapper/${dev##*/}p | ||
79 | |||
102 | mnt=$target.mnt | 80 | mnt=$target.mnt |
103 | fi | 81 | fi |
82 | } | ||
104 | 83 | ||
105 | mkdir -p "$mnt" | 84 | release_target_block_devices() |
106 | mount "$dev" "$mnt" | 85 | { |
107 | "$@" | 86 | ( |
108 | umount "$mnt" | 87 | set +e |
109 | 88 | [ -z "$mnt" ] || ! mountpoint "$mnt" || umount "$mnt" | |
110 | case "$dev" in | 89 | case "$dev" in |
111 | /dev/loop*) losetup -d "$dev" ;; | 90 | /dev/loop*) |
112 | esac | 91 | kpartx -d "$dev" |
92 | losetup -d "$dev" | ||
93 | ;; | ||
94 | esac | ||
95 | true | ||
96 | ) | ||
97 | unset mnt dev | ||
113 | } | 98 | } |
114 | 99 | ||
115 | add_keys() | 100 | add_keys() |
@@ -117,9 +102,9 @@ add_keys() | |||
117 | rsync -a --info=STATS "$GPG_INPUT_DIR"/ "$mnt"/gnupghome/ | 102 | rsync -a --info=STATS "$GPG_INPUT_DIR"/ "$mnt"/gnupghome/ |
118 | } | 103 | } |
119 | 104 | ||
120 | initrd_suffix=.samizdat | ||
121 | add_initrd() | 105 | add_initrd() |
122 | { | 106 | { |
107 | initrd_suffix=.samizdat | ||
123 | mkdir -p "$mnt"/linux | 108 | mkdir -p "$mnt"/linux |
124 | rsync -aL --info=STATS "${1}vmlinuz${2}" "$mnt"/linux/vmlinuz | 109 | rsync -aL --info=STATS "${1}vmlinuz${2}" "$mnt"/linux/vmlinuz |
125 | rsync -aL --info=STATS "${1}initrd.img${2}${initrd_suffix}" "$mnt"/linux/initrd.img | 110 | rsync -aL --info=STATS "${1}initrd.img${2}${initrd_suffix}" "$mnt"/linux/initrd.img |
@@ -133,6 +118,7 @@ add_grub_cfg() | |||
133 | 118 | ||
134 | individualize() | 119 | individualize() |
135 | { | 120 | { |
121 | mountpoint "$mnt" || mount "$part"2 "$mnt" | ||
136 | add_keys | 122 | add_keys |
137 | add_initrd "$samizdat_linux_dir"/ "${version_suffix}" | 123 | add_initrd "$samizdat_linux_dir"/ "${version_suffix}" |
138 | add_grub_cfg | 124 | add_grub_cfg |
@@ -140,14 +126,10 @@ individualize() | |||
140 | 126 | ||
141 | globalize() | 127 | globalize() |
142 | { | 128 | { |
143 | : initialize | ||
144 | initialize_target | 129 | initialize_target |
145 | : partition | ||
146 | partition_target | 130 | partition_target |
147 | : install-grub | 131 | acquire_target_block_devices |
148 | make_target_bootable | 132 | make_target_bootable |
149 | : release | ||
150 | release_target_kernel_resources | ||
151 | } | 133 | } |
152 | 134 | ||
153 | sanity_checks() | 135 | sanity_checks() |
@@ -159,12 +141,6 @@ sanity_checks() | |||
159 | done | 141 | done |
160 | } | 142 | } |
161 | 143 | ||
162 | individualize_target_from() | ||
163 | { | ||
164 | cp -T --reflink=always "$1" "$target" | ||
165 | with_target "$target" individualize | ||
166 | } | ||
167 | |||
168 | find_mac() | 144 | find_mac() |
169 | { | 145 | { |
170 | start_mac=$1 | 146 | start_mac=$1 |
@@ -181,7 +157,9 @@ find_mac() | |||
181 | 157 | ||
182 | boot_vm() | 158 | boot_vm() |
183 | { | 159 | { |
160 | boot_drive=$1 | ||
184 | installer_target=samizdat.disk.img | 161 | installer_target=samizdat.disk.img |
162 | |||
185 | if [ ! -e "$installer_target" ] | 163 | if [ ! -e "$installer_target" ] |
186 | then | 164 | then |
187 | fallocate -l 15G "$installer_target" | 165 | fallocate -l 15G "$installer_target" |
@@ -195,7 +173,7 @@ boot_vm() | |||
195 | -k en-us \ | 173 | -k en-us \ |
196 | -net nic,model=virtio,macaddr=$MAC \ | 174 | -net nic,model=virtio,macaddr=$MAC \ |
197 | -vga qxl \ | 175 | -vga qxl \ |
198 | -drive file="$final",format=raw \ | 176 | -drive file="$boot_drive",format=raw \ |
199 | -drive file="$installer_target",format=raw | 177 | -drive file="$installer_target",format=raw |
200 | } | 178 | } |
201 | 179 | ||
@@ -206,31 +184,38 @@ samizdat_linux_dir=/boot | |||
206 | start_keys=64 # megs | 184 | start_keys=64 # megs |
207 | end_keys=256 # megs | 185 | end_keys=256 # megs |
208 | 186 | ||
209 | if [ "$1" ] | 187 | if [ "$KERNEL_VERSION" ] |
210 | then | 188 | then |
211 | version_suffix=-$1 | 189 | version_suffix=-$KERNEL_VERSION |
212 | fi | 190 | fi |
213 | 191 | ||
214 | sanity_checks | 192 | sanity_checks |
215 | set -e | 193 | set -e |
216 | 194 | ||
217 | if [ "$TARGET" ] | 195 | if [ "$1" ] |
218 | then | 196 | then |
219 | target=$TARGET globalize | 197 | [ -b "$1" ] || die "Not a block device: $1" |
220 | with_target "$TARGET" individualize | 198 | target=$1 |
221 | final=$TARGET | 199 | globalize |
222 | boot_vm | 200 | individualize |
201 | release_target_block_devices | ||
223 | else | 202 | else |
224 | template=boot-disk.template.img | 203 | template=boot-disk.template.img |
225 | target=boot-disk.img.tmp | ||
226 | final=${target%.tmp} | ||
227 | if [ ! -e "$template" ] | 204 | if [ ! -e "$template" ] |
228 | then | 205 | then |
229 | target="$template".tmp globalize | 206 | target="$template".tmp globalize |
207 | release_target_block_devices | ||
230 | mv -T "$template".tmp "$template" | 208 | mv -T "$template".tmp "$template" |
231 | fi | 209 | fi |
210 | |||
211 | target=boot-disk.img.tmp | ||
232 | cp -T --reflink=always "$template" "$target" | 212 | cp -T --reflink=always "$template" "$target" |
233 | with_target "$target" individualize | 213 | acquire_target_block_devices |
214 | individualize | ||
215 | release_target_block_devices | ||
216 | |||
217 | final=${target%.tmp} | ||
234 | mv -T "$target" "$final" | 218 | mv -T "$target" "$final" |
235 | boot_vm | 219 | target=$final |
236 | fi | 220 | fi |
221 | boot_vm "$target" | ||