From 93c785ab5b3d42a053508a9d6cf57c3f9062e91d Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Mon, 18 Jan 2021 18:09:15 -0500 Subject: got zero-copy partitioning to work w/ btrfs and sfdisk --- src/partvi | 115 +++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 90 insertions(+), 25 deletions(-) (limited to 'src/partvi') diff --git a/src/partvi b/src/partvi index 126900e..f1f3d36 100755 --- a/src/partvi +++ b/src/partvi @@ -137,7 +137,7 @@ iterate_partitions() imgfile=$builddir/$img - "$@" + "$@" || return done } @@ -177,13 +177,24 @@ create_dmsetup_map() fi } +create_ptable_conf_debug() +{ + set -x + create_ptable_conf "$@" + set +x +} + create_ptable_conf() { - inquire_var start && inquire_var devsz || return 0 - [ "$start" -a "$devsz" ] || return 0 + #inquire_var start && inquire_var devsz || return + part=$builddir/${f%.conf} + devsz=$(stat -L -c '%s' "$part") || return + [ "$start" -a "$devsz" ] || return case "$type" in - partition-table) return;; + partition-table) + start=$((start + devsz)) + return;; efi-system-partition) typecode=ef00 ;; bios-grub) typecode=ef02 ;; samizdat-*) typecode=8e00 ;; @@ -191,13 +202,17 @@ create_ptable_conf() esac set -- --new "$i:$start:$((start + devsz - 1))" --change-name "$i:$name" + if [ "$typecode" ] then set -- "$@" --typecode "$i:$typecode" fi + printf '%s\0' "$@" >> "$ptable" - printf '%s\0' "$@" >> $ptable + typecode=0FC63DAF-8483-4772-8E79-3D69D8477DE4 + printf '%d: start=%d, size=%d, type=%s, name="%s"\n' "$i" "$((start / 512))" "$((devsz / 512))" "$typecode" "$name" >> "$ptable.sfdisk" let ++i + start=$((start + devsz)) } set -e @@ -219,21 +234,51 @@ quietly $sudo kpartx -dv /dev/mapper/"$map_name" quietly $sudo dmsetup remove "$map_name" quietly $sudo losetup -D -map=$builddir/dmsetup.map -: > "$map" -start=0 -iterate_partitions create_dmsetup_map -$sudo dmsetup -v create "$map_name" "$map" +# map=$builddir/dmsetup.map +# : > "$map" +# start=0 +# iterate_partitions create_dmsetup_map +# $sudo dmsetup -v create "$map_name" "$map" + +sfdisk_init() +{ + local DEV LAST LAST_LBA + DEV=$1 + if [ -b "$DEV" ] + then + LAST=$($sudo blockdev --getsize64 "$DEV") || return + else + LAST=$(stat -L -c%s "$DEV") || return + fi + LAST_LBA=$((LAST / 512 - 34)) + + cat < "$ptable".sfdisk + + iterate_partitions create_ptable_conf_debug + + cat "$ptable".sfdisk >&2 -ptable=$builddir/ptable.bin -: > "$ptable" -i=1 -iterate_partitions create_ptable_conf -dev=/dev/mapper/$map_name -printf '%s\0' '-h1' '-p' "$dev" >> "$ptable" -xargs -0 -x $sudo sgdisk -o < "$ptable" >&2 -$sudo sfdisk --dump "$dev" -$sudo sfdisk -Y MBR --dump "$dev" + set -x + $sudo sfdisk "$dev" < "$ptable".sfdisk || return + $sudo sfdisk --dump "$dev" || return + $sudo sfdisk -Y MBR --dump "$dev" || return +} @@ -257,17 +302,34 @@ $sudo sfdisk -Y MBR --dump "$dev" # ) # $sudo kpartx -u "$dev" -$sudo kpartx -a "$dev" +# $sudo kpartx -a "$dev" + +# $sudo kpartx -d "$dev" +# $sudo dmsetup remove "$map_name" + +truncate -s0 whole.img +for f in part*.conf +do + f=$(readlink -e _build/"${f%.conf}") || break + ficlonerange.py "$f" whole.img +done + +$sudo losetup -L -f whole.img +whole=$(losetup -j whole.img -O NAME --noheadings) +(pee_on_table "$whole") || exit + +map_name=${whole#/dev/} +$sudo kpartx -a "$whole" -target=i386-pc target=x86_64-efi +target=i386-pc set -- grub-install --target=$target --removable # --boot-directory=/mnt/boot --efi-directory=/mnt for f in part*.conf do notice "Processing $f" img=${f%.conf} - dev=/dev/mapper/$map_name${img#part} + dev=/dev/mapper/${whole#/dev/}p${img#part} mnt=${f%.conf}.mnt read_config_file || warn "Received error return from command: read_config_file $img" @@ -281,7 +343,7 @@ do if [ "$type" = 'bios-grub' ] then $sudo mkdir "$mnt"/grub - # set -- "$@" --boot-directory="$mnt" + set -- "$@" --boot-directory="$mnt" else set -- "$@" --efi-directory="$mnt" fi @@ -290,8 +352,11 @@ do esac done -loudly ls -l /dev/mapper/ -loudly $sudo "$@" -v -s --force /dev/mapper/$map_name +#loudly ls -l /dev/mapper/ +#loudly $sudo grub-probe -v -d "$whole" + +loudly $sudo "$@" -v -s --force "$whole" +exit for f in part*.conf do -- cgit v1.2.3