Skip to content

Commit

Permalink
Enhance tracing to hunt for restore bug
Browse files Browse the repository at this point in the history
The particular issue turned out to be that the nested UEFI host being
restored had several disks attached.  Since this is done as NVMe namespaces
of a single disk, all sharing the same ID, udev in dom0 does not have
enough info and messes up /dev/disk/by-id/ on which restore relies becuse
of /etc/xensource-invertory:

 lrwxrwxrwx 1 root root 13 Jul 15 14:28 nvme-QEMU_NVMe_Ctrl_nvme0 -> ../../nvme0n3
 lrwxrwxrwx 1 root root 15 Jul 15 14:28 nvme-QEMU_NVMe_Ctrl_nvme0-part1 -> ../../nvme0n2p1
 lrwxrwxrwx 1 root root 15 Jul 15 14:28 nvme-QEMU_NVMe_Ctrl_nvme0-part2 -> ../../nvme0n1p2

Only the addition of the `tool.dump()` call allowed me to connect the
"Failed to create root filesystem" error with that longstanding (in)famous
issue, but a few other additions were useful to get there.

Signed-off-by: Yann Dirson <[email protected]>
(cherry picked from commit 02d72e6, with
one additional safety guard that does not apply to master any more)
  • Loading branch information
ydirson committed Jul 16, 2024
1 parent 7463132 commit f1b2f28
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 0 deletions.
1 change: 1 addition & 0 deletions disktools.py
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,7 @@ def probePartitioningScheme(device):
if out == 'dos':
partitionType = constants.PARTITION_DOS

logger.debug("probePartitioningScheme(%r) => %r", device, partitionType)
return partitionType

def PartitionTool(device, partitionType=None):
Expand Down
6 changes: 6 additions & 0 deletions diskutil.py
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,8 @@ def __init__(self, device):
self.storage = (None, None)
self.logs = (False, None)
self.swap = (False, None)
def __str__(self):
return "Disk({})".format(self.__dict__)

INSTALL_RETAIL = 1
STORAGE_LVM = 1
Expand All @@ -512,10 +514,12 @@ def probeDisk(device):
swap is a tuple of True or False and the partition device
"""

logger.debug("probeDisk(%r)", device)
disk = Disk(device)
possible_srs = []

tool = PartitionTool(device)
tool.dump()
for num, part in tool.items():
label = None
part_device = tool._partitionDevice(num)
Expand Down Expand Up @@ -543,6 +547,8 @@ def probeDisk(device):
disk.swap = (True, part_device)
elif part['id'] == GPTPartitionTool.ID_EFI_BOOT or part['id'] == GPTPartitionTool.ID_BIOS_BOOT:
disk.boot = (True, part_device)
else:
logger.info("part %s has unknown id: %s", num, part)

lv_tool = len(possible_srs) and LVMTool()
for num in possible_srs:
Expand Down
3 changes: 3 additions & 0 deletions restore.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ def restoreFromBackup(backup, progress=lambda x: ()):
assert disk_device.startswith('/dev/')

restore_partition = disk.root[1]
if not isinstance(restore_partition, str):
raise RuntimeError("failed to identify root partition to restore to, disk=%s" % disk)
logger.log("Restoring to partition %s." % restore_partition)

boot_part = tool.getPartition(boot_partnum)
Expand Down Expand Up @@ -138,6 +140,7 @@ def restore_partitions():
try:
util.mkfs(constants.rootfs_type, restore_partition)
except Exception as e:
logger.critical("Failed to create root filesystem", exc_info=1)
raise RuntimeError("Failed to create root filesystem: %s" % e)

if efi_boot:
Expand Down

0 comments on commit f1b2f28

Please sign in to comment.