Unique device ID for virtual hard disks?

gurubert

Distinguished Member
Mar 12, 2015
1,179
335
153
Berlin, Germany
www.heinlein-consulting.de
Hi,
currently virtual hard disk show up like this under /dev/disk/by-id:

lrwxrwxrwx 1 root root 9 Sep 2 13:47 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0 -> ../../sda
lrwxrwxrwx 1 root root 10 Sep 2 13:47 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Sep 2 13:47 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Sep 2 13:47 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 Sep 2 13:47 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part4 -> ../../sda4
lrwxrwxrwx 1 root root 9 Sep 2 16:56 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 -> ../../sdb
lrwxrwxrwx 1 root root 9 Sep 2 16:56 scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 -> ../../sdc
lrwxrwxrwx 1 root root 9 Sep 2 17:28 scsi-0QEMU_QEMU_HARDDISK_drive-scsi3 -> ../../sdd
lrwxrwxrwx 1 root root 9 Sep 2 17:28 scsi-0QEMU_QEMU_HARDDISK_drive-scsi4 -> ../../sde
lrwxrwxrwx 1 root root 9 Sep 2 17:28 scsi-0QEMU_QEMU_HARDDISK_drive-scsi5 -> ../../sdf

They have a unique ID inside the VM.

But when looking at multiple VMs the IDs are not unique any more. A management system that spans more than one VM gets confused with multiple HDDs having the same ID.

Is it possible to replace QEMU_HARDDISK with a unique id (possibly a UUID)? Is that even something Proxmox can do?

Physical disks in physical machines do not have this issue.
 
Is it possible to replace QEMU_HARDDISK with a unique id (possibly a UUID)? Is that even something Proxmox can do?
What you can do is add both a 'serial' and/or 'wwn' parmeter to the drive specification - e.g.:
Code:
scsi0: local:vm-100-disk-0,size=8G,serial=myserialnumber11444,wwn=0x5566777788888888

in a debian VM this results in a few links being created in /dev/disk/by-id:
Code:
/dev/disk/by-id/scsi-35566777788888888
/dev/disk/by-id/wwn-5566777788888888
out of the box - the links with the serial number don't get created - but this is something that possibly can be achieved by appropriate udev-rules inside the guest

I hope this helps!

Out of curiosity - why would you need unique identifiers for virtualized disks?
 
Would be nice if that parameter could be set via GUI and API.
The use-case is something that is requested rather seldomly (my guess about once per year) - and given that the Disk-Edit GUI window is already quite heavy in terms of possible configurable options we would rather leave the more specific use cases to command-line only instead of putting even more widgets on that window
 
GCP has this functionality. I found this thread trying to find a way to do the same thing in proxmox.
The use-case is something that is requested rather seldomly (my guess about once per year)
2022 is almost over, so here's the obligatory annual request for this feature...
Out of curiosity - why would you need unique identifiers for virtualized disks?
For example, if you want your VMs to automatically mount a disk in, say, /var/log and another in /var/lib/elasticsearch, you could set "serial=logs" and "serial=es" on those disk, and add /dev/disk/by-id/scsi-logs and /dev/disk/by-id/scsi-es to fstab. This is much better than the alternative of remembering the order of disks attached tot he VM, and referring to them as sda/b/c.
You could even have a startup script baked into VM templates to auto-format the disks on first boot.
Modifying the conf files works, but being able to do this from the UI or through the API would make more powerful templating possible.
 
  • Like
Reactions: gurubert
@gurubert, @Stoiko Ivanov, @illustris, @Dzung: I posted my UDEV Rule Solution at https://forum.proxmox.com/threads/set-fixed-uuid-for-all-disks-in-a-vm.151701/#post-776728.

That of course requires that you set the serial (and Potentially the wwn as well) from the CLI though, e.g.:
Code:
qm set <vmid> --scsiX local-zfs:vm-<vmid>-disk-<diskid>,serial=<max-20-characters>,wwn=<16-hex-digits>

Where you can generate the 2 Parameters with:
Code:
# Generate random Serial Number
serial_number=$(uuidgen | sed -E "s|-||g" | cut -c 1-20)

And:
Code:
# Generate random WWN Number
wwn_number=$(uuidgen --hex | sed -E "s|-||g" | cut -c 1-16)