# /etc/udev/rules.d/25-lfs.rules: Rule definitions for LFS.
-# Create the /dev/cdrom symlink.
-
-BUS="ide", KERNEL="*[!0-9]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="%k", SYMLINK="cdrom"
-
# Core kernel devices
-KERNEL="ptmx", GROUP="tty", MODE="0666"
-KERNEL="random", MODE="0444"
-KERNEL="urandom", MODE="0444"
-KERNEL="kmem", GROUP="kmem", MODE="0640"
-KERNEL="mem", GROUP="kmem", MODE="0640"
-KERNEL="port", GROUP="kmem", MODE="0640"
-KERNEL="null", MODE="0666"
-KERNEL="zero", MODE="0666"
-KERNEL="full", MODE="0666"
-KERNEL="aio", MODE="0444"
-KERNEL="kmsg", MODE="0600"
-KERNEL="rtc", MODE="0666"
+KERNEL=="ptmx", MODE="0666", GROUP="tty"
+KERNEL=="random", MODE="0444"
+KERNEL=="urandom", MODE="0444"
+KERNEL=="kmem", MODE="0640", GROUP="kmem"
+KERNEL=="mem", MODE="0640", GROUP="kmem"
+KERNEL=="port", MODE="0640", GROUP="kmem"
+KERNEL=="null", MODE="0666"
+KERNEL=="zero", MODE="0666"
+KERNEL=="full", MODE="0666"
+KERNEL=="aio", MODE="0444"
+KERNEL=="kmsg", MODE="0600"
+KERNEL=="rtc", MODE="0666"
# Comms devices
-KERNEL="ttyS[0-9]*", GROUP="dialout"
-KERNEL="ttyUSB[0-9]*", GROUP="dialout"
-KERNEL="rfcomm[0-9]*", GROUP="dialout"
-KERNEL="tty[BCDEFHILMPRSTUVWX][0-9]*", GROUP="dialout"
-KERNEL="ttyS[ACIR][0-9]*", GROUP="dialout"
-KERNEL="ttyUSB[0-9]*", GROUP="dialout"
-KERNEL="ttyACM[0-9]*", GROUP="dialout"
-KERNEL="ippp[0-9]*", GROUP="dialout"
-KERNEL="isdn[0-9]*", GROUP="dialout"
-KERNEL="isdnctrl[0-9]*", GROUP="dialout"
-KERNEL="capi", NAME="capi20", SYMLINK="isdn/capi20"
-KERNEL="capi*", NAME="capi/%n", GROUP="dialout"
-KERNEL="dcbri[0-9]*", GROUP="dialout"
-KERNEL="ircomm[0-9]*", GROUP="dialout"
+KERNEL=="ttyS[0-9]*", GROUP="dialout"
+KERNEL=="ttyUSB[0-9]*", GROUP="dialout"
+KERNEL=="rfcomm[0-9]*", GROUP="dialout"
+KERNEL=="tty[BCDEFHILMPRSTUVWX][0-9]*", GROUP="dialout"
+KERNEL=="ttyS[ACIR][0-9]*", GROUP="dialout"
+KERNEL=="ttyUSB[0-9]*", GROUP="dialout"
+KERNEL=="ttyACM[0-9]*", GROUP="dialout"
+KERNEL=="ippp[0-9]*", GROUP="dialout"
+KERNEL=="isdn[0-9]*", GROUP="dialout"
+KERNEL=="isdnctrl[0-9]*", GROUP="dialout"
+KERNEL=="capi", NAME="capi20", SYMLINK="isdn/capi20"
+KERNEL=="capi?*", NAME="capi/%n", GROUP="dialout"
+KERNEL=="dcbri[0-9]*", GROUP="dialout"
+KERNEL=="ircomm[0-9]*", GROUP="dialout"
# TTY's
-KERNEL="tty", GROUP="tty", MODE="0666"
-KERNEL="tty[0-9]*", GROUP="tty", MODE="0666"
-KERNEL="vcs*", MODE="0600"
-KERNEL="console", GROUP="tty", MODE="0622"
+KERNEL=="tty", MODE="0666", GROUP="tty"
+KERNEL=="tty[0-9]*", MODE="0666", GROUP="tty"
+KERNEL=="vcs*", MODE="0600"
+KERNEL=="console", MODE="0622", GROUP="tty"
# ALSA devices go in their own subdirectory
-KERNEL="controlC[0-9]*", NAME="snd/%k", GROUP="audio"
-KERNEL="hw[CD0-9]*", NAME="snd/%k", GROUP="audio"
-KERNEL="pcm[CD0-9cp]*", NAME="snd/%k", GROUP="audio"
-KERNEL="midiC[D0-9]*", NAME="snd/%k", GROUP="audio"
-KERNEL="timer", NAME="snd/%k", GROUP="audio"
-KERNEL="seq", NAME="snd/%k", GROUP="audio"
+KERNEL=="controlC[0-9]*", GROUP="audio", NAME="snd/%k"
+KERNEL=="hw[CD0-9]*", GROUP="audio", NAME="snd/%k"
+KERNEL=="pcm[CD0-9cp]*", GROUP="audio", NAME="snd/%k"
+KERNEL=="midiC[D0-9]*", GROUP="audio", NAME="snd/%k"
+KERNEL=="timer", GROUP="audio", NAME="snd/%k"
+KERNEL=="seq", GROUP="audio", NAME="snd/%k"
# Sound devices
-KERNEL="admmidi*", GROUP="audio"
-KERNEL="adsp*", GROUP="audio"
-KERNEL="aload*", GROUP="audio"
-KERNEL="amidi*", GROUP="audio"
-KERNEL="amixer*", GROUP="audio"
-KERNEL="audio*", GROUP="audio"
-KERNEL="dmfm*", GROUP="audio"
-KERNEL="dmmidi*", GROUP="audio"
-KERNEL="dsp*", GROUP="audio"
-KERNEL="midi*", GROUP="audio"
-KERNEL="mixer*", GROUP="audio"
-KERNEL="music", GROUP="audio"
-KERNEL="sequencer*", GROUP="audio"
+KERNEL=="admmidi*", GROUP="audio"
+KERNEL=="adsp*", GROUP="audio"
+KERNEL=="aload*", GROUP="audio"
+KERNEL=="amidi*", GROUP="audio"
+KERNEL=="amixer*", GROUP="audio"
+KERNEL=="audio*", GROUP="audio"
+KERNEL=="dmfm*", GROUP="audio"
+KERNEL=="dmmidi*", GROUP="audio"
+KERNEL=="dsp*", GROUP="audio"
+KERNEL=="midi*", GROUP="audio"
+KERNEL=="mixer*", GROUP="audio"
+KERNEL=="music", GROUP="audio"
+KERNEL=="sequencer*", GROUP="audio"
# Printing devices
-KERNEL="lp[0-9]*", GROUP="lp"
-KERNEL="parport[0-9]*", GROUP="lp"
-KERNEL="irlpt[0-9]*", GROUP="lp"
+KERNEL=="lp[0-9]*", GROUP="lp"
+KERNEL=="parport[0-9]*", GROUP="lp"
+KERNEL=="irlpt[0-9]*", GROUP="lp"
# Input devices go in their own subdirectory
-KERNEL="mice", NAME="input/%k", MODE="0644"
-KERNEL="mouse*", NAME="input/%k", MODE="0644", SYMLINK="mouse"
-KERNEL="event*", NAME="input/%k", MODE="0644"
-KERNEL="js*", NAME="input/%k", MODE="0644"
-KERNEL="ts*", NAME="input/%k", MODE="0644"
+KERNEL=="mice", MODE="0644", NAME="input/%k" SYMLINK="mouse"
+KERNEL=="mouse*", MODE="0644", NAME="input/%k"
+KERNEL=="event*", MODE="0644", NAME="input/%k"
+KERNEL=="js*", MODE="0644", NAME="input/%k"
+KERNEL=="ts*", MODE="0644", NAME="input/%k"
-KERNEL="psaux", MODE="0644"
-KERNEL="js", MODE="0644"
-KERNEL="djs", MODE="0644"
+KERNEL=="psaux", MODE="0644"
+KERNEL=="js", MODE="0644"
+KERNEL=="djs", MODE="0644"
# USB devices go in their own subdirectory
-KERNEL="hiddev*", NAME="usb/%k"
-KERNEL="auer*", NAME="usb/%k"
-KERNEL="legousbtower*", NAME="usb/%k"
-KERNEL="dabusb*", NAME="usb/%k"
-BUS="usb", KERNEL="lp[0-9]*", NAME="usb/%k", GROUP="lp"
+SUBSYSTEM=="usb_device", PROGRAM="/bin/sh -c 'X=%k; X=$${X#usbdev}; B=$${X%%%%.*} D=$${X#*.}; echo bus/usb/$$B/$$D'", NAME="%c"
+KERNEL=="hiddev*", NAME="usb/%k"
+KERNEL=="auer*", NAME="usb/%k"
+KERNEL=="legousbtower*", NAME="usb/%k"
+KERNEL=="dabusb*", NAME="usb/%k"
+BUS=="usb", KERNEL=="lp[0-9]*", GROUP="lp", NAME="usb/%k"
-# DRI devices go in their own subdirectory for FHS compliance
+# DRI devices are managed by the X server, so prevent udev from creating them
-KERNEL="card*", NAME="dri/card%n", GROUP="video"
+KERNEL=="card*", NAME=""
# Video devices
-KERNEL="fb[0-9]*", GROUP="video", MODE="0620"
-KERNEL="agpgart", GROUP="video"
-KERNEL="nvidia[0-9]*", GROUP="video"
-KERNEL="nvidiactl", GROUP="video"
-KERNEL="video[0-9]*", GROUP="video"
-KERNEL="radio[0-9]*", GROUP="video"
-KERNEL="vbi[0-9]*", GROUP="video"
-KERNEL="vtx[0-9]*", GROUP="video"
+KERNEL=="fb[0-9]*", MODE="0620", GROUP="video"
+KERNEL=="agpgart", GROUP="video"
+KERNEL=="video[0-9]*", GROUP="video"
+KERNEL=="radio[0-9]*", GROUP="video"
+KERNEL=="vbi[0-9]*", GROUP="video"
+KERNEL=="vtx[0-9]*", GROUP="video"
# Storage/memory devices
-KERNEL="fd[0-9]*", GROUP="disk" SYMLINK="floppy"
-KERNEL="ram[0-9]*", GROUP="disk"
-KERNEL="raw[0-9]*", NAME="raw/%k", GROUP="disk"
-KERNEL="hd*", GROUP="disk"
-KERNEL="sd[a-z]", GROUP="disk"
-KERNEL="sd[a-z][0-9]*", GROUP="disk"
-KERNEL="sd[a-i][a-z]", GROUP="disk"
-KERNEL="sd[a-i][a-z][0-9]*", GROUP="disk"
-KERNEL="sr[0-9]*", GROUP="burning" MODE="0664"
-KERNEL="s[gt][0-9]*", GROUP="disk"
-KERNEL="scd[0-9]*", GROUP="cdrom"
-KERNEL="dasd[0-9]*", GROUP="disk"
-KERNEL="ataraid[0-9]*", GROUP="disk"
-KERNEL="loop[0-9]*", GROUP="disk"
-KERNEL="md[0-9]*", GROUP="disk"
-KERNEL="dm-*", GROUP="disk", MODE="0640"
-KERNEL="ht[0-9]*", GROUP="tape"
-KERNEL="nht[0-9]*", GROUP="tape"
-KERNEL="pt[0-9]*", GROUP="tape"
-KERNEL="npt[0-9]*", GROUP="tape"
-KERNEL="st[0-9]*", GROUP="tape"
-KERNEL="nst[0-9]*", GROUP="tape"
-KERNEL="iseries/vcd*", GROUP="disk"
-KERNEL="iseries/vd*", GROUP="disk"
+KERNEL=="fd[0-9]*", GROUP="floppy"
+KERNEL=="ram[0-9]*", GROUP="disk"
+KERNEL=="raw[0-9]*", GROUP="disk", NAME="raw/%k"
+KERNEL=="hd*", GROUP="disk"
+KERNEL=="sd[a-z]", GROUP="disk"
+KERNEL=="sd[a-z][0-9]*", GROUP="disk"
+KERNEL=="sd[a-i][a-z]", GROUP="disk"
+KERNEL=="sd[a-i][a-z][0-9]*", GROUP="disk"
+KERNEL=="dasd[0-9]*", GROUP="disk"
+KERNEL=="loop[0-9]*", GROUP="disk"
+KERNEL=="md[0-9]*", GROUP="disk"
+
+# dmsetup and lvm2 related programs create devicemapper devices so we prevent
+# udev from creating them
+
+KERNEL=="dm-*", OPTIONS+="ignore_device"
+KERNEL=="device-mapper", OPTIONS+="ignore_device"
+
+KERNEL=="ht[0-9]*", GROUP="tape"
+KERNEL=="nht[0-9]*", GROUP="tape"
+KERNEL=="pt[0-9]*", GROUP="tape"
+KERNEL=="npt[0-9]*", GROUP="tape"
+KERNEL=="st[0-9]*", GROUP="tape"
+KERNEL=="nst[0-9]*", GROUP="tape"
# Network devices
-KERNEL="tun", NAME="net/%k"
+KERNEL=="tun", NAME="net/%k"
--- /dev/null
+# persistent storage links: /dev/{disk,tape}/{by-id,by-uuid,by-label,by-path,by-name}
+# scheme based on "Linux persistent device names", 2004, Hannes Reinecke <hare@suse.de>
+
+ACTION!="add", GOTO="persistent_storage_end"
+SUBSYSTEM!="block", GOTO="persistent_storage_end"
+
+# skip rules for inappropriate block devices
+KERNEL=="ram*|loop*|fd*|nbd*", GOTO="persistent_storage_end"
+
+# never access removable ide devices, the drivers are causing event loops on open()
+KERNEL=="hd*[!0-9]", SYSFS{removable}=="1", DRIVER=="ide-cs|ide-floppy", GOTO="persistent_storage_end"
+KERNEL=="hd*[0-9]", SYSFS{../removable}=="1", GOTO="persistent_storage_end"
+
+# for partitions import parent information
+KERNEL=="*[0-9]", IMPORT{parent}=="ID_*"
+
+# by-id (hardware serial number)
+KERNEL=="hd*[!0-9]", IMPORT{program}="ata_id --export $tempnode"
+KERNEL=="hd*[!0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/ata-$env{ID_MODEL}_$env{ID_SERIAL}"
+KERNEL=="hd*[0-9]", IMPORT{parent}=="ID_*", SYMLINK+="disk/by-id/ata-$env{ID_MODEL}_$env{ID_SERIAL}-part%n"
+
+KERNEL=="sd*[!0-9]|sr*|st*", SYSFS{ieee1394_id}=="*", ENV{ID_SERIAL}="$sysfs{ieee1394_id}", ENV{ID_BUS}="ieee1394"
+KERNEL=="sd*[!0-9]|sr*|st*", ENV{ID_SERIAL}=="", IMPORT{program}="usb_id -x"
+KERNEL=="sd*[!0-9]|sr*|st*", ENV{ID_SERIAL}=="", IMPORT{program}="scsi_id -g -x -s %p -d $tempnode"
+KERNEL=="sd*[!0-9]|sr*|st*", ENV{ID_SERIAL}=="", IMPORT{program}="scsi_id -g -x -a -s %p -d $tempnode"
+KERNEL=="dasd*[!0-9]", IMPORT{program}="dasd_id --export $tempnode"
+KERNEL=="sd*[!0-9]|sr*|dasd*[!0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
+KERNEL=="sd*[0-9]|dasd*[0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}-part%n"
+KERNEL=="st*", ENV{ID_SERIAL}=="?*", SYMLINK+="tape/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
+
+# by-path (shortest physical path)
+KERNEL=="*[!0-9]|sr*", IMPORT{program}="path_id %p", SYMLINK+="disk/by-path/$env{ID_PATH}"
+KERNEL=="st*", IMPORT{program}="path_id %p", SYMLINK+="tape/by-path/$env{ID_PATH}"
+KERNEL=="sr*|st*", GOTO="persistent_storage_end"
+KERNEL=="*[0-9]", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part%n"
+
+# by-label/by-uuid (filesystem properties)
+KERNEL=="*[!0-9]", SYSFS{removable}=="1", GOTO="persistent_storage_end"
+IMPORT{program}="vol_id --export $tempnode"
+ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_UUID}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID}"
+ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_SAFE}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_SAFE}"
+
+# BIOS Enhanced Disk Device
+KERNEL=="*[!0-9]", IMPORT{program}="edd_id --export $tempnode"
+KERNEL=="*[!0-9]", ENV{ID_EDD}=="?*", SYMLINK+="disk/by-id/edd-$env{ID_EDD}"
+KERNEL=="*[0-9]", ENV{ID_EDD}=="?*", SYMLINK+="disk/by-id/edd-$env{ID_EDD}-part%n"
+
+
+LABEL="persistent_storage_end"