Olivier Gayot has proposed merging ~ogayot/curtin:noble-raid-fixes into curtin:ubuntu/noble.
Commit message: do not squash Requested reviews: curtin developers (curtin-dev) Related bugs: Bug #2094979 in curtin: "curtin misidentify /dev/md126p3 as a multipath device, generates unbootable grub config" https://bugs.launchpad.net/curtin/+bug/2094979 Bug #2095141 in curtin: "For OEM factory reset, reset GRUB option is not generated when resetting into existing firmware RAID disk" https://bugs.launchpad.net/curtin/+bug/2095141 Bug #2098075 in curtin: "use-gap on IMSM RAID devices installs another ESP partition, despite there is one available" https://bugs.launchpad.net/curtin/+bug/2098075 For more details, see: https://code.launchpad.net/~ogayot/curtin/+git/curtin/+merge/481603 Merge recent RAID fixes to ubuntu/noble. * https://code.launchpad.net/~medicalwei/curtin/+git/curtin/+merge/481164 * Addresses https://bugs.launchpad.net/curtin/+bug/2095141 * https://code.launchpad.net/~ogayot/curtin/+git/curtin/+merge/481411 * Addresses https://bugs.launchpad.net/curtin/+bug/2094979 * https://code.launchpad.net/~ogayot/curtin/+git/curtin/+merge/481078 * Addresses https://bugs.launchpad.net/curtin/+bug/2098075 -- Your team curtin developers is requested to review the proposed merge of ~ogayot/curtin:noble-raid-fixes into curtin:ubuntu/noble.
diff --git a/curtin/block/__init__.py b/curtin/block/__init__.py index f0445ae..497372d 100644 --- a/curtin/block/__init__.py +++ b/curtin/block/__init__.py @@ -7,6 +7,7 @@ import os import stat import sys import tempfile +from typing import Optional from curtin import util from curtin.block import lvm @@ -566,60 +567,6 @@ def blkid(devs=None, cache=True): return data -def _legacy_detect_multipath(target_mountpoint=None): - """ - Detect if the operating system has been installed to a multipath device. - """ - # The obvious way to detect multipath is to use multipath utility which is - # provided by the multipath-tools package. Unfortunately, multipath-tools - # package is not available in all ephemeral images hence we can't use it. - # Another reasonable way to detect multipath is to look for two (or more) - # devices with the same World Wide Name (WWN) which can be fetched using - # scsi_id utility. This way doesn't work as well because WWNs are not - # unique in some cases which leads to false positives which may prevent - # system from booting (see LP: #1463046 for details). - # Taking into account all the issues mentioned above, curent implementation - # detects multipath by looking for a filesystem with the same UUID - # as the target device. It relies on the fact that all alternative routes - # to the same disk observe identical partition information including UUID. - # There are some issues with this approach as well though. We won't detect - # multipath disk if it doesn't any filesystems. Good news is that - # target disk will always have a filesystem because curtin creates them - # while installing the system. - rescan_block_devices() - binfo = blkid(cache=False) - LOG.debug("legacy_detect_multipath found blkid info: %s", binfo) - # get_devices_for_mp may return multiple devices by design. It is not yet - # implemented but it should return multiple devices when installer creates - # separate disk partitions for / and /boot. We need to do UUID-based - # multipath detection against each of target devices. - target_devs = get_devices_for_mp(target_mountpoint) - LOG.debug("target_devs: %s" % target_devs) - for devpath, data in binfo.items(): - # We need to figure out UUID of the target device first - if devpath not in target_devs: - continue - # This entry contains information about one of target devices - target_uuid = data.get('UUID') - # UUID-based multipath detection won't work if target partition - # doesn't have UUID assigned - if not target_uuid: - LOG.warn("Target partition %s doesn't have UUID assigned", - devpath) - continue - LOG.debug("%s: %s" % (devpath, data.get('UUID', ""))) - # Iterating over available devices to see if any other device - # has the same UUID as the target device. If such device exists - # we probably installed the system to the multipath device. - for other_devpath, other_data in binfo.items(): - if ((other_data.get('UUID') == target_uuid) and - (other_devpath != devpath)): - return True - # No other devices have the same UUID as the target devices. - # We probably installed the system to the non-multipath device. - return False - - def _device_is_multipathed(devpath): devpath = os.path.realpath(devpath) info = udevadm_info(devpath) @@ -668,7 +615,7 @@ def md_get_devices_list(devpath): return _md_get_members_list(devpath, state_is_not_spare) -def detect_multipath(target_mountpoint=None): +def detect_multipath(target_mountpoint=None) -> Optional[str]: if multipath.multipath_supported(): for device in (os.path.realpath(dev) for (dev, _mp, _vfs, _opts, _freq, _passno) @@ -682,7 +629,7 @@ def detect_multipath(target_mountpoint=None): if _device_is_multipathed(device): return device - return _legacy_detect_multipath(target_mountpoint) + return None def get_scsi_wwid(device, replace_whitespace=False): diff --git a/curtin/storage_config.py b/curtin/storage_config.py index dae89f4..ac7b607 100644 --- a/curtin/storage_config.py +++ b/curtin/storage_config.py @@ -4,6 +4,7 @@ import copy import operator import os import re +from typing import Optional import yaml from curtin.log import LOG @@ -470,6 +471,22 @@ class ProbertParser(object): return multipath.is_mpath_partition( blockdev.get('DEVNAME', ''), blockdev) + @staticmethod + def detect_partition_scheme(blockdev) -> Optional[str]: + ''' Return either: + * None if the blockdev is not partitioned + * A type of partition table (as a string) if it is supported + * "unsupported" if it is not supported. + ''' + if 'ID_PART_TABLE_TYPE' not in blockdev: + return None + + ptype = blockdev['ID_PART_TABLE_TYPE'] + if ptype not in schemas._ptables: + return schemas._ptable_unsupported + + return ptype + def blockdev_to_id(self, blockdev): """ Examine a blockdev dictionary and return a tuple of curtin storage type and name that can be used as a value for @@ -752,12 +769,9 @@ class BlockdevParser(ProbertParser): if dasd_size != "0": entry['ptable'] = 'vtoc' - if 'ID_PART_TABLE_TYPE' in blockdev_data: - ptype = blockdev_data['ID_PART_TABLE_TYPE'] - if ptype in schemas._ptables: - entry['ptable'] = ptype - else: - entry['ptable'] = schemas._ptable_unsupported + ptable = self.detect_partition_scheme(blockdev_data) + if ptable is not None: + entry['ptable'] = ptable match = re.fullmatch(r'/dev/(?P<ctrler>nvme\d+)n\d', devname) if match is not None: @@ -816,7 +830,11 @@ class BlockdevParser(ProbertParser): if ptable: entry['size'] *= logical_sector_size - if blockdev_data.get('ID_PART_TABLE_TYPE') == 'gpt': + # in libblkid, for a partition, PART_ENTRY_UUID is set together + # with PART_ENTRY_SCHEME, check ID_PART_ENTRY_SCHEME for partition + # type instead of ID_PART_TABLE_TYPE as it might not be set for a + # partition e.g. in RAID disks + if blockdev_data.get('ID_PART_ENTRY_SCHEME') == 'gpt': part_uuid = blockdev_data.get('ID_PART_ENTRY_UUID') if part_uuid is not None: entry['uuid'] = part_uuid @@ -1087,6 +1105,10 @@ class RaidParser(ProbertParser): 'raidlevel': raid_data.get('raidlevel'), } + ptable = self.detect_partition_scheme(raid_data) + if ptable is not None: + action['ptable'] = ptable + if 'MD_METADATA' in raid_data: action['metadata'] = raid_data["MD_METADATA"] diff --git a/tests/data/probert_storage_imsm_with_parts.json b/tests/data/probert_storage_imsm_with_parts.json new file mode 100644 index 0000000..76efe92 --- /dev/null +++ b/tests/data/probert_storage_imsm_with_parts.json @@ -0,0 +1,1560 @@ +{ + "lvm": {}, + "mount": [ + { + "target": "/", + "source": "/cow", + "fstype": "overlay", + "options": "rw,relatime,lowerdir=/minimal.standard.live.hotfix.squashfs:/minimal.standard.live.squashfs:/minimal.standard.squashfs:/minimal.squashfs,upperdir=/cow/upper,workdir=/cow/work,uuid=on,xino=off,nouserxattr", + "maj:min": "0:29", + "children": [ + { + "target": "/sys", + "source": "sysfs", + "fstype": "sysfs", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:23", + "children": [ + { + "target": "/sys/firmware/efi/efivars", + "source": "efivarfs", + "fstype": "efivarfs", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:27" + }, + { + "target": "/sys/kernel/security", + "source": "securityfs", + "fstype": "securityfs", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:6" + }, + { + "target": "/sys/fs/cgroup", + "source": "cgroup2", + "fstype": "cgroup2", + "options": "rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot", + "maj:min": "0:37" + }, + { + "target": "/sys/fs/pstore", + "source": "pstore", + "fstype": "pstore", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:38" + }, + { + "target": "/sys/fs/bpf", + "source": "bpf", + "fstype": "bpf", + "options": "rw,nosuid,nodev,noexec,relatime,mode=700", + "maj:min": "0:39" + }, + { + "target": "/sys/kernel/tracing", + "source": "tracefs", + "fstype": "tracefs", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:12" + }, + { + "target": "/sys/kernel/debug", + "source": "debugfs", + "fstype": "debugfs", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:7" + }, + { + "target": "/sys/fs/fuse/connections", + "source": "fusectl", + "fstype": "fusectl", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:42" + }, + { + "target": "/sys/kernel/config", + "source": "configfs", + "fstype": "configfs", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:21" + } + ] + }, + { + "target": "/proc", + "source": "proc", + "fstype": "proc", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:24", + "children": [ + { + "target": "/proc/sys/fs/binfmt_misc", + "source": "systemd-1", + "fstype": "autofs", + "options": "rw,relatime,fd=32,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=17511", + "maj:min": "0:40", + "children": [ + { + "target": "/proc/sys/fs/binfmt_misc", + "source": "binfmt_misc", + "fstype": "binfmt_misc", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:50" + } + ] + } + ] + }, + { + "target": "/dev", + "source": "udev", + "fstype": "devtmpfs", + "options": "rw,nosuid,relatime,size=32665196k,nr_inodes=8166299,mode=755,inode64", + "maj:min": "0:5", + "children": [ + { + "target": "/dev/pts", + "source": "devpts", + "fstype": "devpts", + "options": "rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000", + "maj:min": "0:25" + }, + { + "target": "/dev/shm", + "source": "tmpfs", + "fstype": "tmpfs", + "options": "rw,nosuid,nodev,inode64", + "maj:min": "0:35" + }, + { + "target": "/dev/mqueue", + "source": "mqueue", + "fstype": "mqueue", + "options": "rw,nosuid,nodev,noexec,relatime", + "maj:min": "0:20" + }, + { + "target": "/dev/hugepages", + "source": "hugetlbfs", + "fstype": "hugetlbfs", + "options": "rw,nosuid,nodev,relatime,pagesize=2M", + "maj:min": "0:41" + } + ] + }, + { + "target": "/run", + "source": "tmpfs", + "fstype": "tmpfs", + "options": "rw,nosuid,nodev,noexec,relatime,size=6541088k,mode=755,inode64", + "maj:min": "0:26", + "children": [ + { + "target": "/run/lock", + "source": "tmpfs", + "fstype": "tmpfs", + "options": "rw,nosuid,nodev,noexec,relatime,size=5120k,inode64", + "maj:min": "0:36" + }, + { + "target": "/run/snapd/ns", + "source": "tmpfs[/snapd/ns]", + "fstype": "tmpfs", + "options": "rw,nosuid,nodev,noexec,relatime,size=6541088k,mode=755,inode64", + "maj:min": "0:26", + "children": [ + { + "target": "/run/snapd/ns/firefox.mnt", + "source": "nsfs[mnt:[4026533381]]", + "fstype": "nsfs", + "options": "rw", + "maj:min": "0:4" + }, + { + "target": "/run/snapd/ns/firmware-updater.mnt", + "source": "nsfs[mnt:[4026533439]]", + "fstype": "nsfs", + "options": "rw", + "maj:min": "0:4" + }, + { + "target": "/run/snapd/ns/snap-store.mnt", + "source": "nsfs[mnt:[4026533443]]", + "fstype": "nsfs", + "options": "rw", + "maj:min": "0:4" + }, + { + "target": "/run/snapd/ns/snapd-desktop-integration.mnt", + "source": "nsfs[mnt:[4026533502]]", + "fstype": "nsfs", + "options": "rw", + "maj:min": "0:4" + }, + { + "target": "/run/snapd/ns/factory-reset-tools.mnt", + "source": "nsfs[mnt:[4026533504]]", + "fstype": "nsfs", + "options": "rw", + "maj:min": "0:4" + }, + { + "target": "/run/snapd/ns/thunderbird.mnt", + "source": "nsfs[mnt:[4026533505]]", + "fstype": "nsfs", + "options": "rw", + "maj:min": "0:4" + } + ] + }, + { + "target": "/run/user/1000", + "source": "tmpfs", + "fstype": "tmpfs", + "options": "rw,nosuid,nodev,relatime,size=6541084k,nr_inodes=1635271,mode=700,uid=1000,gid=1000,inode64", + "maj:min": "0:75", + "children": [ + { + "target": "/run/user/1000/gvfs", + "source": "gvfsd-fuse", + "fstype": "fuse.gvfsd-fuse", + "options": "rw,nosuid,nodev,relatime,user_id=1000,group_id=1000", + "maj:min": "0:82" + }, + { + "target": "/run/user/1000/doc", + "source": "portal", + "fstype": "fuse.portal", + "options": "rw,nosuid,nodev,relatime,user_id=1000,group_id=1000", + "maj:min": "0:95" + } + ] + } + ] + }, + { + "target": "/cdrom", + "source": "/dev/md126p2", + "fstype": "vfat", + "options": "ro,noatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro", + "maj:min": "259:2" + }, + { + "target": "/rofs", + "source": "/dev/loop0", + "fstype": "squashfs", + "options": "ro,noatime,errors=continue,threads=single", + "maj:min": "7:0" + }, + { + "target": "/tmp", + "source": "tmpfs", + "fstype": "tmpfs", + "options": "rw,nosuid,nodev,relatime,inode64", + "maj:min": "0:43" + }, + { + "target": "/snap/bare/5", + "source": "/dev/loop5", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:5" + }, + { + "target": "/snap/factory-reset-tools/55", + "source": "/dev/loop6", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:6" + }, + { + "target": "/snap/firefox/5600", + "source": "/dev/loop7", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:7" + }, + { + "target": "/snap/ubuntu-desktop-bootstrap/301", + "source": "/dev/loop8", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:8" + }, + { + "target": "/snap/thunderbird/609", + "source": "/dev/loop9", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:9" + }, + { + "target": "/snap/core22/1722", + "source": "/dev/loop4", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:4" + }, + { + "target": "/snap/firmware-updater/147", + "source": "/dev/loop11", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:11" + }, + { + "target": "/snap/gnome-42-2204/176", + "source": "/dev/loop10", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:10" + }, + { + "target": "/snap/snapd-desktop-integration/253", + "source": "/dev/loop14", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:14" + }, + { + "target": "/snap/snap-store/1248", + "source": "/dev/loop15", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:15" + }, + { + "target": "/snap/snapd/23545", + "source": "/dev/loop13", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:13" + }, + { + "target": "/snap/gtk-common-themes/1535", + "source": "/dev/loop12", + "fstype": "squashfs", + "options": "ro,nodev,relatime,errors=continue,threads=single", + "maj:min": "7:12" + }, + { + "target": "/snap/ubuntu-desktop-bootstrap/x1", + "source": "/cow[/home/ubuntu/squashfs-root]", + "fstype": "overlay", + "options": "ro,nodev,relatime,lowerdir=/minimal.standard.live.hotfix.squashfs:/minimal.standard.live.squashfs:/minimal.standard.squashfs:/minimal.squashfs,upperdir=/cow/upper,workdir=/cow/work,uuid=on,xino=off,nouserxattr", + "maj:min": "0:29" + } + ] + } + ], + "dasd": {}, + "dmcrypt": {}, + "bcache": { + "backing": {}, + "caching": {} + }, + "raid": { + "/dev/md126": { + "CURRENT_TAGS": ":systemd:", + "DEVLINKS": "/dev/disk/by-id/md-uuid-2b219152:a527314e:2421b1aa:763fe1c4 /dev/md/Volume1_0", + "DEVNAME": "/dev/md126", + "DEVPATH": "/devices/virtual/block/md126", + "DEVTYPE": "disk", + "DISKSEQ": "13", + "ID_IGNORE_DISKSEQ": "1", + "ID_PART_TABLE_TYPE": "gpt", + "ID_PART_TABLE_UUID": "21c689c9-6030-4d14-ae66-f280ef4daaf8", + "MAJOR": "9", + "MD_CONTAINER": "/dev/md/imsm0", + "MD_DEVICES": "2", + "MD_DEVNAME": "Volume1_0", + "MD_LEVEL": "raid1", + "MD_MEMBER": "0", + "MD_MON_THIS": "../md127", + "MD_UUID": "2b219152:a527314e:2421b1aa:763fe1c4", + "MINOR": "126", + "SUBSYSTEM": "block", + "SYSTEMD_WANTS": "mdmonitor.service mdmon@md127.service", + "TAGS": ":systemd:", + "UDISKS_IGNORE": "1", + "UDISKS_MD_CONTAINER": "/dev/md/imsm0", + "UDISKS_MD_DEVICES": "2", + "UDISKS_MD_DEVICE_dev_nvme0n1_DEV": "/dev/nvme0n1", + "UDISKS_MD_DEVICE_dev_nvme0n1_ROLE": "1", + "UDISKS_MD_DEVICE_dev_nvme1n1_DEV": "/dev/nvme1n1", + "UDISKS_MD_DEVICE_dev_nvme1n1_ROLE": "0", + "UDISKS_MD_DEVNAME": "Volume1_0", + "UDISKS_MD_LEVEL": "raid1", + "UDISKS_MD_MEMBER": "0", + "UDISKS_MD_UUID": "2b219152:a527314e:2421b1aa:763fe1c4", + "USEC_INITIALIZED": "1607238", + "container": "/dev/md/imsm0", + "size": "4096803209216", + "raidlevel": "raid1" + }, + "/dev/md127": { + "CURRENT_TAGS": ":systemd:", + "DEVLINKS": "/dev/disk/by-id/md-uuid-9fe673fb:76093732:2e12989f:d3e828f1 /dev/md/imsm0", + "DEVNAME": "/dev/md127", + "DEVPATH": "/devices/virtual/block/md127", + "DEVTYPE": "disk", + "DISKSEQ": "11", + "ID_IGNORE_DISKSEQ": "1", + "MAJOR": "9", + "MD_DEVICES": "2", + "MD_DEVNAME": "imsm0", + "MD_LEVEL": "container", + "MD_METADATA": "imsm", + "MD_UUID": "9fe673fb:76093732:2e12989f:d3e828f1", + "MINOR": "127", + "SUBSYSTEM": "block", + "SYSTEMD_READY": "0", + "TAGS": ":systemd:", + "UDISKS_IGNORE": "1", + "UDISKS_MD_DEVICES": "2", + "UDISKS_MD_DEVICE_dev_nvme0n1_DEV": "/dev/nvme0n1", + "UDISKS_MD_DEVICE_dev_nvme0n1_ROLE": "spare", + "UDISKS_MD_DEVICE_dev_nvme1n1_DEV": "/dev/nvme1n1", + "UDISKS_MD_DEVICE_dev_nvme1n1_ROLE": "spare", + "UDISKS_MD_DEVNAME": "imsm0", + "UDISKS_MD_LEVEL": "container", + "UDISKS_MD_METADATA": "imsm", + "UDISKS_MD_UUID": "9fe673fb:76093732:2e12989f:d3e828f1", + "USEC_INITIALIZED": "1577302", + "devices": [ + "/dev/nvme0n1", + "/dev/nvme1n1" + ], + "spare_devices": [], + "size": "0", + "raidlevel": "container" + } + }, + "nvme": { + "nvme1": { + "DEVNAME": "/dev/nvme1", + "DEVPATH": "/devices/pci0000:00/0000:00:0e.0/pci10000:e0/10000:e0:06.0/10000:e1:00.0/nvme/nvme1", + "ID_MODEL_FROM_DATABASE": "NVMe SSD Controller XG8", + "ID_PCI_CLASS_FROM_DATABASE": "Mass storage controller", + "ID_PCI_INTERFACE_FROM_DATABASE": "NVM Express", + "ID_PCI_SUBCLASS_FROM_DATABASE": "Non-Volatile memory controller", + "ID_VENDOR_FROM_DATABASE": "KIOXIA Corporation", + "MAJOR": "240", + "MINOR": "1", + "NVME_TRTYPE": "pcie", + "SUBSYSTEM": "nvme", + "USEC_INITIALIZED": "8091033", + "attrs": { + "address": "10000:e1:00.0", + "cntlid": "0", + "cntrltype": "io", + "dctype": "none", + "dev": "240:1", + "device": null, + "firmware_rev": "11304103", + "kato": "0", + "model": "KXG80ZN84T09 NVMe KIOXIA 4096GB ", + "numa_node": "-1", + "passthru_err_log_enabled": "off", + "power/async": "disabled", + "power/autosuspend_delay_ms": null, + "power/control": "auto", + "power/pm_qos_latency_tolerance_us": "100000", + "power/runtime_active_kids": "0", + "power/runtime_active_time": "0", + "power/runtime_enabled": "disabled", + "power/runtime_status": "unsupported", + "power/runtime_suspended_time": "0", + "power/runtime_usage": "0", + "queue_count": "19", + "serial": "53DFC140F0KK ", + "sqsize": "1023", + "state": "live", + "subsysnqn": "nqn.2019-10.com.kioxia:KXG80ZN84T09 NVMe KIOXIA 4096GB:53DFC140F0KK", + "subsystem": "nvme", + "transport": "pcie", + "uevent": "MAJOR=240\nMINOR=1\nDEVNAME=nvme1\nNVME_TRTYPE=pcie" + } + }, + "nvme0": { + "DEVNAME": "/dev/nvme0", + "DEVPATH": "/devices/pci0000:00/0000:00:0e.0/pci10000:e0/10000:e0:06.2/10000:e2:00.0/nvme/nvme0", + "ID_MODEL_FROM_DATABASE": "WD Black SN850X NVMe SSD", + "ID_PCI_CLASS_FROM_DATABASE": "Mass storage controller", + "ID_PCI_INTERFACE_FROM_DATABASE": "NVM Express", + "ID_PCI_SUBCLASS_FROM_DATABASE": "Non-Volatile memory controller", + "ID_VENDOR_FROM_DATABASE": "Sandisk Corp", + "MAJOR": "240", + "MINOR": "0", + "NVME_TRTYPE": "pcie", + "SUBSYSTEM": "nvme", + "USEC_INITIALIZED": "8091110", + "attrs": { + "address": "10000:e2:00.0", + "cntlid": "8224", + "cntrltype": "io", + "dctype": "none", + "dev": "240:0", + "device": null, + "firmware_rev": "62012435", + "kato": "0", + "model": "PC SN820 NVMe WD 4096GB ", + "numa_node": "-1", + "passthru_err_log_enabled": "off", + "power/async": "disabled", + "power/autosuspend_delay_ms": null, + "power/control": "auto", + "power/pm_qos_latency_tolerance_us": "100000", + "power/runtime_active_kids": "0", + "power/runtime_active_time": "0", + "power/runtime_enabled": "disabled", + "power/runtime_status": "unsupported", + "power/runtime_suspended_time": "0", + "power/runtime_usage": "0", + "queue_count": "19", + "serial": "23114N440702 ", + "sqsize": "1023", + "state": "live", + "subsysnqn": "nqn.2018-01.com.wdc:nguid:E8238FA6BF53-0001-001B444A48AE486A", + "subsystem": "nvme", + "transport": "pcie", + "uevent": "MAJOR=240\nMINOR=0\nDEVNAME=nvme0\nNVME_TRTYPE=pcie" + } + } + }, + "multipath": {}, + "blockdev": { + "/dev/nvme1n1": { + "CURRENT_TAGS": ":systemd:", + "DEVLINKS": "/dev/disk/by-id/nvme-eui.00000000000000008ce38e0500e3957d /dev/disk/by-id/nvme-KXG80ZN84T09_NVMe_KIOXIA_4096GB_53DFC140F0KK /dev/disk/by-diskseq/9 /dev/disk/by-path/pci-0000:00:0e.0-pci-10000:e1:00.0-nvme-1 /dev/disk/by-id/nvme-KXG80ZN84T09_NVMe_KIOXIA_4096GB_53DFC140F0KK_1", + "DEVNAME": "/dev/nvme1n1", + "DEVPATH": "/devices/pci0000:00/0000:00:0e.0/pci10000:e0/10000:e0:06.0/10000:e1:00.0/nvme/nvme1/nvme1n1", + "DEVTYPE": "disk", + "DISKSEQ": "9", + "ID_FS_TYPE": "isw_raid_member", + "ID_FS_USAGE": "raid", + "ID_FS_VERSION": "1.3.00", + "ID_MODEL": "KXG80ZN84T09 NVMe KIOXIA 4096GB", + "ID_NSID": "1", + "ID_PATH": "pci-0000:00:0e.0-pci-10000:e1:00.0-nvme-1", + "ID_PATH_TAG": "pci-0000_00_0e_0-pci-10000_e1_00_0-nvme-1", + "ID_REVISION": "11304103", + "ID_SERIAL": "KXG80ZN84T09_NVMe_KIOXIA_4096GB_53DFC140F0KK_1", + "ID_SERIAL_SHORT": "53DFC140F0KK", + "ID_WWN": "eui.00000000000000008ce38e0500e3957d", + "MAJOR": "259", + "MINOR": "0", + "SUBSYSTEM": "block", + "TAGS": ":systemd:", + "UDISKS_IGNORE": "1", + "USEC_INITIALIZED": "1545263", + "attrs": { + "alignment_offset": "0", + "bdi": null, + "capability": "0", + "csi": "0", + "dev": "259:0", + "device": null, + "discard_alignment": "0", + "diskseq": "9", + "eui": "8c e3 8e 05 00 e3 95 7d", + "events": "", + "events_async": "", + "events_poll_msecs": "-1", + "ext_range": "256", + "hidden": "0", + "holders/md126": null, + "holders/md127": null, + "inflight": " 0 0", + "integrity/device_is_integrity_capable": "0", + "integrity/format": "none", + "integrity/protection_interval_bytes": "0", + "integrity/read_verify": "0", + "integrity/tag_size": "0", + "integrity/write_generate": "0", + "metadata_bytes": "0", + "mq/0/cpu_list": "0, 1", + "mq/0/nr_reserved_tags": "0", + "mq/0/nr_tags": "1023", + "mq/1/cpu_list": "2, 3", + "mq/1/nr_reserved_tags": "0", + "mq/1/nr_tags": "1023", + "mq/10/cpu_list": "12", + "mq/10/nr_reserved_tags": "0", + "mq/10/nr_tags": "1023", + "mq/11/cpu_list": "13", + "mq/11/nr_reserved_tags": "0", + "mq/11/nr_tags": "1023", + "mq/12/cpu_list": "14", + "mq/12/nr_reserved_tags": "0", + "mq/12/nr_tags": "1023", + "mq/13/cpu_list": "15", + "mq/13/nr_reserved_tags": "0", + "mq/13/nr_tags": "1023", + "mq/14/cpu_list": "16", + "mq/14/nr_reserved_tags": "0", + "mq/14/nr_tags": "1023", + "mq/15/cpu_list": "17", + "mq/15/nr_reserved_tags": "0", + "mq/15/nr_tags": "1023", + "mq/16/cpu_list": "18", + "mq/16/nr_reserved_tags": "0", + "mq/16/nr_tags": "1023", + "mq/17/cpu_list": "19", + "mq/17/nr_reserved_tags": "0", + "mq/17/nr_tags": "1023", + "mq/2/cpu_list": "4", + "mq/2/nr_reserved_tags": "0", + "mq/2/nr_tags": "1023", + "mq/3/cpu_list": "5", + "mq/3/nr_reserved_tags": "0", + "mq/3/nr_tags": "1023", + "mq/4/cpu_list": "6", + "mq/4/nr_reserved_tags": "0", + "mq/4/nr_tags": "1023", + "mq/5/cpu_list": "7", + "mq/5/nr_reserved_tags": "0", + "mq/5/nr_tags": "1023", + "mq/6/cpu_list": "8", + "mq/6/nr_reserved_tags": "0", + "mq/6/nr_tags": "1023", + "mq/7/cpu_list": "9", + "mq/7/nr_reserved_tags": "0", + "mq/7/nr_tags": "1023", + "mq/8/cpu_list": "10", + "mq/8/nr_reserved_tags": "0", + "mq/8/nr_tags": "1023", + "mq/9/cpu_list": "11", + "mq/9/nr_reserved_tags": "0", + "mq/9/nr_tags": "1023", + "nguid": "00000000-0000-0000-8ce3-8e0500e3957d", + "nsid": "1", + "nuse": "8001573552", + "partscan": "1", + "passthru_err_log_enabled": "off", + "power/async": "disabled", + "power/autosuspend_delay_ms": null, + "power/control": "auto", + "power/runtime_active_kids": "0", + "power/runtime_active_time": "0", + "power/runtime_enabled": "disabled", + "power/runtime_status": "unsupported", + "power/runtime_suspended_time": "0", + "power/runtime_usage": "0", + "queue/add_random": "0", + "queue/chunk_sectors": "0", + "queue/dax": "0", + "queue/discard_granularity": "512", + "queue/discard_max_bytes": "2199023255040", + "queue/discard_max_hw_bytes": "2199023255040", + "queue/discard_zeroes_data": "0", + "queue/dma_alignment": "3", + "queue/fua": "1", + "queue/hw_sector_size": "512", + "queue/io_poll": "0", + "queue/io_poll_delay": "-1", + "queue/io_timeout": "30000", + "queue/iostats": "1", + "queue/logical_block_size": "512", + "queue/max_discard_segments": "256", + "queue/max_hw_sectors_kb": "128", + "queue/max_integrity_segments": "0", + "queue/max_sectors_kb": "128", + "queue/max_segment_size": "4294967295", + "queue/max_segments": "33", + "queue/minimum_io_size": "512", + "queue/nomerges": "0", + "queue/nr_requests": "1023", + "queue/nr_zones": "0", + "queue/optimal_io_size": "0", + "queue/physical_block_size": "512", + "queue/read_ahead_kb": "128", + "queue/rotational": "0", + "queue/rq_affinity": "1", + "queue/scheduler": "[none] mq-deadline ", + "queue/stable_writes": "0", + "queue/virt_boundary_mask": "4095", + "queue/wbt_lat_usec": "2000", + "queue/write_cache": "write back", + "queue/write_same_max_bytes": "0", + "queue/write_zeroes_max_bytes": "131072", + "queue/zone_append_max_bytes": "0", + "queue/zone_write_granularity": "0", + "queue/zoned": "none", + "range": "0", + "removable": "0", + "ro": "0", + "size": "4096805658624", + "stat": " 1822884 1781377 462487538 260638 34 0 30 5 0 69104 260644 0 0 0 0 4 1", + "subsystem": "block", + "trace/act_mask": "disabled", + "trace/enable": "0", + "trace/end_lba": "disabled", + "trace/pid": "disabled", + "trace/start_lba": "disabled", + "uevent": "MAJOR=259\nMINOR=0\nDEVNAME=nvme1n1\nDEVTYPE=disk\nDISKSEQ=9", + "uuid": "00000000-0000-0000-8ce3-8e0500e3957d", + "wwid": "eui.00000000000000008ce38e0500e3957d" + }, + "partitiontable": { + "label": "gpt", + "id": "21C689C9-6030-4D14-AE66-F280EF4DAAF8", + "device": "/dev/nvme1n1", + "unit": "sectors", + "firstlba": 2048, + "lastlba": 8001568734, + "sectorsize": 512, + "partitions": [ + { + "node": "/dev/nvme1n1p1", + "start": 2048, + "size": 2201600, + "type": "C12A7328-F81F-11D2-BA4B-00A0C93EC93B", + "uuid": "EA24FB61-DD5A-4609-A3DE-714443148DE4" + }, + { + "node": "/dev/nvme1n1p2", + "start": 2203648, + "size": 25165824, + "type": "E3C9E316-0B5C-4DB8-817D-F92DF00215AE", + "uuid": "A32BA6C7-9650-4A1D-BB71-2772395F2737" + }, + { + "node": "/dev/nvme1n1p3", + "start": 27369472, + "size": 7974197248, + "type": "0FC63DAF-8483-4772-8E79-3D69D8477DE4", + "uuid": "C93E447D-4FDC-4937-8FE2-09C0B0D04317" + } + ] + } + }, + "/dev/nvme0n1": { + "CURRENT_TAGS": ":systemd:", + "DEVLINKS": "/dev/disk/by-diskseq/10 /dev/disk/by-id/nvme-PC_SN820_NVMe_WD_4096GB_23114N440702_1 /dev/disk/by-id/nvme-eui.e8238fa6bf530001001b444a48ae486a /dev/disk/by-id/nvme-PC_SN820_NVMe_WD_4096GB_23114N440702 /dev/disk/by-path/pci-0000:00:0e.0-pci-10000:e2:00.0-nvme-1", + "DEVNAME": "/dev/nvme0n1", + "DEVPATH": "/devices/pci0000:00/0000:00:0e.0/pci10000:e0/10000:e0:06.2/10000:e2:00.0/nvme/nvme0/nvme0n1", + "DEVTYPE": "disk", + "DISKSEQ": "10", + "ID_FS_TYPE": "isw_raid_member", + "ID_FS_USAGE": "raid", + "ID_FS_VERSION": "1.3.00", + "ID_MODEL": "PC SN820 NVMe WD 4096GB", + "ID_NSID": "1", + "ID_PATH": "pci-0000:00:0e.0-pci-10000:e2:00.0-nvme-1", + "ID_PATH_TAG": "pci-0000_00_0e_0-pci-10000_e2_00_0-nvme-1", + "ID_REVISION": "62012435", + "ID_SERIAL": "PC_SN820_NVMe_WD_4096GB_23114N440702_1", + "ID_SERIAL_SHORT": "23114N440702", + "ID_WWN": "eui.e8238fa6bf530001001b444a48ae486a", + "MAJOR": "259", + "MINOR": "4", + "SUBSYSTEM": "block", + "TAGS": ":systemd:", + "UDISKS_IGNORE": "1", + "USEC_INITIALIZED": "1571730", + "attrs": { + "alignment_offset": "0", + "bdi": null, + "capability": "0", + "csi": "0", + "dev": "259:4", + "device": null, + "discard_alignment": "0", + "diskseq": "10", + "eui": "00 1b 44 4a 48 ae 48 6a", + "events": "", + "events_async": "", + "events_poll_msecs": "-1", + "ext_range": "256", + "hidden": "0", + "holders/md126": null, + "holders/md127": null, + "inflight": " 0 0", + "integrity/device_is_integrity_capable": "0", + "integrity/format": "none", + "integrity/protection_interval_bytes": "0", + "integrity/read_verify": "0", + "integrity/tag_size": "0", + "integrity/write_generate": "0", + "metadata_bytes": "0", + "mq/0/cpu_list": "0, 1", + "mq/0/nr_reserved_tags": "0", + "mq/0/nr_tags": "1023", + "mq/1/cpu_list": "2, 3", + "mq/1/nr_reserved_tags": "0", + "mq/1/nr_tags": "1023", + "mq/10/cpu_list": "12", + "mq/10/nr_reserved_tags": "0", + "mq/10/nr_tags": "1023", + "mq/11/cpu_list": "13", + "mq/11/nr_reserved_tags": "0", + "mq/11/nr_tags": "1023", + "mq/12/cpu_list": "14", + "mq/12/nr_reserved_tags": "0", + "mq/12/nr_tags": "1023", + "mq/13/cpu_list": "15", + "mq/13/nr_reserved_tags": "0", + "mq/13/nr_tags": "1023", + "mq/14/cpu_list": "16", + "mq/14/nr_reserved_tags": "0", + "mq/14/nr_tags": "1023", + "mq/15/cpu_list": "17", + "mq/15/nr_reserved_tags": "0", + "mq/15/nr_tags": "1023", + "mq/16/cpu_list": "18", + "mq/16/nr_reserved_tags": "0", + "mq/16/nr_tags": "1023", + "mq/17/cpu_list": "19", + "mq/17/nr_reserved_tags": "0", + "mq/17/nr_tags": "1023", + "mq/2/cpu_list": "4", + "mq/2/nr_reserved_tags": "0", + "mq/2/nr_tags": "1023", + "mq/3/cpu_list": "5", + "mq/3/nr_reserved_tags": "0", + "mq/3/nr_tags": "1023", + "mq/4/cpu_list": "6", + "mq/4/nr_reserved_tags": "0", + "mq/4/nr_tags": "1023", + "mq/5/cpu_list": "7", + "mq/5/nr_reserved_tags": "0", + "mq/5/nr_tags": "1023", + "mq/6/cpu_list": "8", + "mq/6/nr_reserved_tags": "0", + "mq/6/nr_tags": "1023", + "mq/7/cpu_list": "9", + "mq/7/nr_reserved_tags": "0", + "mq/7/nr_tags": "1023", + "mq/8/cpu_list": "10", + "mq/8/nr_reserved_tags": "0", + "mq/8/nr_tags": "1023", + "mq/9/cpu_list": "11", + "mq/9/nr_reserved_tags": "0", + "mq/9/nr_tags": "1023", + "nguid": "e8238fa6-bf53-0001-001b-444a48ae486a", + "nsid": "1", + "nuse": "8001573552", + "partscan": "1", + "passthru_err_log_enabled": "off", + "power/async": "disabled", + "power/autosuspend_delay_ms": null, + "power/control": "auto", + "power/runtime_active_kids": "0", + "power/runtime_active_time": "0", + "power/runtime_enabled": "disabled", + "power/runtime_status": "unsupported", + "power/runtime_suspended_time": "0", + "power/runtime_usage": "0", + "queue/add_random": "0", + "queue/chunk_sectors": "0", + "queue/dax": "0", + "queue/discard_granularity": "512", + "queue/discard_max_bytes": "2199023255040", + "queue/discard_max_hw_bytes": "2199023255040", + "queue/discard_zeroes_data": "0", + "queue/dma_alignment": "3", + "queue/fua": "1", + "queue/hw_sector_size": "512", + "queue/io_poll": "0", + "queue/io_poll_delay": "-1", + "queue/io_timeout": "30000", + "queue/iostats": "1", + "queue/logical_block_size": "512", + "queue/max_discard_segments": "256", + "queue/max_hw_sectors_kb": "128", + "queue/max_integrity_segments": "0", + "queue/max_sectors_kb": "128", + "queue/max_segment_size": "4294967295", + "queue/max_segments": "33", + "queue/minimum_io_size": "512", + "queue/nomerges": "0", + "queue/nr_requests": "1023", + "queue/nr_zones": "0", + "queue/optimal_io_size": "0", + "queue/physical_block_size": "512", + "queue/read_ahead_kb": "128", + "queue/rotational": "0", + "queue/rq_affinity": "1", + "queue/scheduler": "[none] mq-deadline ", + "queue/stable_writes": "0", + "queue/virt_boundary_mask": "4095", + "queue/wbt_lat_usec": "2000", + "queue/write_cache": "write back", + "queue/write_same_max_bytes": "0", + "queue/write_zeroes_max_bytes": "131072", + "queue/zone_append_max_bytes": "0", + "queue/zone_write_granularity": "0", + "queue/zoned": "none", + "range": "0", + "removable": "0", + "ro": "0", + "size": "4096805658624", + "stat": " 4682 4 966118 2105 1779143 1771291 454451230 559029 0 87455 561136 0 0 0 0 4 2", + "subsystem": "block", + "trace/act_mask": "disabled", + "trace/enable": "0", + "trace/end_lba": "disabled", + "trace/pid": "disabled", + "trace/start_lba": "disabled", + "uevent": "MAJOR=259\nMINOR=4\nDEVNAME=nvme0n1\nDEVTYPE=disk\nDISKSEQ=10", + "uuid": "e8238fa6-bf53-0001-001b-444a48ae486a", + "wwid": "eui.e8238fa6bf530001001b444a48ae486a" + }, + "partitiontable": { + "label": "gpt", + "id": "21C689C9-6030-4D14-AE66-F280EF4DAAF8", + "device": "/dev/nvme0n1", + "unit": "sectors", + "firstlba": 2048, + "lastlba": 8001568734, + "sectorsize": 512, + "partitions": [ + { + "node": "/dev/nvme0n1p1", + "start": 2048, + "size": 2201600, + "type": "C12A7328-F81F-11D2-BA4B-00A0C93EC93B", + "uuid": "EA24FB61-DD5A-4609-A3DE-714443148DE4" + }, + { + "node": "/dev/nvme0n1p2", + "start": 2203648, + "size": 25165824, + "type": "E3C9E316-0B5C-4DB8-817D-F92DF00215AE", + "uuid": "A32BA6C7-9650-4A1D-BB71-2772395F2737" + }, + { + "node": "/dev/nvme0n1p3", + "start": 27369472, + "size": 7974197248, + "type": "0FC63DAF-8483-4772-8E79-3D69D8477DE4", + "uuid": "C93E447D-4FDC-4937-8FE2-09C0B0D04317" + } + ] + } + }, + "/dev/md126": { + "CURRENT_TAGS": ":systemd:", + "DEVLINKS": "/dev/disk/by-id/md-uuid-2b219152:a527314e:2421b1aa:763fe1c4 /dev/md/Volume1_0", + "DEVNAME": "/dev/md126", + "DEVPATH": "/devices/virtual/block/md126", + "DEVTYPE": "disk", + "DISKSEQ": "13", + "ID_IGNORE_DISKSEQ": "1", + "ID_PART_TABLE_TYPE": "gpt", + "ID_PART_TABLE_UUID": "21c689c9-6030-4d14-ae66-f280ef4daaf8", + "MAJOR": "9", + "MD_CONTAINER": "/dev/md/imsm0", + "MD_DEVICES": "2", + "MD_DEVNAME": "Volume1_0", + "MD_LEVEL": "raid1", + "MD_MEMBER": "0", + "MD_MON_THIS": "../md127", + "MD_UUID": "2b219152:a527314e:2421b1aa:763fe1c4", + "MINOR": "126", + "SUBSYSTEM": "block", + "SYSTEMD_WANTS": "mdmonitor.service mdmon@md127.service", + "TAGS": ":systemd:", + "UDISKS_IGNORE": "1", + "UDISKS_MD_CONTAINER": "/dev/md/imsm0", + "UDISKS_MD_DEVICES": "2", + "UDISKS_MD_DEVICE_dev_nvme0n1_DEV": "/dev/nvme0n1", + "UDISKS_MD_DEVICE_dev_nvme0n1_ROLE": "1", + "UDISKS_MD_DEVICE_dev_nvme1n1_DEV": "/dev/nvme1n1", + "UDISKS_MD_DEVICE_dev_nvme1n1_ROLE": "0", + "UDISKS_MD_DEVNAME": "Volume1_0", + "UDISKS_MD_LEVEL": "raid1", + "UDISKS_MD_MEMBER": "0", + "UDISKS_MD_UUID": "2b219152:a527314e:2421b1aa:763fe1c4", + "USEC_INITIALIZED": "1607238", + "attrs": { + "alignment_offset": "0", + "bdi": null, + "capability": "0", + "dev": "9:126", + "discard_alignment": "0", + "diskseq": "13", + "events": "", + "events_async": "", + "events_poll_msecs": "-1", + "ext_range": "256", + "hidden": "0", + "inflight": " 0 0", + "integrity/device_is_integrity_capable": "0", + "integrity/format": "none", + "integrity/protection_interval_bytes": "0", + "integrity/read_verify": "0", + "integrity/tag_size": "0", + "integrity/write_generate": "0", + "md/array_size": "4000784384", + "md/array_state": "clean", + "md/bitmap/backlog": "0", + "md/bitmap/can_clear": "", + "md/bitmap/chunksize": "0", + "md/bitmap/location": "none", + "md/bitmap/max_backlog_used": "0", + "md/bitmap/metadata": "internal", + "md/bitmap/space": "0", + "md/bitmap/time_base": "0", + "md/chunk_size": "65536", + "md/component_size": "4000784384", + "md/consistency_policy": "resync", + "md/degraded": "0", + "md/dev-nvme0n1/bad_blocks": "", + "md/dev-nvme0n1/block": null, + "md/dev-nvme0n1/errors": "0", + "md/dev-nvme0n1/new_offset": "0", + "md/dev-nvme0n1/offset": "0", + "md/dev-nvme0n1/ppl_sector": "0", + "md/dev-nvme0n1/ppl_size": "0", + "md/dev-nvme0n1/recovery_start": "none", + "md/dev-nvme0n1/size": "4000784384", + "md/dev-nvme0n1/slot": "1", + "md/dev-nvme0n1/state": "in_sync,external_bbl", + "md/dev-nvme0n1/unacknowledged_bad_blocks": "", + "md/dev-nvme1n1/bad_blocks": "", + "md/dev-nvme1n1/block": null, + "md/dev-nvme1n1/errors": "0", + "md/dev-nvme1n1/new_offset": "0", + "md/dev-nvme1n1/offset": "0", + "md/dev-nvme1n1/ppl_sector": "0", + "md/dev-nvme1n1/ppl_size": "0", + "md/dev-nvme1n1/recovery_start": "none", + "md/dev-nvme1n1/size": "4000784384", + "md/dev-nvme1n1/slot": "0", + "md/dev-nvme1n1/state": "in_sync,external_bbl", + "md/dev-nvme1n1/unacknowledged_bad_blocks": "", + "md/fail_last_dev": "0", + "md/last_sync_action": "resync", + "md/layout": "0", + "md/level": "raid1", + "md/max_read_errors": "20", + "md/metadata_version": "external:/md127/0", + "md/mismatch_cnt": "0", + "md/raid_disks": "2", + "md/rd0": null, + "md/rd1": null, + "md/reshape_direction": "forwards", + "md/reshape_position": "none", + "md/resync_start": "6927374336", + "md/safe_mode_delay": "5.000", + "md/serialize_policy": "0", + "md/suspend_hi": "0", + "md/suspend_lo": "0", + "md/sync_action": "resync", + "md/sync_completed": "6927374336 / 8001568768", + "md/sync_force_parallel": "0", + "md/sync_max": "max", + "md/sync_min": "0", + "md/sync_speed": "205758", + "md/sync_speed_max": "200000 (system)", + "md/sync_speed_min": "1000 (system)", + "md/uuid": "00000000-0000-0000-0000-000000000000", + "partscan": "1", + "power/async": "disabled", + "power/autosuspend_delay_ms": null, + "power/control": "auto", + "power/runtime_active_kids": "0", + "power/runtime_active_time": "0", + "power/runtime_enabled": "disabled", + "power/runtime_status": "unsupported", + "power/runtime_suspended_time": "0", + "power/runtime_usage": "0", + "queue/add_random": "0", + "queue/chunk_sectors": "0", + "queue/dax": "0", + "queue/discard_granularity": "512", + "queue/discard_max_bytes": "2199023255040", + "queue/discard_max_hw_bytes": "2199023255040", + "queue/discard_zeroes_data": "0", + "queue/dma_alignment": "511", + "queue/fua": "1", + "queue/hw_sector_size": "512", + "queue/io_poll": "0", + "queue/io_poll_delay": "-1", + "queue/iostats": "1", + "queue/logical_block_size": "512", + "queue/max_discard_segments": "256", + "queue/max_hw_sectors_kb": "128", + "queue/max_integrity_segments": "0", + "queue/max_sectors_kb": "128", + "queue/max_segment_size": "4294967295", + "queue/max_segments": "33", + "queue/minimum_io_size": "512", + "queue/nomerges": "0", + "queue/nr_zones": "0", + "queue/optimal_io_size": "0", + "queue/physical_block_size": "512", + "queue/read_ahead_kb": "128", + "queue/rotational": "0", + "queue/stable_writes": "0", + "queue/virt_boundary_mask": "4095", + "queue/write_cache": "write back", + "queue/write_same_max_bytes": "0", + "queue/write_zeroes_max_bytes": "0", + "queue/zone_append_max_bytes": "0", + "queue/zone_write_granularity": "0", + "queue/zoned": "none", + "range": "1", + "removable": "0", + "ro": "0", + "size": "4096803209216", + "slaves/nvme0n1": null, + "slaves/nvme1n1": null, + "stat": " 58064 0 8994020 13076 0 0 0 0 0 7258 13076 0 0 0 0 0 0", + "subsystem": "block", + "trace/act_mask": "disabled", + "trace/enable": "0", + "trace/end_lba": "disabled", + "trace/pid": "disabled", + "trace/start_lba": "disabled", + "uevent": "MAJOR=9\nMINOR=126\nDEVNAME=md126\nDEVTYPE=disk\nDISKSEQ=13" + }, + "partitiontable": { + "label": "gpt", + "id": "21C689C9-6030-4D14-AE66-F280EF4DAAF8", + "device": "/dev/md126", + "unit": "sectors", + "firstlba": 2048, + "lastlba": 8001568734, + "sectorsize": 512, + "partitions": [ + { + "node": "/dev/md126p1", + "start": 2048, + "size": 2201600, + "type": "C12A7328-F81F-11D2-BA4B-00A0C93EC93B", + "uuid": "EA24FB61-DD5A-4609-A3DE-714443148DE4" + }, + { + "node": "/dev/md126p2", + "start": 2203648, + "size": 25165824, + "type": "E3C9E316-0B5C-4DB8-817D-F92DF00215AE", + "uuid": "A32BA6C7-9650-4A1D-BB71-2772395F2737" + }, + { + "node": "/dev/md126p3", + "start": 27369472, + "size": 7974197248, + "type": "0FC63DAF-8483-4772-8E79-3D69D8477DE4", + "uuid": "C93E447D-4FDC-4937-8FE2-09C0B0D04317" + } + ] + } + }, + "/dev/md126p1": { + "CURRENT_TAGS": ":systemd:", + "DEVLINKS": "/dev/disk/by-uuid/C6C4-C1B0 /dev/disk/by-partuuid/ea24fb61-dd5a-4609-a3de-714443148de4 /dev/disk/by-id/md-uuid-2b219152:a527314e:2421b1aa:763fe1c4-part1 /dev/md/Volume1_0p1", + "DEVNAME": "/dev/md126p1", + "DEVPATH": "/devices/virtual/block/md126/md126p1", + "DEVTYPE": "partition", + "DISKSEQ": "13", + "ID_FS_BLOCKSIZE": "4096", + "ID_FS_SIZE": "1127219200", + "ID_FS_TYPE": "vfat", + "ID_FS_USAGE": "filesystem", + "ID_FS_UUID": "C6C4-C1B0", + "ID_FS_UUID_ENC": "C6C4-C1B0", + "ID_FS_VERSION": "FAT32", + "ID_IGNORE_DISKSEQ": "1", + "ID_PART_ENTRY_DISK": "9:126", + "ID_PART_ENTRY_NUMBER": "1", + "ID_PART_ENTRY_OFFSET": "2048", + "ID_PART_ENTRY_SCHEME": "gpt", + "ID_PART_ENTRY_SIZE": "2201600", + "ID_PART_ENTRY_TYPE": "c12a7328-f81f-11d2-ba4b-00a0c93ec93b", + "ID_PART_ENTRY_UUID": "ea24fb61-dd5a-4609-a3de-714443148de4", + "MAJOR": "259", + "MD_CONTAINER": "/dev/md/imsm0", + "MD_DEVICES": "2", + "MD_DEVNAME": "Volume1_0", + "MD_LEVEL": "raid1", + "MD_MEMBER": "0", + "MD_MON_THIS": "../md127", + "MD_UUID": "2b219152:a527314e:2421b1aa:763fe1c4", + "MINOR": "1", + "PARTN": "1", + "SUBSYSTEM": "block", + "SYSTEMD_WANTS": "mdmonitor.service mdmon@md127.service", + "TAGS": ":systemd:", + "UDISKS_IGNORE": "1", + "USEC_INITIALIZED": "1651676", + "attrs": { + "alignment_offset": "0", + "dev": "259:1", + "discard_alignment": "0", + "inflight": " 0 0", + "partition": "1", + "power/async": "disabled", + "power/autosuspend_delay_ms": null, + "power/control": "auto", + "power/runtime_active_kids": "0", + "power/runtime_active_time": "0", + "power/runtime_enabled": "disabled", + "power/runtime_status": "unsupported", + "power/runtime_suspended_time": "0", + "power/runtime_usage": "0", + "ro": "0", + "size": "1127219200", + "start": "2048", + "stat": " 559 0 38595 62 0 0 0 0 0 56 62 0 0 0 0 0 0", + "subsystem": "block", + "trace/act_mask": "disabled", + "trace/enable": "0", + "trace/end_lba": "disabled", + "trace/pid": "disabled", + "trace/start_lba": "disabled", + "uevent": "MAJOR=259\nMINOR=1\nDEVNAME=md126p1\nDEVTYPE=partition\nDISKSEQ=13\nPARTN=1" + }, + "partitiontable": { + "label": "dos", + "id": "0x00000000", + "device": "/dev/md126p1", + "unit": "sectors", + "sectorsize": 512 + } + }, + "/dev/md126p2": { + "CURRENT_TAGS": ":systemd:", + "DEVLINKS": "/dev/disk/by-partuuid/a32ba6c7-9650-4a1d-bb71-2772395f2737 /dev/md/Volume1_0p2 /dev/disk/by-uuid/58DC-9740 /dev/disk/by-id/md-uuid-2b219152:a527314e:2421b1aa:763fe1c4-part2", + "DEVNAME": "/dev/md126p2", + "DEVPATH": "/devices/virtual/block/md126/md126p2", + "DEVTYPE": "partition", + "DISKSEQ": "13", + "ID_FS_BLOCKSIZE": "8192", + "ID_FS_SIZE": "12884901888", + "ID_FS_TYPE": "vfat", + "ID_FS_USAGE": "filesystem", + "ID_FS_UUID": "58DC-9740", + "ID_FS_UUID_ENC": "58DC-9740", + "ID_FS_VERSION": "FAT32", + "ID_IGNORE_DISKSEQ": "1", + "ID_PART_ENTRY_DISK": "9:126", + "ID_PART_ENTRY_NUMBER": "2", + "ID_PART_ENTRY_OFFSET": "2203648", + "ID_PART_ENTRY_SCHEME": "gpt", + "ID_PART_ENTRY_SIZE": "25165824", + "ID_PART_ENTRY_TYPE": "e3c9e316-0b5c-4db8-817d-f92df00215ae", + "ID_PART_ENTRY_UUID": "a32ba6c7-9650-4a1d-bb71-2772395f2737", + "MAJOR": "259", + "MD_CONTAINER": "/dev/md/imsm0", + "MD_DEVICES": "2", + "MD_DEVNAME": "Volume1_0", + "MD_LEVEL": "raid1", + "MD_MEMBER": "0", + "MD_MON_THIS": "../md127", + "MD_UUID": "2b219152:a527314e:2421b1aa:763fe1c4", + "MINOR": "2", + "PARTN": "2", + "SUBSYSTEM": "block", + "SYSTEMD_WANTS": "mdmonitor.service mdmon@md127.service", + "TAGS": ":systemd:", + "UDISKS_IGNORE": "1", + "USEC_INITIALIZED": "1651687", + "attrs": { + "alignment_offset": "0", + "dev": "259:2", + "discard_alignment": "0", + "inflight": " 0 0", + "partition": "2", + "power/async": "disabled", + "power/autosuspend_delay_ms": null, + "power/control": "auto", + "power/runtime_active_kids": "0", + "power/runtime_active_time": "0", + "power/runtime_enabled": "disabled", + "power/runtime_status": "unsupported", + "power/runtime_suspended_time": "0", + "power/runtime_usage": "0", + "ro": "0", + "size": "12884901888", + "start": "2203648", + "stat": " 56642 0 8892993 12846 0 0 0 0 0 7868 12846 0 0 0 0 0 0", + "subsystem": "block", + "trace/act_mask": "disabled", + "trace/enable": "0", + "trace/end_lba": "disabled", + "trace/pid": "disabled", + "trace/start_lba": "disabled", + "uevent": "MAJOR=259\nMINOR=2\nDEVNAME=md126p2\nDEVTYPE=partition\nDISKSEQ=13\nPARTN=2" + }, + "partitiontable": { + "label": "dos", + "id": "0x00000000", + "device": "/dev/md126p2", + "unit": "sectors", + "sectorsize": 512 + } + }, + "/dev/md126p3": { + "CURRENT_TAGS": ":systemd:", + "DEVLINKS": "/dev/disk/by-partuuid/c93e447d-4fdc-4937-8fe2-09c0b0d04317 /dev/disk/by-id/md-uuid-2b219152:a527314e:2421b1aa:763fe1c4-part3 /dev/disk/by-uuid/ecddad07-31c1-4681-bc1a-1e5ec9aeb7c1 /dev/md/Volume1_0p3", + "DEVNAME": "/dev/md126p3", + "DEVPATH": "/devices/virtual/block/md126/md126p3", + "DEVTYPE": "partition", + "DISKSEQ": "13", + "ID_FS_BLOCKSIZE": "4096", + "ID_FS_LASTBLOCK": "996774656", + "ID_FS_SIZE": "4082788990976", + "ID_FS_TYPE": "ext4", + "ID_FS_USAGE": "filesystem", + "ID_FS_UUID": "ecddad07-31c1-4681-bc1a-1e5ec9aeb7c1", + "ID_FS_UUID_ENC": "ecddad07-31c1-4681-bc1a-1e5ec9aeb7c1", + "ID_FS_VERSION": "1.0", + "ID_IGNORE_DISKSEQ": "1", + "ID_PART_ENTRY_DISK": "9:126", + "ID_PART_ENTRY_NUMBER": "3", + "ID_PART_ENTRY_OFFSET": "27369472", + "ID_PART_ENTRY_SCHEME": "gpt", + "ID_PART_ENTRY_SIZE": "7974197248", + "ID_PART_ENTRY_TYPE": "0fc63daf-8483-4772-8e79-3d69d8477de4", + "ID_PART_ENTRY_UUID": "c93e447d-4fdc-4937-8fe2-09c0b0d04317", + "MAJOR": "259", + "MD_CONTAINER": "/dev/md/imsm0", + "MD_DEVICES": "2", + "MD_DEVNAME": "Volume1_0", + "MD_LEVEL": "raid1", + "MD_MEMBER": "0", + "MD_MON_THIS": "../md127", + "MD_UUID": "2b219152:a527314e:2421b1aa:763fe1c4", + "MINOR": "3", + "PARTN": "3", + "SUBSYSTEM": "block", + "SYSTEMD_WANTS": "mdmonitor.service mdmon@md127.service", + "TAGS": ":systemd:", + "UDISKS_IGNORE": "1", + "USEC_INITIALIZED": "1651700", + "attrs": { + "alignment_offset": "0", + "dev": "259:3", + "discard_alignment": "0", + "inflight": " 0 0", + "partition": "3", + "power/async": "disabled", + "power/autosuspend_delay_ms": null, + "power/control": "auto", + "power/runtime_active_kids": "0", + "power/runtime_active_time": "0", + "power/runtime_enabled": "disabled", + "power/runtime_status": "unsupported", + "power/runtime_suspended_time": "0", + "power/runtime_usage": "0", + "ro": "0", + "size": "4082788990976", + "start": "27369472", + "stat": " 567 0 47584 90 0 0 0 0 0 70 90 0 0 0 0 0 0", + "subsystem": "block", + "trace/act_mask": "disabled", + "trace/enable": "0", + "trace/end_lba": "disabled", + "trace/pid": "disabled", + "trace/start_lba": "disabled", + "uevent": "MAJOR=259\nMINOR=3\nDEVNAME=md126p3\nDEVTYPE=partition\nDISKSEQ=13\nPARTN=3" + } + }, + "/dev/md127": { + "CURRENT_TAGS": ":systemd:", + "DEVLINKS": "/dev/disk/by-id/md-uuid-9fe673fb:76093732:2e12989f:d3e828f1 /dev/md/imsm0", + "DEVNAME": "/dev/md127", + "DEVPATH": "/devices/virtual/block/md127", + "DEVTYPE": "disk", + "DISKSEQ": "11", + "ID_IGNORE_DISKSEQ": "1", + "MAJOR": "9", + "MD_DEVICES": "2", + "MD_DEVNAME": "imsm0", + "MD_LEVEL": "container", + "MD_METADATA": "imsm", + "MD_UUID": "9fe673fb:76093732:2e12989f:d3e828f1", + "MINOR": "127", + "SUBSYSTEM": "block", + "SYSTEMD_READY": "0", + "TAGS": ":systemd:", + "UDISKS_IGNORE": "1", + "UDISKS_MD_DEVICES": "2", + "UDISKS_MD_DEVICE_dev_nvme0n1_DEV": "/dev/nvme0n1", + "UDISKS_MD_DEVICE_dev_nvme0n1_ROLE": "spare", + "UDISKS_MD_DEVICE_dev_nvme1n1_DEV": "/dev/nvme1n1", + "UDISKS_MD_DEVICE_dev_nvme1n1_ROLE": "spare", + "UDISKS_MD_DEVNAME": "imsm0", + "UDISKS_MD_LEVEL": "container", + "UDISKS_MD_METADATA": "imsm", + "UDISKS_MD_UUID": "9fe673fb:76093732:2e12989f:d3e828f1", + "USEC_INITIALIZED": "1577302", + "attrs": { + "alignment_offset": "0", + "bdi": null, + "capability": "0", + "dev": "9:127", + "discard_alignment": "0", + "diskseq": "11", + "events": "", + "events_async": "", + "events_poll_msecs": "-1", + "ext_range": "256", + "hidden": "0", + "inflight": " 0 0", + "integrity/device_is_integrity_capable": "0", + "integrity/format": "none", + "integrity/protection_interval_bytes": "0", + "integrity/read_verify": "0", + "integrity/tag_size": "0", + "integrity/write_generate": "0", + "md/array_size": "default", + "md/array_state": "inactive", + "md/bitmap/backlog": "0", + "md/bitmap/can_clear": "", + "md/bitmap/chunksize": "0", + "md/bitmap/location": "none", + "md/bitmap/max_backlog_used": "0", + "md/bitmap/metadata": "internal", + "md/bitmap/space": "0", + "md/bitmap/time_base": "0", + "md/chunk_size": "0", + "md/component_size": "0", + "md/consistency_policy": "unknown", + "md/dev-nvme0n1/bad_blocks": "", + "md/dev-nvme0n1/block": null, + "md/dev-nvme0n1/errors": "0", + "md/dev-nvme0n1/new_offset": "8001568768", + "md/dev-nvme0n1/offset": "8001568768", + "md/dev-nvme0n1/ppl_sector": "0", + "md/dev-nvme0n1/ppl_size": "0", + "md/dev-nvme0n1/recovery_start": "0", + "md/dev-nvme0n1/size": "2392", + "md/dev-nvme0n1/slot": "none", + "md/dev-nvme0n1/state": "spare,external_bbl", + "md/dev-nvme0n1/unacknowledged_bad_blocks": "", + "md/dev-nvme1n1/bad_blocks": "", + "md/dev-nvme1n1/block": null, + "md/dev-nvme1n1/errors": "0", + "md/dev-nvme1n1/new_offset": "8001568768", + "md/dev-nvme1n1/offset": "8001568768", + "md/dev-nvme1n1/ppl_sector": "0", + "md/dev-nvme1n1/ppl_size": "0", + "md/dev-nvme1n1/recovery_start": "0", + "md/dev-nvme1n1/size": "2392", + "md/dev-nvme1n1/slot": "none", + "md/dev-nvme1n1/state": "spare,external_bbl", + "md/dev-nvme1n1/unacknowledged_bad_blocks": "", + "md/fail_last_dev": "0", + "md/layout": "0", + "md/level": "", + "md/max_read_errors": "0", + "md/metadata_version": "external:imsm", + "md/raid_disks": "", + "md/reshape_direction": "forwards", + "md/reshape_position": "none", + "md/resync_start": "0", + "md/safe_mode_delay": "0.000", + "md/serialize_policy": "n/a", + "md/uuid": "00000000-0000-0000-0000-000000000000", + "partscan": "1", + "power/async": "disabled", + "power/autosuspend_delay_ms": null, + "power/control": "auto", + "power/runtime_active_kids": "0", + "power/runtime_active_time": "0", + "power/runtime_enabled": "disabled", + "power/runtime_status": "unsupported", + "power/runtime_suspended_time": "0", + "power/runtime_usage": "0", + "queue/add_random": "0", + "queue/chunk_sectors": "0", + "queue/dax": "0", + "queue/discard_granularity": "512", + "queue/discard_max_bytes": "0", + "queue/discard_max_hw_bytes": "0", + "queue/discard_zeroes_data": "0", + "queue/dma_alignment": "511", + "queue/fua": "1", + "queue/hw_sector_size": "512", + "queue/io_poll": "0", + "queue/io_poll_delay": "-1", + "queue/iostats": "0", + "queue/logical_block_size": "512", + "queue/max_discard_segments": "65535", + "queue/max_hw_sectors_kb": "2147483647", + "queue/max_integrity_segments": "0", + "queue/max_sectors_kb": "2147483647", + "queue/max_segment_size": "4294967295", + "queue/max_segments": "65535", + "queue/minimum_io_size": "512", + "queue/nomerges": "0", + "queue/nr_zones": "0", + "queue/optimal_io_size": "0", + "queue/physical_block_size": "512", + "queue/read_ahead_kb": "128", + "queue/rotational": "1", + "queue/stable_writes": "0", + "queue/virt_boundary_mask": "0", + "queue/write_cache": "write back", + "queue/write_same_max_bytes": "0", + "queue/write_zeroes_max_bytes": "2199023255040", + "queue/zone_append_max_bytes": "2199023255040", + "queue/zone_write_granularity": "0", + "queue/zoned": "none", + "range": "1", + "removable": "0", + "ro": "0", + "size": "0", + "slaves/nvme0n1": null, + "slaves/nvme1n1": null, + "stat": " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "subsystem": "block", + "trace/act_mask": "disabled", + "trace/enable": "0", + "trace/end_lba": "disabled", + "trace/pid": "disabled", + "trace/start_lba": "disabled", + "uevent": "MAJOR=9\nMINOR=127\nDEVNAME=md127\nDEVTYPE=disk\nDISKSEQ=11" + } + } + }, + "zfs": { + "zpools": {} + }, + "filesystem": { + "/dev/md126p1": { + "BLOCKSIZE": "4096", + "SIZE": "1127219200", + "TYPE": "vfat", + "USAGE": "filesystem", + "UUID": "C6C4-C1B0", + "UUID_ENC": "C6C4-C1B0", + "VERSION": "FAT32", + "ESTIMATED_MIN_SIZE": -1 + }, + "/dev/md126p2": { + "BLOCKSIZE": "8192", + "SIZE": "12884901888", + "TYPE": "vfat", + "USAGE": "filesystem", + "UUID": "58DC-9740", + "UUID_ENC": "58DC-9740", + "VERSION": "FAT32", + "ESTIMATED_MIN_SIZE": -1 + }, + "/dev/md126p3": { + "BLOCKSIZE": "4096", + "LASTBLOCK": "996774656", + "SIZE": 4082788990976, + "TYPE": "ext4", + "USAGE": "filesystem", + "UUID": "ecddad07-31c1-4681-bc1a-1e5ec9aeb7c1", + "UUID_ENC": "ecddad07-31c1-4681-bc1a-1e5ec9aeb7c1", + "VERSION": "1.0", + "ESTIMATED_MIN_SIZE": 22938783744 + } + }, + "os": { + "/dev/md126p3": { + "long": "Ubuntu 24.04.1 LTS", + "label": "Ubuntu", + "type": "linux", + "version": "24.04.1" + } + } +} \ No newline at end of file diff --git a/tests/unittests/test_storage_config.py b/tests/unittests/test_storage_config.py index 7b0f68c..d1f3022 100644 --- a/tests/unittests/test_storage_config.py +++ b/tests/unittests/test_storage_config.py @@ -1,6 +1,8 @@ # This file is part of curtin. See LICENSE file for copyright and license info. import copy import json +from unittest import mock + from .helpers import CiTestCase, skipUnlessJsonSchema from curtin import storage_config from curtin.storage_config import ProbertParser as baseparser @@ -143,6 +145,38 @@ class TestProbertParser(CiTestCase): self.assertIsNotNone(bdparser(probe_data)) + def test_detect_partition_scheme__unpartitioned(self): + blockdev = { + "DEVNAME": "/dev/sda", + "DEVTYPE": "disk", + } + self.assertIsNone(baseparser.detect_partition_scheme(blockdev)) + + def test_detect_partition_scheme__gpt(self): + blockdev = { + "DEVNAME": "/dev/sda", + "DEVTYPE": "disk", + "ID_PART_TABLE_TYPE": "gpt", + } + self.assertEqual("gpt", baseparser.detect_partition_scheme(blockdev)) + + def test_detect_partition_scheme__dos(self): + blockdev = { + "DEVNAME": "/dev/sda", + "DEVTYPE": "disk", + "ID_PART_TABLE_TYPE": "dos", + } + self.assertEqual("dos", baseparser.detect_partition_scheme(blockdev)) + + def test_detect_partition_scheme__something_else(self): + blockdev = { + "DEVNAME": "/dev/sda", + "DEVTYPE": "disk", + "ID_PART_TABLE_TYPE": "foobar", + } + self.assertEqual( + "unsupported", baseparser.detect_partition_scheme(blockdev)) + def _get_data(datafile): data = util.load_file('tests/data/%s' % datafile) @@ -560,6 +594,7 @@ class TestBlockdevParser(CiTestCase): 'size': 10734272512, 'type': 'partition', 'partition_type': '0fc63daf-8483-4772-8e79-3d69d8477de4', + 'uuid': '760493ac-7945-44c5-a6bd-58fcd6632ea7', } self.assertDictEqual(expected_dict, self.bdevp.asdict(blockdev)) @@ -611,6 +646,27 @@ class TestBlockdevParser(CiTestCase): actual = self.bdevp.asdict(blockdev) self.assertEqual(5000 << 20, actual['size']) + def test_blockdev_partition_from_imsm(self): + """ + partition uuid should exist in absence of ID_PART_TABLE_TYPE in + partition + """ + self.probe_data = _get_data('probert_storage_imsm_with_parts.json') + self.bdevp = BlockdevParser(self.probe_data) + blockdev = self.bdevp.blockdev_data['/dev/md126p2'] + expected_dict = { + 'device': 'raid-md126', + 'flag': 'msftres', + 'id': 'raid-md126p2', + 'number': 2, + 'offset': 1128267776, + 'partition_type': 'e3c9e316-0b5c-4db8-817d-f92df00215ae', + 'path': '/dev/md126p2', + 'size': 12884901888, + 'type': 'partition', + 'uuid': 'a32ba6c7-9650-4a1d-bb71-2772395f2737'} + self.assertDictEqual(expected_dict, self.bdevp.asdict(blockdev)) + class TestFilesystemParser(CiTestCase): @@ -1050,6 +1106,7 @@ class TestExtractStorageConfig(CiTestCase): self.assertEqual({'id': 'raid-md1', 'type': 'raid', 'metadata': '1.2', 'raidlevel': 'raid1', 'name': 'md1', 'path': '/dev/md1', + 'ptable': 'gpt', 'devices': ['partition-vdb1', 'partition-vdc1'], 'spare_devices': []}, raids[0]) self.assertEqual({ @@ -1061,7 +1118,8 @@ class TestExtractStorageConfig(CiTestCase): 'number': 1, 'partition_type': '0fc63daf-8483-4772-8e79-3d69d8477de4', 'device': 'raid-md1', - 'offset': 1048576}, + 'offset': 1048576, + 'uuid': '5b3f90c0-2432-45c1-98e2-6e9e6649430e'}, raid_partitions[0]) @skipUnlessJsonSchema()
-- Mailing list: https://launchpad.net/~curtin-dev Post to : curtin-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~curtin-dev More help : https://help.launchpad.net/ListHelp