summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@cryptonomic.net>2021-01-18 18:09:15 -0500
committerAndrew Cady <d@cryptonomic.net>2021-01-18 18:09:15 -0500
commit93c785ab5b3d42a053508a9d6cf57c3f9062e91d (patch)
tree4cb5c29b9b332b0b6fc4c4c56c56f1cdac122a28
parentc70db0da13bc29e3d82339f5457911c95c15a94b (diff)
got zero-copy partitioning to work w/ btrfs and sfdisk
-rwxr-xr-xbtrcat22
-rw-r--r--rootfs/samizdat-xorg-extras.yaml1
-rwxr-xr-xsrc/parted-usb.sh9
-rwxr-xr-xsrc/partvi115
4 files changed, 121 insertions, 26 deletions
diff --git a/btrcat b/btrcat
new file mode 100755
index 0000000..f25c75f
--- /dev/null
+++ b/btrcat
@@ -0,0 +1,22 @@
1#!/bin/bash
2
3btrcat()
4{
5 [ $# -ge 2 ] || return
6
7 local src dst
8 dst=${!#}
9 truncate -s0 "$dst" || return
10
11 while [ $# -ge 2 ]
12 do
13 src=$1
14 ficlonerange.py "$src" "$dst" || return
15 shift
16 done
17}
18
19set -e
20which ficlonerange.py >/dev/null
21
22btrcat "$@"
diff --git a/rootfs/samizdat-xorg-extras.yaml b/rootfs/samizdat-xorg-extras.yaml
index fe40e4f..b2e1e15 100644
--- a/rootfs/samizdat-xorg-extras.yaml
+++ b/rootfs/samizdat-xorg-extras.yaml
@@ -14,3 +14,4 @@ packages:
14- vim 14- vim
15- w3m 15- w3m
16- xbindkeys 16- xbindkeys
17- xinput
diff --git a/src/parted-usb.sh b/src/parted-usb.sh
index 0eafe86..fca8988 100755
--- a/src/parted-usb.sh
+++ b/src/parted-usb.sh
@@ -212,7 +212,14 @@ add_grub_cfg()
212individualize() 212individualize()
213{ 213{
214 mkdir -p "$mnt" 214 mkdir -p "$mnt"
215 mountpoint -q "$mnt" || mount "$part"3 "$mnt" 215 (
216 set +e
217 losetup -a >&2
218 lsblk >&2
219 mount|grep $PWD >&2
220 : OK
221 )
222 mountpoint "$mnt" || mount "$part"3 "$mnt"
216 add_keys 223 add_keys
217 add_initrd "$samizdat_linux_dir"/ "${version_suffix}" 224 add_initrd "$samizdat_linux_dir"/ "${version_suffix}"
218 add_grub_cfg 225 add_grub_cfg
diff --git a/src/partvi b/src/partvi
index 126900e..f1f3d36 100755
--- a/src/partvi
+++ b/src/partvi
@@ -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
180create_ptable_conf_debug()
181{
182 set -x
183 create_ptable_conf "$@"
184 set +x
185}
186
180create_ptable_conf() 187create_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
203set -e 218set -e
@@ -219,21 +234,51 @@ quietly $sudo kpartx -dv /dev/mapper/"$map_name"
219quietly $sudo dmsetup remove "$map_name" 234quietly $sudo dmsetup remove "$map_name"
220quietly $sudo losetup -D 235quietly $sudo losetup -D
221 236
222map=$builddir/dmsetup.map 237# map=$builddir/dmsetup.map
223: > "$map" 238# : > "$map"
224start=0 239# start=0
225iterate_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
243sfdisk_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
256label: gpt
257unit: sectors
258first-lba: 34
259# last-lba: ${LAST_LBA}
260
261END
262}
263
264pee_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
228ptable=$builddir/ptable.bin 277 set -x
229: > "$ptable" 278 $sudo sfdisk "$dev" < "$ptable".sfdisk || return
230i=1 279 $sudo sfdisk --dump "$dev" || return
231iterate_partitions create_ptable_conf 280 $sudo sfdisk -Y MBR --dump "$dev" || return
232dev=/dev/mapper/$map_name 281}
233printf '%s\0' '-h1' '-p' "$dev" >> "$ptable"
234xargs -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
310truncate -s0 whole.img
311for f in part*.conf
312do
313 f=$(readlink -e _build/"${f%.conf}") || break
314 ficlonerange.py "$f" whole.img
315done
316
317$sudo losetup -L -f whole.img
318whole=$(losetup -j whole.img -O NAME --noheadings)
319(pee_on_table "$whole") || exit
320
321map_name=${whole#/dev/}
322$sudo kpartx -a "$whole"
261 323
262target=i386-pc
263target=x86_64-efi 324target=x86_64-efi
325target=i386-pc
264set -- grub-install --target=$target --removable # --boot-directory=/mnt/boot --efi-directory=/mnt 326set -- grub-install --target=$target --removable # --boot-directory=/mnt/boot --efi-directory=/mnt
265 327
266for f in part*.conf 328for f in part*.conf
267do 329do
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
291done 353done
292 354
293loudly ls -l /dev/mapper/ 355#loudly ls -l /dev/mapper/
294loudly $sudo "$@" -v -s --force /dev/mapper/$map_name 356#loudly $sudo grub-probe -v -d "$whole"
357
358loudly $sudo "$@" -v -s --force "$whole"
359exit
295 360
296for f in part*.conf 361for f in part*.conf
297do 362do