mirror of
https://github.com/systemd/systemd.git
synced 2024-12-26 03:22:00 +03:00
3af66c089b
When the same disk image is written to multiple storage units, for example an external SD card and an internal eMMC, the symlinks in /dev/disk/by-{label,uuid,partlabel,partuuid}/ are no longer unique, and will point to the device that is probed last. Adressing partitions via labels and UUIDs is nice to work with, and depending on the use case, it might also be more robust than using the symlinks in /dev/disk/by-path/ containing the partition number. Combine the two approaches to create unique symlinks containing both the device path as well as the respective UUIDs or labels, and throw in a symlink using the devpath and the partition number for the sake of completeness. For an exemplary GPT-partitioned disk at "platform-2198000.mmc" with a partition containing an ext4 file system, this might create symlinks of the following form: /dev/disk/by-path/platform-2198000.mmc-part/by-partnum/1 /dev/disk/by-path/platform-2198000.mmc-part/by-partuuid/e5a75233-3b90-4aec-8075-b4dd7132b48d /dev/disk/by-path/platform-2198000.mmc-part/by-partlabel/rootfs /dev/disk/by-path/platform-2198000.mmc-part/by-uuid/b2c92f24-8215-4680-b931-f423aae5f1c9 /dev/disk/by-path/platform-2198000.mmc-part/by-label/rootfs Signed-off-by: Roland Hieber <rhi@pengutronix.de>
176 lines
10 KiB
Plaintext
176 lines
10 KiB
Plaintext
# do not edit this file, it will be overwritten on update
|
|
|
|
# persistent storage links: /dev/disk/{by-id,by-uuid,by-label,by-path}
|
|
# scheme based on "Linux persistent device names", 2004, Hannes Reinecke <hare@suse.de>
|
|
|
|
ACTION=="remove", GOTO="persistent_storage_end"
|
|
ENV{UDEV_DISABLE_PERSISTENT_STORAGE_RULES_FLAG}=="1", GOTO="persistent_storage_end"
|
|
|
|
SUBSYSTEM!="block|ubi", GOTO="persistent_storage_end"
|
|
KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*|xvd*|bcache*|cciss*|dasd*|ubd*|ubi*|scm*|pmem*|nbd*|zd*", GOTO="persistent_storage_end"
|
|
|
|
# ignore partitions that span the entire disk
|
|
TEST=="whole_disk", GOTO="persistent_storage_end"
|
|
|
|
# For partitions import parent disk ID_* information, except ID_FS_*.
|
|
#
|
|
# This is particularly important on media where a filesystem superblock and
|
|
# partition table are found on the same level, e.g. common Linux distro ISO
|
|
# installation media.
|
|
#
|
|
# In the case where a partition device points to the same filesystem that
|
|
# was detected on the parent disk, the ID_FS_* information is already
|
|
# present on the partition devices as well as the parent, so no need to
|
|
# propagate it. In the case where the partition device points to a different
|
|
# filesystem, merging the parent ID_FS_ properties would lead to
|
|
# inconsistencies, so we avoid doing so.
|
|
ENV{DEVTYPE}=="partition", \
|
|
IMPORT{parent}="ID_[!F]*", IMPORT{parent}="ID_", \
|
|
IMPORT{parent}="ID_F[!S]*", IMPORT{parent}="ID_F", \
|
|
IMPORT{parent}="ID_FS[!_]*", IMPORT{parent}="ID_FS"
|
|
|
|
ENV{DEVTYPE}=="partition", ENV{.PART_SUFFIX}="-part%n"
|
|
ENV{DEVTYPE}!="partition", ENV{.PART_SUFFIX}=""
|
|
|
|
# NVMe
|
|
KERNEL!="nvme*[0-9]n*[0-9]|nvme*[0-9]n*[0-9]p*[0-9]", GOTO="nvme_end"
|
|
|
|
ATTRS{serial}=="?*", ENV{ID_SERIAL_SHORT}="$attr{serial}"
|
|
ATTRS{wwid}=="?*", ENV{ID_WWN}="$attr{wwid}"
|
|
ATTRS{model}=="?*", ENV{ID_MODEL}="$attr{model}"
|
|
ATTRS{firmware_rev}=="?*", ENV{ID_REVISION}="$attr{firmware_rev}"
|
|
ATTRS{nsid}=="?*", ENV{ID_NSID}="$attr{nsid}"
|
|
|
|
ENV{ID_WWN}=="?*", SYMLINK+="disk/by-id/nvme-$env{ID_WWN}$env{.PART_SUFFIX}"
|
|
|
|
# obsolete symlink with non-escaped characters, kept for backward compatibility
|
|
ENV{ID_MODEL}=="?*", ENV{ID_SERIAL_SHORT}=="?*", ENV{ID_MODEL}!="*/*", ENV{ID_SERIAL_SHORT}!="*/*", \
|
|
ENV{ID_SERIAL}="$env{ID_MODEL}_$env{ID_SERIAL_SHORT}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}$env{.PART_SUFFIX}"
|
|
# obsolete symlink that might get overridden on adding a new nvme controller, kept for backward compatibility
|
|
ENV{ID_MODEL}=="?*", ENV{ID_SERIAL_SHORT}=="?*", OPTIONS="string_escape=replace", \
|
|
ENV{ID_SERIAL}="$env{ID_MODEL}_$env{ID_SERIAL_SHORT}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}$env{.PART_SUFFIX}"
|
|
ENV{ID_MODEL}=="?*", ENV{ID_SERIAL_SHORT}=="?*", ENV{ID_NSID}=="?*", OPTIONS="string_escape=replace", \
|
|
ENV{ID_SERIAL}="$env{ID_MODEL}_$env{ID_SERIAL_SHORT}_$env{ID_NSID}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}$env{.PART_SUFFIX}"
|
|
|
|
LABEL="nvme_end"
|
|
|
|
# virtio-blk
|
|
KERNEL=="vd*", ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/virtio-$env{ID_SERIAL}$env{.PART_SUFFIX}"
|
|
|
|
# ATA
|
|
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", IMPORT{program}="ata_id --export $devnode"
|
|
|
|
# ATAPI devices (SPC-3 or later)
|
|
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", ATTRS{type}=="5", ATTRS{scsi_level}=="[6-9]*", IMPORT{program}="ata_id --export $devnode"
|
|
|
|
# Run ata_id on non-removable USB Mass Storage (SATA/PATA disks in enclosures)
|
|
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", ATTR{removable}=="0", SUBSYSTEMS=="usb", IMPORT{program}="ata_id --export $devnode"
|
|
|
|
# Also import properties from usb_id for USB devices
|
|
KERNEL=="sd*[!0-9]|sr*", SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
|
|
|
|
# SCSI devices
|
|
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", IMPORT{program}="scsi_id --export --allowlisted -d $devnode", ENV{ID_BUS}="scsi"
|
|
KERNEL=="cciss*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}!="?*", IMPORT{program}="scsi_id --export --allowlisted -d $devnode", ENV{ID_BUS}="cciss"
|
|
|
|
KERNEL=="sd*|sr*|cciss*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}$env{.PART_SUFFIX}"
|
|
# Previously, ata_id in the above might not be able to retrieve attributes correctly,
|
|
# and properties from usb_id were used as a fallback. See issue #24921 and PR #24923.
|
|
# To keep backward compatibility, still we need to create symlinks based on USB serial.
|
|
# See issue #25179.
|
|
KERNEL=="sd*|sr*|cciss*", ENV{ID_USB_SERIAL}=="?*", SYMLINK+="disk/by-id/usb-$env{ID_USB_SERIAL}$env{.PART_SUFFIX}"
|
|
|
|
# PMEM devices
|
|
KERNEL=="pmem*", ATTRS{uuid}=="?*", SYMLINK+="disk/by-id/pmem-$attr{uuid}$env{.PART_SUFFIX}"
|
|
|
|
# FireWire
|
|
KERNEL=="sd*|sr*", ATTRS{ieee1394_id}=="?*", SYMLINK+="disk/by-id/ieee1394-$attr{ieee1394_id}$env{.PART_SUFFIX}"
|
|
|
|
# MMC
|
|
KERNEL=="mmcblk[0-9]|mmcblk[0-9]p[0-9]*", SUBSYSTEMS=="mmc", GOTO="mmc_start"
|
|
GOTO="mmc_end"
|
|
LABEL="mmc_start"
|
|
ATTRS{name}=="?*", ENV{ID_NAME}="$attr{name}"
|
|
ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}"
|
|
ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}$env{.PART_SUFFIX}"
|
|
LABEL="mmc_end"
|
|
|
|
# Memstick
|
|
KERNEL=="msblk[0-9]|mspblk[0-9]|msblk[0-9]p[0-9]|mspblk[0-9]p[0-9]", SUBSYSTEMS=="memstick", GOTO="memstick_start"
|
|
GOTO="memstick_end"
|
|
LABEL="memstick_start"
|
|
ATTRS{name}=="?*", ENV{ID_NAME}="$attr{name}"
|
|
ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}"
|
|
ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/memstick-$env{ID_NAME}_$env{ID_SERIAL}$env{.PART_SUFFIX}"
|
|
LABEL="memstick_end"
|
|
|
|
# by-path
|
|
ENV{DEVTYPE}=="disk", DEVPATH!="*/virtual/*", IMPORT{builtin}="path_id"
|
|
ENV{DEVTYPE}=="disk", SUBSYSTEMS=="nvme-subsystem", IMPORT{builtin}="path_id"
|
|
KERNEL=="mmcblk[0-9]boot[0-9]", ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-boot%n"
|
|
KERNEL=="mmcblk[0-9]boot[0-9]", ENV{DEVTYPE}=="disk", ENV{ID_PATH_WITH_USB_REVISION}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH_WITH_USB_REVISION}-boot%n"
|
|
KERNEL!="mmcblk[0-9]boot[0-9]", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}$env{.PART_SUFFIX}"
|
|
KERNEL!="mmcblk[0-9]boot[0-9]", ENV{ID_PATH_ATA_COMPAT}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH_ATA_COMPAT}$env{.PART_SUFFIX}"
|
|
KERNEL!="mmcblk[0-9]boot[0-9]", ENV{ID_PATH_WITH_USB_REVISION}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH_WITH_USB_REVISION}$env{.PART_SUFFIX}"
|
|
|
|
# legacy virtio-pci by-path links (deprecated)
|
|
KERNEL=="vd*", ENV{ID_PATH}=="pci-*", SYMLINK+="disk/by-path/virtio-$env{ID_PATH}$env{.PART_SUFFIX}"
|
|
KERNEL=="vd*", ENV{ID_PATH_WITH_USB_REVISION}=="pci-*", SYMLINK+="disk/by-path/virtio-$env{ID_PATH_WITH_USB_REVISION}$env{.PART_SUFFIX}"
|
|
|
|
{% if HAVE_BLKID %}
|
|
# allow admin to disable probing the filesystem for slow devices like floppy disk drives
|
|
ENV{UDEV_DISABLE_PERSISTENT_STORAGE_BLKID_FLAG}=="1", GOTO="persistent_storage_blkid_probe_end"
|
|
|
|
# probe filesystem metadata of optical drives which have a media inserted
|
|
KERNEL=="sr*", ENV{DISK_EJECT_REQUEST}!="?*", ENV{ID_CDROM_MEDIA_TRACK_COUNT_DATA}=="?*", ENV{ID_CDROM_MEDIA_SESSION_LAST_OFFSET}=="?*", \
|
|
IMPORT{builtin}="blkid --hint=session_offset=$env{ID_CDROM_MEDIA_SESSION_LAST_OFFSET}"
|
|
# single-session CDs do not have ID_CDROM_MEDIA_SESSION_LAST_OFFSET
|
|
KERNEL=="sr*", ENV{DISK_EJECT_REQUEST}!="?*", ENV{ID_CDROM_MEDIA_TRACK_COUNT_DATA}=="?*", ENV{ID_CDROM_MEDIA_SESSION_LAST_OFFSET}=="", \
|
|
IMPORT{builtin}="blkid --noraid"
|
|
|
|
# probe filesystem metadata of disks
|
|
KERNEL!="sr*|mmcblk[0-9]boot[0-9]", IMPORT{builtin}="blkid"
|
|
|
|
LABEL="persistent_storage_blkid_probe_end"
|
|
{% endif %}
|
|
|
|
# by-label/by-uuid links (filesystem metadata)
|
|
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
|
|
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}"
|
|
|
|
# by-id (World Wide Name)
|
|
ENV{ID_WWN_WITH_EXTENSION}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN_WITH_EXTENSION}$env{.PART_SUFFIX}"
|
|
|
|
# by-partlabel/by-partuuid links (partition metadata)
|
|
ENV{ID_PART_ENTRY_UUID}=="?*", SYMLINK+="disk/by-partuuid/$env{ID_PART_ENTRY_UUID}"
|
|
ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"
|
|
|
|
# by-path/<path>/by-* links (path + partition/filesystem metadata)
|
|
ENV{ID_PATH}=="", GOTO="persistent_storage_by-path_parts_end"
|
|
ENV{DEVTYPE}!="partition", GOTO="persistent_storage_by-path_parts_end"
|
|
|
|
SYMLINK+="disk/by-path/$env{ID_PATH}-part/by-partnum/%n"
|
|
ENV{ID_PART_ENTRY_UUID}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part/by-partuuid/$env{ID_PART_ENTRY_UUID}"
|
|
ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part/by-partlabel/$env{ID_PART_ENTRY_NAME}"
|
|
|
|
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part/by-uuid/$env{ID_FS_UUID_ENC}"
|
|
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part/by-label/$env{ID_FS_LABEL_ENC}"
|
|
|
|
LABEL="persistent_storage_by-path_parts_end"
|
|
|
|
# by-diskseq link (if an app is told to open a path like this, they may parse
|
|
# the diskseq number from the path, then issue BLKGETDISKSEQ to verify they really got
|
|
# the right device, to access specific disks in a race-free fashion)
|
|
ENV{DISKSEQ}=="?*", ENV{ID_IGNORE_DISKSEQ}!="1", SYMLINK+="disk/by-diskseq/$env{DISKSEQ}$env{.PART_SUFFIX}"
|
|
|
|
# Create symlinks that allow referencing loopback devices by their backing file's inode number
|
|
ENV{ID_LOOP_BACKING_DEVICE}!="", ENV{ID_LOOP_BACKING_INODE}!="", SYMLINK+="disk/by-loop-inode/$env{ID_LOOP_BACKING_DEVICE}-$env{ID_LOOP_BACKING_INODE}$env{.PART_SUFFIX}"
|
|
|
|
# Similar, but uses the .lo_file_name field of the loopback device (note that
|
|
# this is basically just a free-form string passed from userspace to the kernel
|
|
# when the device is created, it is not necessarily a file system path like the
|
|
# "loop/backing_file" sysfs attribute, which is always an absolute path)
|
|
ENV{ID_LOOP_BACKING_FILENAME_ENC}!="", SYMLINK+="disk/by-loop-ref/$env{ID_LOOP_BACKING_FILENAME_ENC}$env{.PART_SUFFIX}"
|
|
|
|
LABEL="persistent_storage_end"
|