diff options
author | Andrew Cady <d@cryptonomic.net> | 2021-01-18 18:09:15 -0500 |
---|---|---|
committer | Andrew Cady <d@cryptonomic.net> | 2021-01-18 18:09:15 -0500 |
commit | 93c785ab5b3d42a053508a9d6cf57c3f9062e91d (patch) | |
tree | 4cb5c29b9b332b0b6fc4c4c56c56f1cdac122a28 /src/partvi | |
parent | c70db0da13bc29e3d82339f5457911c95c15a94b (diff) |
got zero-copy partitioning to work w/ btrfs and sfdisk
Diffstat (limited to 'src/partvi')
-rwxr-xr-x | src/partvi | 115 |
1 files changed, 90 insertions, 25 deletions
@@ -137,7 +137,7 @@ iterate_partitions() | |||
137 | 137 | ||
138 | imgfile=$builddir/$img | 138 | imgfile=$builddir/$img |
139 | 139 | ||
140 | "$@" | 140 | "$@" || return |
141 | done | 141 | done |
142 | } | 142 | } |
143 | 143 | ||
@@ -177,13 +177,24 @@ create_dmsetup_map() | |||
177 | fi | 177 | fi |
178 | } | 178 | } |
179 | 179 | ||
180 | create_ptable_conf_debug() | ||
181 | { | ||
182 | set -x | ||
183 | create_ptable_conf "$@" | ||
184 | set +x | ||
185 | } | ||
186 | |||
180 | create_ptable_conf() | 187 | create_ptable_conf() |
181 | { | 188 | { |
182 | inquire_var start && inquire_var devsz || return 0 | 189 | #inquire_var start && inquire_var devsz || return |
183 | [ "$start" -a "$devsz" ] || return 0 | 190 | part=$builddir/${f%.conf} |
191 | devsz=$(stat -L -c '%s' "$part") || return | ||
192 | [ "$start" -a "$devsz" ] || return | ||
184 | 193 | ||
185 | case "$type" in | 194 | case "$type" in |
186 | partition-table) return;; | 195 | partition-table) |
196 | start=$((start + devsz)) | ||
197 | return;; | ||
187 | efi-system-partition) typecode=ef00 ;; | 198 | efi-system-partition) typecode=ef00 ;; |
188 | bios-grub) typecode=ef02 ;; | 199 | bios-grub) typecode=ef02 ;; |
189 | samizdat-*) typecode=8e00 ;; | 200 | samizdat-*) typecode=8e00 ;; |
@@ -191,13 +202,17 @@ create_ptable_conf() | |||
191 | esac | 202 | esac |
192 | 203 | ||
193 | set -- --new "$i:$start:$((start + devsz - 1))" --change-name "$i:$name" | 204 | set -- --new "$i:$start:$((start + devsz - 1))" --change-name "$i:$name" |
205 | |||
194 | if [ "$typecode" ] | 206 | if [ "$typecode" ] |
195 | then | 207 | then |
196 | set -- "$@" --typecode "$i:$typecode" | 208 | set -- "$@" --typecode "$i:$typecode" |
197 | fi | 209 | fi |
210 | printf '%s\0' "$@" >> "$ptable" | ||
198 | 211 | ||
199 | printf '%s\0' "$@" >> $ptable | 212 | typecode=0FC63DAF-8483-4772-8E79-3D69D8477DE4 |
213 | printf '%d: start=%d, size=%d, type=%s, name="%s"\n' "$i" "$((start / 512))" "$((devsz / 512))" "$typecode" "$name" >> "$ptable.sfdisk" | ||
200 | let ++i | 214 | let ++i |
215 | start=$((start + devsz)) | ||
201 | } | 216 | } |
202 | 217 | ||
203 | set -e | 218 | set -e |
@@ -219,21 +234,51 @@ quietly $sudo kpartx -dv /dev/mapper/"$map_name" | |||
219 | quietly $sudo dmsetup remove "$map_name" | 234 | quietly $sudo dmsetup remove "$map_name" |
220 | quietly $sudo losetup -D | 235 | quietly $sudo losetup -D |
221 | 236 | ||
222 | map=$builddir/dmsetup.map | 237 | # map=$builddir/dmsetup.map |
223 | : > "$map" | 238 | # : > "$map" |
224 | start=0 | 239 | # start=0 |
225 | iterate_partitions create_dmsetup_map | 240 | # iterate_partitions create_dmsetup_map |
226 | $sudo dmsetup -v create "$map_name" "$map" | 241 | # $sudo dmsetup -v create "$map_name" "$map" |
242 | |||
243 | sfdisk_init() | ||
244 | { | ||
245 | local DEV LAST LAST_LBA | ||
246 | DEV=$1 | ||
247 | if [ -b "$DEV" ] | ||
248 | then | ||
249 | LAST=$($sudo blockdev --getsize64 "$DEV") || return | ||
250 | else | ||
251 | LAST=$(stat -L -c%s "$DEV") || return | ||
252 | fi | ||
253 | LAST_LBA=$((LAST / 512 - 34)) | ||
254 | |||
255 | cat <<END | ||
256 | label: gpt | ||
257 | unit: sectors | ||
258 | first-lba: 34 | ||
259 | # last-lba: ${LAST_LBA} | ||
260 | |||
261 | END | ||
262 | } | ||
263 | |||
264 | pee_on_table() | ||
265 | { | ||
266 | local dev="$1" | ||
267 | ptable=$builddir/ptable.bin | ||
268 | i=1 | ||
269 | start=0 | ||
270 | |||
271 | sfdisk_init "$dev" > "$ptable".sfdisk | ||
272 | |||
273 | iterate_partitions create_ptable_conf_debug | ||
274 | |||
275 | cat "$ptable".sfdisk >&2 | ||
227 | 276 | ||
228 | ptable=$builddir/ptable.bin | 277 | set -x |
229 | : > "$ptable" | 278 | $sudo sfdisk "$dev" < "$ptable".sfdisk || return |
230 | i=1 | 279 | $sudo sfdisk --dump "$dev" || return |
231 | iterate_partitions create_ptable_conf | 280 | $sudo sfdisk -Y MBR --dump "$dev" || return |
232 | dev=/dev/mapper/$map_name | 281 | } |
233 | printf '%s\0' '-h1' '-p' "$dev" >> "$ptable" | ||
234 | xargs -0 -x $sudo sgdisk -o < "$ptable" >&2 | ||
235 | $sudo sfdisk --dump "$dev" | ||
236 | $sudo sfdisk -Y MBR --dump "$dev" | ||
237 | 282 | ||
238 | 283 | ||
239 | 284 | ||
@@ -257,17 +302,34 @@ $sudo sfdisk -Y MBR --dump "$dev" | |||
257 | # ) | 302 | # ) |
258 | # $sudo kpartx -u "$dev" | 303 | # $sudo kpartx -u "$dev" |
259 | 304 | ||
260 | $sudo kpartx -a "$dev" | 305 | # $sudo kpartx -a "$dev" |
306 | |||
307 | # $sudo kpartx -d "$dev" | ||
308 | # $sudo dmsetup remove "$map_name" | ||
309 | |||
310 | truncate -s0 whole.img | ||
311 | for f in part*.conf | ||
312 | do | ||
313 | f=$(readlink -e _build/"${f%.conf}") || break | ||
314 | ficlonerange.py "$f" whole.img | ||
315 | done | ||
316 | |||
317 | $sudo losetup -L -f whole.img | ||
318 | whole=$(losetup -j whole.img -O NAME --noheadings) | ||
319 | (pee_on_table "$whole") || exit | ||
320 | |||
321 | map_name=${whole#/dev/} | ||
322 | $sudo kpartx -a "$whole" | ||
261 | 323 | ||
262 | target=i386-pc | ||
263 | target=x86_64-efi | 324 | target=x86_64-efi |
325 | target=i386-pc | ||
264 | set -- grub-install --target=$target --removable # --boot-directory=/mnt/boot --efi-directory=/mnt | 326 | set -- grub-install --target=$target --removable # --boot-directory=/mnt/boot --efi-directory=/mnt |
265 | 327 | ||
266 | for f in part*.conf | 328 | for f in part*.conf |
267 | do | 329 | do |
268 | notice "Processing $f" | 330 | notice "Processing $f" |
269 | img=${f%.conf} | 331 | img=${f%.conf} |
270 | dev=/dev/mapper/$map_name${img#part} | 332 | dev=/dev/mapper/${whole#/dev/}p${img#part} |
271 | mnt=${f%.conf}.mnt | 333 | mnt=${f%.conf}.mnt |
272 | 334 | ||
273 | read_config_file || warn "Received error return from command: read_config_file $img" | 335 | read_config_file || warn "Received error return from command: read_config_file $img" |
@@ -281,7 +343,7 @@ do | |||
281 | if [ "$type" = 'bios-grub' ] | 343 | if [ "$type" = 'bios-grub' ] |
282 | then | 344 | then |
283 | $sudo mkdir "$mnt"/grub | 345 | $sudo mkdir "$mnt"/grub |
284 | # set -- "$@" --boot-directory="$mnt" | 346 | set -- "$@" --boot-directory="$mnt" |
285 | else | 347 | else |
286 | set -- "$@" --efi-directory="$mnt" | 348 | set -- "$@" --efi-directory="$mnt" |
287 | fi | 349 | fi |
@@ -290,8 +352,11 @@ do | |||
290 | esac | 352 | esac |
291 | done | 353 | done |
292 | 354 | ||
293 | loudly ls -l /dev/mapper/ | 355 | #loudly ls -l /dev/mapper/ |
294 | loudly $sudo "$@" -v -s --force /dev/mapper/$map_name | 356 | #loudly $sudo grub-probe -v -d "$whole" |
357 | |||
358 | loudly $sudo "$@" -v -s --force "$whole" | ||
359 | exit | ||
295 | 360 | ||
296 | for f in part*.conf | 361 | for f in part*.conf |
297 | do | 362 | do |