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