A few interesting cases:
1. autriche (my desktop)
$ sudo udevadm info /dev/nvme0n1 | grep ID_
E: ID_PART_TABLE_TYPE=gpt
E: ID_PART_TABLE_UUID=
c83d5616-676b-4667-bcf3-
c82fd4fc7e64
E: ID_SERIAL=Samsung SSD 960 EVO 250GB_S3ESNX0J958081E
E: ID_SERIAL_SHORT=S3ESNX0J958081E
- no ID_MODEL or ID_VENDOR
-> use ID_SERIAL
2. my dev box
gnit:~ (master) 09:09 AM $ udevadm info /dev/nvme0n1 | grep ID_
E: ID_FS_TYPE=xfs
E: ID_FS_USAGE=filesystem
E: ID_FS_UUID=
860d4503-9c9d-4c24-af09-
4266b7717a5c
E: ID_FS_UUID_ENC=
860d4503-9c9d-4c24-af09-
4266b7717a5c
E: ID_MODEL=INTEL SSDPEDMD400G4
E: ID_PATH=pci-0000:82:00.0-nvme-1
E: ID_PATH_TAG=pci-0000_82_00_0-nvme-1
E: ID_SERIAL=INTEL SSDPEDMD400G4_CVFT520200G7400BGN
E: ID_SERIAL_SHORT=CVFT520200G7400BGN
E: ID_WWN=nvme.8086-
43564654353230323030473734303042474e-
494e54454c205353445045444d443430304734-
00000001
- no ID_VENDOR
-> ID_MODEL + ID_SERIAL_SHORT
gnit:~ (master) 09:12 AM $ udevadm info /dev/sda | grep ID_
E: ID_ATA=1
E: ID_ATA_DOWNLOAD_MICROCODE=1
E: ID_ATA_FEATURE_SET_HPA=1
E: ID_ATA_FEATURE_SET_HPA_ENABLED=1
E: ID_ATA_FEATURE_SET_PM=1
E: ID_ATA_FEATURE_SET_PM_ENABLED=1
E: ID_ATA_FEATURE_SET_SECURITY=1
E: ID_ATA_FEATURE_SET_SECURITY_ENABLED=0
E: ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN=2
E: ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN=2
E: ID_ATA_FEATURE_SET_SECURITY_FROZEN=1
E: ID_ATA_FEATURE_SET_SMART=1
E: ID_ATA_FEATURE_SET_SMART_ENABLED=1
E: ID_ATA_ROTATION_RATE_RPM=0
E: ID_ATA_SATA=1
E: ID_ATA_SATA_SIGNAL_RATE_GEN1=1
E: ID_ATA_SATA_SIGNAL_RATE_GEN2=1
E: ID_ATA_WRITE_CACHE=1
E: ID_ATA_WRITE_CACHE_ENABLED=1
E: ID_BUS=ata
E: ID_MODEL=INTEL_SSDSC2BB240G4
E: ID_MODEL_ENC=INTEL\x20SSDSC2BB240G4\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
E: ID_PART_TABLE_TYPE=dos
E: ID_PART_TABLE_UUID=
bb35118c
E: ID_PATH=pci-0000:00:1f.2-ata-1
E: ID_PATH_TAG=pci-0000_00_1f_2-ata-1
E: ID_REVISION=
D2010355
E: ID_SERIAL=INTEL_SSDSC2BB240G4_BTWL3414034J240NGN
E: ID_SERIAL_SHORT=BTWL3414034J240NGN
E: ID_TYPE=disk
E: ID_WWN=0x55cd2e404b4e47d8
E: ID_WWN_WITH_EXTENSION=0x55cd2e404b4e47d8
- no ID_VENDOR
-> ID_MODEL + ID_SERIAL_SHORT
3. mira lab machine (old areca controller in JBOD mode, I think)
root@mira055:~# udevadm info /dev/sdb | grep ID_
E: ID_BUS=scsi
E: ID_MODEL=HUS724040ALA640
E: ID_MODEL_ENC=HUS724040ALA640\x20
E: ID_PART_TABLE_TYPE=gpt
E: ID_PART_TABLE_UUID=
957b2db6-de5c-46cb-a672-
243fa12d55b2
E: ID_PATH=pci-0000:01:00.0-scsi-0:0:0:1
E: ID_PATH_TAG=pci-0000_01_00_0-scsi-0_0_0_1
E: ID_REVISION=R001
E: ID_SCSI=1
E: ID_SCSI_SERIAL=PN1334PBH5JMJS
E: ID_SERIAL=
2001b4d2058da3a00
E: ID_SERIAL_SHORT=
001b4d2058da3a00
E: ID_TYPE=disk
E: ID_VENDOR=HGST
E: ID_VENDOR_ENC=HGST\x20\x20\x20\x20
- ID_VENDOR and ID_MODEL
- ID_MODEL doesn't include vendor name + _
- ID_SERIAL and _SHORT are junk
- ID_SCSI_SERIAL has the serial number! wth
-> ID_VENDOR + ID_MODEL + ID_SCSI_SHORT
Added a bunch of udevadm output samples.
So,
- if ID_VENDOR + ID_MODEL + ID_SCSI_SERIAL are present, use them.
- if ID_MODEL + ID_SERIAL_SHORT are present, use them
- if ID_SERIAL is present, use it.
- fail
Signed-off-by: Sage Weil <sage@redhat.com>
struct udev_device *dev;
static struct udev *udev;
const char *data;
- std::string device_model;
- std::string device_id;
udev = udev_new();
if (!udev) {
return {};
}
+ // ****
+ // NOTE: please keep this implementation in sync with _get_device_id() in
+ // src/ceph-volume/ceph_volume/util/device.py
+ // ****
+
+ std::string id_vendor, id_model, id_serial, id_serial_short, id_scsi_serial;
+ data = udev_device_get_property_value(dev, "ID_VENDOR");
+ if (data) {
+ id_vendor = data;
+ }
data = udev_device_get_property_value(dev, "ID_MODEL");
if (data) {
- device_model = data;
+ id_model = data;
}
-
- // "ID_SERIAL_SHORT" returns only the serial number;
- // "ID_SERIAL" returns vendor model_serial but can be unreliable and return.
data = udev_device_get_property_value(dev, "ID_SERIAL_SHORT");
if (data) {
- device_id = data;
+ id_serial_short = data;
+ }
+ data = udev_device_get_property_value(dev, "ID_SCSI_SERIAL");
+ if (data) {
+ id_scsi_serial = data;
+ }
+ data = udev_device_get_property_value(dev, "ID_SERIAL");
+ if (data) {
+ id_serial = data;
}
-
udev_device_unref(dev);
udev_unref(udev);
- if (!device_id.empty() and !device_model.empty()) {
- std::replace(device_model.begin(), device_model.end(), ' ', '_');
+ // ID_SERIAL is usually $vendor_$model_$serial, but not always
+ // ID_SERIAL_SHORT is mostly always just the serial
+ // ID_MODEL is sometimes $vendor_$model, but
+ // ID_VENDOR is sometimes $vendor and ID_MODEL just $model and ID_SCSI_SERIAL the real serial number, with ID_SERIAL and ID_SERIAL_SHORT gibberish (ick)
+ std::string device_id;
+ if (id_vendor.size() && id_model.size() && id_scsi_serial.size()) {
+ device_id = id_vendor + '_' + id_model + '_' + id_scsi_serial;
+ } else if (id_model.size() && id_serial_short.size()) {
+ device_id = id_model + '_' + id_serial_short;
+ } else if (id_serial.size()) {
+ device_id = id_serial;
+ }
+ if (device_id.size()) {
std::replace(device_id.begin(), device_id.end(), ' ', '_');
- return device_model + '_' + device_id;
+ return device_id;
}
// either udev_device_get_property_value() failed, or succeeded but
--- /dev/null
+P: /devices/pci0000:00/0000:00:1d.0/0000:04:00.0/nvme/nvme0/nvme0n1
+N: nvme0n1
+S: disk/by-id/nvme-Samsung_SSD_960_EVO_250GB_S3ESNX0J958081E
+S: disk/by-id/nvme-eui.0025385971b11793
+E: DEVLINKS=/dev/disk/by-id/nvme-Samsung_SSD_960_EVO_250GB_S3ESNX0J958081E /dev/disk/by-id/nvme-eui.0025385971b11793
+E: DEVNAME=/dev/nvme0n1
+E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/0000:04:00.0/nvme/nvme0/nvme0n1
+E: DEVTYPE=disk
+E: ID_PART_TABLE_TYPE=gpt
+E: ID_PART_TABLE_UUID=c83d5616-676b-4667-bcf3-c82fd4fc7e64
+E: ID_SERIAL=Samsung SSD 960 EVO 250GB_S3ESNX0J958081E
+E: ID_SERIAL_SHORT=S3ESNX0J958081E
+E: MAJOR=259
+E: MINOR=0
+E: SUBSYSTEM=block
+E: TAGS=:systemd:
+E: USEC_INITIALIZED=1875432
--- /dev/null
+Samsung_SSD_960_EVO_250GB_S3ESNX0J958081E
--- /dev/null
+P: /devices/pci0000:80/0000:80:03.0/0000:82:00.0/nvme/nvme0/nvme0n1
+N: nvme0n1
+S: disk/by-id/nvme-INTEL_SSDPEDMD400G4_CVFT520200G7400BGN
+S: disk/by-id/nvme-nvme.8086-43564654353230323030473734303042474e-494e54454c205353445045444d443430304734-00000001
+S: disk/by-path/pci-0000:82:00.0-nvme-1
+S: disk/by-uuid/860d4503-9c9d-4c24-af09-4266b7717a5c
+E: DEVLINKS=/dev/disk/by-id/nvme-nvme.8086-43564654353230323030473734303042474e-494e54454c205353445045444d443430304734-00000001 /dev/disk/by-uuid/860d4503-9c9d-4c24-af09-4266b7717a5c /dev/disk/by-path/pci-0000:82:00.0-nvme-1 /dev/disk/by-id/nvme-INTEL_SSDPEDMD400G4_CVFT520200G7400BGN
+E: DEVNAME=/dev/nvme0n1
+E: DEVPATH=/devices/pci0000:80/0000:80:03.0/0000:82:00.0/nvme/nvme0/nvme0n1
+E: DEVTYPE=disk
+E: ID_FS_TYPE=xfs
+E: ID_FS_USAGE=filesystem
+E: ID_FS_UUID=860d4503-9c9d-4c24-af09-4266b7717a5c
+E: ID_FS_UUID_ENC=860d4503-9c9d-4c24-af09-4266b7717a5c
+E: ID_MODEL=INTEL SSDPEDMD400G4
+E: ID_PATH=pci-0000:82:00.0-nvme-1
+E: ID_PATH_TAG=pci-0000_82_00_0-nvme-1
+E: ID_SERIAL=INTEL SSDPEDMD400G4_CVFT520200G7400BGN
+E: ID_SERIAL_SHORT=CVFT520200G7400BGN
+E: ID_WWN=nvme.8086-43564654353230323030473734303042474e-494e54454c205353445045444d443430304734-00000001
+E: MAJOR=259
+E: MINOR=0
+E: SUBSYSTEM=block
+E: TAGS=:systemd:
+E: USEC_INITIALIZED=5097198
--- /dev/null
+INTEL_SSDPEDMD400G4_CVFT520200G7400BGN
--- /dev/null
+P: /devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda
+N: sda
+S: disk/by-id/ata-INTEL_SSDSC2BB240G4_BTWL3414034J240NGN
+S: disk/by-id/wwn-0x55cd2e404b4e47d8
+S: disk/by-path/pci-0000:00:1f.2-ata-1
+E: DEVLINKS=/dev/disk/by-id/wwn-0x55cd2e404b4e47d8 /dev/disk/by-path/pci-0000:00:1f.2-ata-1 /dev/disk/by-id/ata-INTEL_SSDSC2BB240G4_BTWL3414034J240NGN
+E: DEVNAME=/dev/sda
+E: DEVPATH=/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda
+E: DEVTYPE=disk
+E: ID_ATA=1
+E: ID_ATA_DOWNLOAD_MICROCODE=1
+E: ID_ATA_FEATURE_SET_HPA=1
+E: ID_ATA_FEATURE_SET_HPA_ENABLED=1
+E: ID_ATA_FEATURE_SET_PM=1
+E: ID_ATA_FEATURE_SET_PM_ENABLED=1
+E: ID_ATA_FEATURE_SET_SECURITY=1
+E: ID_ATA_FEATURE_SET_SECURITY_ENABLED=0
+E: ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN=2
+E: ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN=2
+E: ID_ATA_FEATURE_SET_SECURITY_FROZEN=1
+E: ID_ATA_FEATURE_SET_SMART=1
+E: ID_ATA_FEATURE_SET_SMART_ENABLED=1
+E: ID_ATA_ROTATION_RATE_RPM=0
+E: ID_ATA_SATA=1
+E: ID_ATA_SATA_SIGNAL_RATE_GEN1=1
+E: ID_ATA_SATA_SIGNAL_RATE_GEN2=1
+E: ID_ATA_WRITE_CACHE=1
+E: ID_ATA_WRITE_CACHE_ENABLED=1
+E: ID_BUS=ata
+E: ID_MODEL=INTEL_SSDSC2BB240G4
+E: ID_MODEL_ENC=INTEL\x20SSDSC2BB240G4\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
+E: ID_PART_TABLE_TYPE=dos
+E: ID_PART_TABLE_UUID=bb35118c
+E: ID_PATH=pci-0000:00:1f.2-ata-1
+E: ID_PATH_TAG=pci-0000_00_1f_2-ata-1
+E: ID_REVISION=D2010355
+E: ID_SERIAL=INTEL_SSDSC2BB240G4_BTWL3414034J240NGN
+E: ID_SERIAL_SHORT=BTWL3414034J240NGN
+E: ID_TYPE=disk
+E: ID_WWN=0x55cd2e404b4e47d8
+E: ID_WWN_WITH_EXTENSION=0x55cd2e404b4e47d8
+E: MAJOR=8
+E: MINOR=0
+E: SUBSYSTEM=block
+E: TAGS=:systemd:
+E: USEC_INITIALIZED=5064443
--- /dev/null
+INTEL_SSDSC2BB240G4_BTWL3414034J240NGN
--- /dev/null
+P: /devices/pci0000:00/0000:00:03.0/0000:01:00.0/host0/target0:0:0/0:0:0:0/block/sda
+N: sda
+S: disk/by-id/scsi-2001b4d2050244200
+S: disk/by-path/pci-0000:01:00.0-scsi-0:0:0:0
+E: DEVLINKS=/dev/disk/by-id/scsi-2001b4d2050244200 /dev/disk/by-path/pci-0000:01:00.0-scsi-0:0:0:0
+E: DEVNAME=/dev/sda
+E: DEVPATH=/devices/pci0000:00/0000:00:03.0/0000:01:00.0/host0/target0:0:0/0:0:0:0/block/sda
+E: DEVTYPE=disk
+E: ID_BUS=scsi
+E: ID_MODEL=HUA722010CLA330
+E: ID_MODEL_ENC=HUA722010CLA330\x20
+E: ID_PART_TABLE_TYPE=dos
+E: ID_PART_TABLE_UUID=0005eff9
+E: ID_PATH=pci-0000:01:00.0-scsi-0:0:0:0
+E: ID_PATH_TAG=pci-0000_01_00_0-scsi-0_0_0_0
+E: ID_REVISION=R001
+E: ID_SCSI=1
+E: ID_SCSI_SERIAL=JPW9P0N10U422D
+E: ID_SERIAL=2001b4d2050244200
+E: ID_SERIAL_SHORT=001b4d2050244200
+E: ID_TYPE=disk
+E: ID_VENDOR=Hitachi
+E: ID_VENDOR_ENC=Hitachi\x20
+E: MAJOR=8
+E: MINOR=0
+E: SUBSYSTEM=block
+E: TAGS=:systemd:
+E: USEC_INITIALIZED=1207668
--- /dev/null
+Hitachi_HUA722010CLA330_JPW9P0N10U422D
--- /dev/null
+P: /devices/pci0000:00/0000:00:03.0/0000:01:00.0/host0/target0:0:0/0:0:0:1/block/sdb
+N: sdb
+S: disk/by-id/scsi-2001b4d2058da3a00
+S: disk/by-path/pci-0000:01:00.0-scsi-0:0:0:1
+E: DEVLINKS=/dev/disk/by-id/scsi-2001b4d2058da3a00 /dev/disk/by-path/pci-0000:01:00.0-scsi-0:0:0:1
+E: DEVNAME=/dev/sdb
+E: DEVPATH=/devices/pci0000:00/0000:00:03.0/0000:01:00.0/host0/target0:0:0/0:0:0:1/block/sdb
+E: DEVTYPE=disk
+E: ID_BUS=scsi
+E: ID_MODEL=HUS724040ALA640
+E: ID_MODEL_ENC=HUS724040ALA640\x20
+E: ID_PART_TABLE_TYPE=gpt
+E: ID_PART_TABLE_UUID=957b2db6-de5c-46cb-a672-243fa12d55b2
+E: ID_PATH=pci-0000:01:00.0-scsi-0:0:0:1
+E: ID_PATH_TAG=pci-0000_01_00_0-scsi-0_0_0_1
+E: ID_REVISION=R001
+E: ID_SCSI=1
+E: ID_SCSI_SERIAL=PN1334PBH5JMJS
+E: ID_SERIAL=2001b4d2058da3a00
+E: ID_SERIAL_SHORT=001b4d2058da3a00
+E: ID_TYPE=disk
+E: ID_VENDOR=HGST
+E: ID_VENDOR_ENC=HGST\x20\x20\x20\x20
+E: MAJOR=8
+E: MINOR=16
+E: SUBSYSTEM=block
+E: TAGS=:systemd:
+E: USEC_INITIALIZED=1256327
--- /dev/null
+HGST_HUS724040ALA640_PN1334PBH5JMJS
--- /dev/null
+P: /devices/pci0000:00/0000:00:03.0/0000:01:00.0/host0/target0:0:0/0:0:0:4/block/sde
+N: sde
+S: disk/by-id/scsi-2001b4d20a20c660b
+S: disk/by-path/pci-0000:01:00.0-scsi-0:0:0:4
+E: DEVLINKS=/dev/disk/by-path/pci-0000:01:00.0-scsi-0:0:0:4 /dev/disk/by-id/scsi-2001b4d20a20c660b
+E: DEVNAME=/dev/sde
+E: DEVPATH=/devices/pci0000:00/0000:00:03.0/0000:01:00.0/host0/target0:0:0/0:0:0:4/block/sde
+E: DEVTYPE=disk
+E: ID_BUS=scsi
+E: ID_MODEL=WD40EFRX-68N32N0
+E: ID_MODEL_ENC=WD40EFRX-68N32N0
+E: ID_PART_TABLE_TYPE=gpt
+E: ID_PART_TABLE_UUID=444372c2-981b-402a-9af1-2eb734d99ebe
+E: ID_PATH=pci-0000:01:00.0-scsi-0:0:0:4
+E: ID_PATH_TAG=pci-0000_01_00_0-scsi-0_0_0_4
+E: ID_REVISION=R001
+E: ID_SCSI=1
+E: ID_SCSI_SERIAL=WD-WCC7K2ZL0V6K
+E: ID_SERIAL=2001b4d20a20c660b
+E: ID_SERIAL_SHORT=001b4d20a20c660b
+E: ID_TYPE=disk
+E: ID_VENDOR=WDC
+E: ID_VENDOR_ENC=WDC\x20\x20\x20\x20\x20
+E: MAJOR=8
+E: MINOR=64
+E: SUBSYSTEM=block
+E: TAGS=:systemd:
+E: USEC_INITIALIZED=1123351
--- /dev/null
+WDC_WD40EFRX-68N32N0_WD-WCC7K2ZL0V6K