WIP2
This commit is contained in:
@@ -184,8 +184,17 @@ modprobe nbd max_part=63
|
|||||||
NBD=\"\"
|
NBD=\"\"
|
||||||
for i in $(seq 0 15); do
|
for i in $(seq 0 15); do
|
||||||
DEV=\"/dev/nbd$i\"
|
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
|
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\"
|
NBD=\"$DEV\"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
@@ -195,13 +204,22 @@ if [ -z \"$NBD\" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo \"Selected NBD: $NBD\"
|
||||||
|
|
||||||
# Settle and probe partitions
|
# Settle and probe partitions
|
||||||
udevadm settle >/dev/null 2>&1 || true
|
udevadm settle >/dev/null 2>&1 || true
|
||||||
|
blockdev --rereadpt \"$NBD\" >/dev/null 2>&1 || true
|
||||||
partprobe \"$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
|
for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do
|
||||||
[ -b \"${{NBD}}p1\" ] && break
|
if [ -b \"${{NBD}}p1\" ]; then
|
||||||
sleep 0.3
|
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
|
udevadm settle >/dev/null 2>&1 || true
|
||||||
|
blockdev --rereadpt \"$NBD\" >/dev/null 2>&1 || true
|
||||||
partprobe \"$NBD\" >/dev/null 2>&1 || true
|
partprobe \"$NBD\" >/dev/null 2>&1 || true
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -216,6 +234,8 @@ else
|
|||||||
exit 33
|
exit 33
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo \"ROOT_DEV=$ROOT_DEV BOOT_DEV=$BOOT_DEV\"
|
||||||
|
|
||||||
if [ ! -b \"$ROOT_DEV\" ]; then
|
if [ ! -b \"$ROOT_DEV\" ]; then
|
||||||
echo \"Root partition not found: $ROOT_DEV\" >&2
|
echo \"Root partition not found: $ROOT_DEV\" >&2
|
||||||
exit 32
|
exit 32
|
||||||
@@ -230,9 +250,49 @@ cleanup() {{
|
|||||||
}}
|
}}
|
||||||
trap cleanup EXIT
|
trap cleanup EXIT
|
||||||
|
|
||||||
# Mount and mutate
|
# Ensure partitions are readable before mounting
|
||||||
mount \"$ROOT_DEV\" \"$MNT_ROOT\"
|
for t in 1 2 3 4 5 6 7 8; do
|
||||||
mount \"$BOOT_DEV\" \"$MNT_BOOT\"
|
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)
|
# Change UUIDs (best-effort)
|
||||||
tune2fs -U random \"$ROOT_DEV\" || true
|
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\"
|
echo \"network: {{config: disabled}}\" > \"$MNT_ROOT/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg\"
|
||||||
fi
|
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\"
|
rm -f \"$RAW\"
|
||||||
qemu-img convert -O raw \"$WORK\" \"$RAW\"
|
qemu-img convert -U -f qcow2 -O raw \"$WORK\" \"$RAW\"
|
||||||
|
|
||||||
# Output result triple
|
# Output result triple
|
||||||
echo \"$RAW|$ROOT_UUID|$BOOT_UUID\"
|
echo \"$RAW|$ROOT_UUID|$BOOT_UUID\"
|
||||||
|
Reference in New Issue
Block a user