mirror of
https://github.com/systemd/systemd.git
synced 2025-01-28 21:47:38 +03:00
df1dccd255
Previously, if the priority is same, devlinks are always replaced by newer events. The commit 331aa7aa15ee5dd12b369b276f575d521435eb52 changes that to keep the existing devlink. That should not change any behavior when the devices that request the same symlink do not have any dependency, e.g. when /dev/sda1 and /dev/adb1 request the same /dev/disk/by-label symlink, as there are no guarantee that which device is processed first. However, when devices has dependency, e.g. /dev/sda and /dev/sda1 request the same /dev/disk/by-label symlink, previously the symlink always pointed to the partition, as the partition is always processed later. But, 331aa7aa15ee5dd12b369b276f575d521435eb52 makes the symlink point to the whole disk. The change by 331aa7aa15ee5dd12b369b276f575d521435eb52 is crucial to improve performance of devlink handling, especially when a system has large number of disks with same label or so. Hence, cannot and should not be reverted. So, let's workaround the case, as such situation should happen only when the disk is a hybrind ISO image, I guess. Fixes #28468.
158 lines
8.8 KiB
Plaintext
158 lines
8.8 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]*", GOTO="mmc_end"
|
|
SUBSYSTEMS!="mmc", GOTO="mmc_end"
|
|
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]", GOTO="memstick_end"
|
|
SUBSYSTEMS!="memstick", GOTO="memstick_end"
|
|
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 %}
|
|
|
|
# Decrease devlink priority for whole disk of ISO hybrid images, and make the
|
|
# priority for partitions in the image relatively higher. This is for the case
|
|
# that a disk and one of its partition have the same label or so.
|
|
# See issue #28468.
|
|
ENV{ID_FS_TYPE}=="iso9660", ENV{DEVTYPE}=="disk", OPTIONS+="link_priority=-10"
|
|
|
|
# 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-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}"
|
|
|
|
LABEL="persistent_storage_end"
|