WIP2
This commit is contained in:
@@ -184,8 +184,17 @@ modprobe nbd max_part=63
|
||||
NBD=\"\"
|
||||
for i in $(seq 0 15); do
|
||||
DEV=\"/dev/nbd$i\"
|
||||
# Skip devices that have any mounted partitions (avoid reusing in-use NBDs)
|
||||
if findmnt -rn -S \"$DEV\" >/dev/null 2>&1 || \
|
||||
findmnt -rn -S \"${{DEV}}p1\" >/dev/null 2>&1 || \
|
||||
findmnt -rn -S \"${{DEV}}p14\" >/dev/null 2>&1 || \
|
||||
findmnt -rn -S \"${{DEV}}p15\" >/dev/null 2>&1 || \
|
||||
findmnt -rn -S \"${{DEV}}p16\" >/dev/null 2>&1; then
|
||||
continue
|
||||
fi
|
||||
# Ensure it's not connected (ignore errors if already disconnected)
|
||||
qemu-nbd --disconnect \"$DEV\" >/dev/null 2>&1 || true
|
||||
if qemu-nbd --connect=\"$DEV\" \"$WORK\"; then
|
||||
if qemu-nbd --format=qcow2 --connect=\"$DEV\" \"$WORK\"; then
|
||||
NBD=\"$DEV\"
|
||||
break
|
||||
fi
|
||||
@@ -195,13 +204,22 @@ if [ -z \"$NBD\" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo \"Selected NBD: $NBD\"
|
||||
|
||||
# Settle and probe partitions
|
||||
udevadm settle >/dev/null 2>&1 || true
|
||||
blockdev --rereadpt \"$NBD\" >/dev/null 2>&1 || true
|
||||
partprobe \"$NBD\" >/dev/null 2>&1 || true
|
||||
for t in 1 2 3 4 5 6 7 8 9 10; do
|
||||
[ -b \"${{NBD}}p1\" ] && break
|
||||
sleep 0.3
|
||||
for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do
|
||||
if [ -b \"${{NBD}}p1\" ]; then
|
||||
sz=$(blockdev --getsize64 \"${{NBD}}p1\" 2>/dev/null || echo 0)
|
||||
if [ \"$sz\" -gt 0 ]; then
|
||||
break
|
||||
fi
|
||||
fi
|
||||
sleep 0.4
|
||||
udevadm settle >/dev/null 2>&1 || true
|
||||
blockdev --rereadpt \"$NBD\" >/dev/null 2>&1 || true
|
||||
partprobe \"$NBD\" >/dev/null 2>&1 || true
|
||||
done
|
||||
|
||||
@@ -216,6 +234,8 @@ else
|
||||
exit 33
|
||||
fi
|
||||
|
||||
echo \"ROOT_DEV=$ROOT_DEV BOOT_DEV=$BOOT_DEV\"
|
||||
|
||||
if [ ! -b \"$ROOT_DEV\" ]; then
|
||||
echo \"Root partition not found: $ROOT_DEV\" >&2
|
||||
exit 32
|
||||
@@ -230,9 +250,49 @@ cleanup() {{
|
||||
}}
|
||||
trap cleanup EXIT
|
||||
|
||||
# Mount and mutate
|
||||
mount \"$ROOT_DEV\" \"$MNT_ROOT\"
|
||||
mount \"$BOOT_DEV\" \"$MNT_BOOT\"
|
||||
# Ensure partitions are readable before mounting
|
||||
for t in 1 2 3 4 5 6 7 8; do
|
||||
szr=$(blockdev --getsize64 \"$ROOT_DEV\" 2>/dev/null || echo 0)
|
||||
szb=$(blockdev --getsize64 \"$BOOT_DEV\" 2>/dev/null || echo 0)
|
||||
if [ \"$szr\" -gt 0 ] && [ \"$szb\" -gt 0 ] && blkid \"$ROOT_DEV\" >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 0.4
|
||||
udevadm settle >/dev/null 2>&1 || true
|
||||
blockdev --rereadpt \"$NBD\" >/dev/null 2>&1 || true
|
||||
partprobe \"$NBD\" >/dev/null 2>&1 || true
|
||||
done
|
||||
|
||||
# Mount and mutate (with retries to avoid races)
|
||||
mounted_root=0
|
||||
for t in 1 2 3 4 5 6 7 8 9 10; do
|
||||
if mount \"$ROOT_DEV\" \"$MNT_ROOT\"; then
|
||||
mounted_root=1
|
||||
break
|
||||
fi
|
||||
sleep 0.5
|
||||
udevadm settle >/dev/null 2>&1 || true
|
||||
partprobe \"$NBD\" >/dev/null 2>&1 || true
|
||||
done
|
||||
if [ \"$mounted_root\" -ne 1 ]; then
|
||||
echo \"Failed to mount root $ROOT_DEV\" >&2
|
||||
exit 32
|
||||
fi
|
||||
|
||||
mounted_boot=0
|
||||
for t in 1 2 3 4 5; do
|
||||
if mount \"$BOOT_DEV\" \"$MNT_BOOT\"; then
|
||||
mounted_boot=1
|
||||
break
|
||||
fi
|
||||
sleep 0.5
|
||||
udevadm settle >/dev/null 2>&1 || true
|
||||
partprobe \"$NBD\" >/dev/null 2>&1 || true
|
||||
done
|
||||
if [ \"$mounted_boot\" -ne 1 ]; then
|
||||
echo \"Failed to mount boot $BOOT_DEV\" >&2
|
||||
exit 33
|
||||
fi
|
||||
|
||||
# Change UUIDs (best-effort)
|
||||
tune2fs -U random \"$ROOT_DEV\" || true
|
||||
@@ -287,9 +347,15 @@ if [ \"{disable_ci_net}\" = \"true\" ]; then
|
||||
echo \"network: {{config: disabled}}\" > \"$MNT_ROOT/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg\"
|
||||
fi
|
||||
|
||||
# Convert prepared image to raw
|
||||
# Convert prepared image to raw (ensure source not locked)
|
||||
umount \"$MNT_BOOT\" 2>/dev/null || true
|
||||
umount \"$MNT_ROOT\" 2>/dev/null || true
|
||||
if [ -n \"$NBD\" ]; then
|
||||
qemu-nbd --disconnect \"$NBD\" 2>/dev/null || true
|
||||
rmmod nbd 2>/dev/null || true
|
||||
fi
|
||||
rm -f \"$RAW\"
|
||||
qemu-img convert -O raw \"$WORK\" \"$RAW\"
|
||||
qemu-img convert -U -f qcow2 -O raw \"$WORK\" \"$RAW\"
|
||||
|
||||
# Output result triple
|
||||
echo \"$RAW|$ROOT_UUID|$BOOT_UUID\"
|
||||
|
Reference in New Issue
Block a user