@ -0,0 +1,8 @@ |
|||
# ignore these until someone needs them |
|||
SUBSYSTEM=="drivers", OPTIONS="ignore_device" |
|||
SUBSYSTEM=="module", OPTIONS="ignore_device" |
|||
|
|||
# sysfs is populated after the event is sent |
|||
ACTION=="add", DEVPATH=="/devices/*", ENV{PHYSDEVBUS}=="?*", WAIT_FOR_SYSFS="bus" |
|||
ACTION=="add", SUBSYSTEM=="scsi", WAIT_FOR_SYSFS="ioerr_cnt" |
|||
ACTION=="add", SUBSYSTEM=="net", WAIT_FOR_SYSFS="address" |
@ -0,0 +1,51 @@ |
|||
# 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-cdrom", GOTO="persistent_storage_end" |
|||
KERNEL=="hd*[0-9]", SYSFS{../removable}=="1", DRIVER!="ide-cdrom", GOTO="persistent_storage_end" |
|||
|
|||
# by-id (hardware serial number) |
|||
KERNEL=="hd*[!0-9]", IMPORT{program}="/sbin/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}="/sbin/usb_id -x" |
|||
KERNEL=="sd*[!0-9]|sr*|st*", ENV{ID_SERIAL}=="", IMPORT{program}="/sbin/scsi_id -g -x -s %p -d $tempnode" |
|||
KERNEL=="sd*[!0-9]|sr*|st*", ENV{ID_SERIAL}=="", IMPORT{program}="/sbin/scsi_id -g -x -a -s %p -d $tempnode" |
|||
KERNEL=="dasd*[!0-9]", IMPORT{program}="/sbin/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=="st*", ENV{ID_SERIAL}=="?*", SYMLINK+="tape/by-id/$env{ID_BUS}-$env{ID_SERIAL}" |
|||
|
|||
# for partitions import parent information |
|||
KERNEL=="sd*[0-9]|dasd*[0-9]", IMPORT{parent}=="ID_*" |
|||
KERNEL=="sd*[0-9]|dasd*[0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}-part%n" |
|||
|
|||
# by-path (shortest physical path) |
|||
KERNEL=="*[!0-9]|sr*", ENV{ID_TYPE}=="?*", IMPORT{program}="/sbin/path_id %p", SYMLINK+="disk/by-path/$env{ID_PATH}" |
|||
KERNEL=="st*", ENV{ID_TYPE}=="?*", IMPORT{program}="/sbin/path_id %p", SYMLINK+="tape/by-path/$env{ID_PATH}" |
|||
KERNEL=="sr*|st*", GOTO="persistent_storage_end" |
|||
KERNEL=="*[0-9]", IMPORT{parent}=="ID_*" |
|||
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}="/sbin/vol_id --export $tempnode" |
|||
ENV{ID_FS_UUID}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID}" |
|||
ENV{ID_FS_LABEL_SAFE}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_SAFE}" |
|||
|
|||
# BIOS Enhanced Disk Device |
|||
KERNEL=="*[!0-9]", IMPORT{program}="/sbin/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" |
|||
|
|||
KERNEL=="dm-[0-9]*", ACTION=="add", PROGRAM="/sbin/dmsetup info -c --noopencount --noheadings -o name -j %M -m %m", SYMLINK="disk/by-name/%c" |
|||
|
|||
LABEL="persistent_storage_end" |
@ -1,73 +1,82 @@ |
|||
#!/bin/bash |
|||
#!/bin/sh -e |
|||
# Inspired from a script by Remco <remco@d-compu.dyndns.org>. |
|||
# Support for /dev/discs/* and /dev/cdroms/* by Daniel Mueller <danm@gmx.li>. |
|||
# |
|||
# scsi-devfs.sh: udev external PROGRAM script |
|||
# |
|||
# Copyright 2004 Richard Gooch <rgooch@atnf.csiro.au> |
|||
# Copyright 2004 Fujitsu Ltd. |
|||
# Distributed under the GNU Copyleft version 2.0. |
|||
# |
|||
# return devfs-names for scsi-devices |
|||
# Usage in udev.rules: |
|||
# BUS="scsi", PROGRAM="/lib/udev/scsi-devfs.sh %k %b %n", NAME="%c{1}", SYMLINK="%c{2} %k" |
|||
# BUS="scsi", PROGRAM="/etc/udev/scsi-devfs.sh %k %b %n", \ |
|||
# NAME="%c{1}", SYMLINK="%k %c{2}" |
|||
|
|||
# Find out where sysfs is mounted. Exit if not available |
|||
sysfs=`grep -F sysfs /proc/mounts | awk '{print $2}'` |
|||
if [ "$sysfs" = "" ]; then |
|||
echo "sysfs is required" |
|||
exit 1 |
|||
fi |
|||
cd $sysfs/bus/scsi/devices |
|||
get_ide_offset() { |
|||
local num=0 |
|||
local dev |
|||
|
|||
case "$1" in |
|||
sd*) |
|||
# Extract partition component |
|||
if [ "$3" = "" ]; then |
|||
lpart="disc" |
|||
spart="" |
|||
else |
|||
lpart="part$3" |
|||
spart="p$3" |
|||
fi |
|||
;; |
|||
sr*) |
|||
lpart="cdrom" |
|||
spart="" |
|||
;; |
|||
st*) |
|||
# Not supported yet |
|||
exit 1 |
|||
;; |
|||
sg*) |
|||
lpart="generic" |
|||
spart="" |
|||
;; |
|||
*) |
|||
exit 1 |
|||
;; |
|||
esac |
|||
for dev in /proc/ide/*/media; do |
|||
if [ "`cat $dev`" = "$1" ]; then |
|||
num=$(($num + 1)) |
|||
fi |
|||
done |
|||
|
|||
# Extract SCSI logical address components |
|||
scsi_host=`echo $2 | cut -f 1 -d:` |
|||
scsi_bus=`echo $2 | cut -f 2 -d:` |
|||
scsi_target=`echo $2 | cut -f 3 -d:` |
|||
scsi_lun=`echo $2 | cut -f 4 -d:` |
|||
echo $num |
|||
} |
|||
|
|||
# Generate common and logical names |
|||
l_com="bus$scsi_bus/target$scsi_target/lun$scsi_lun/$lpart" |
|||
l_log="scsi/host$scsi_host/$l_com" |
|||
get_next_number() { |
|||
local num=0 |
|||
local dev |
|||
local offset=`get_ide_offset $2` |
|||
|
|||
if [ "$2" = "disk" ]; then |
|||
local DRIVE="${1%%[0-9]*}" |
|||
local DEVLIST="/sys/block/sd*" |
|||
else |
|||
local DRIVE=$1 |
|||
local DEVLIST="/sys/block/sr*" |
|||
fi |
|||
|
|||
if [ -d /dev/discs ] ; then |
|||
for x in /dev/discs/disc* ; do |
|||
if readlink `ls -d $x/* | awk '{print $0; exit;}'` | grep -q "${l_log%${lpart}}" ; then |
|||
x=`echo $x | cut -f3 -dc` # gives the number in disc0 |
|||
break |
|||
fi |
|||
unset x |
|||
for dev in $DEVLIST; do |
|||
[ "${dev#/sys/block/}" = "$DRIVE" ] && break |
|||
num=$(($num + 1)) |
|||
done |
|||
fi |
|||
|
|||
if [ -z "${x}" ] ; then |
|||
x="`ls /dev/discs/ 2> /dev/null | grep -c .`" |
|||
fi |
|||
echo $(($offset + $num)) |
|||
} |
|||
|
|||
# the format is "HOST:BUS:TARGET:LUN" |
|||
SCSI_ID=$2 |
|||
HOST=${SCSI_ID%%:*} |
|||
SCSI_ID=${SCSI_ID#*:} |
|||
BUS=${SCSI_ID%%:*} |
|||
SCSI_ID=${SCSI_ID#*:} |
|||
TARGET=${SCSI_ID%%:*} |
|||
SCSI_ID=${SCSI_ID#*:} |
|||
LUN=$SCSI_ID |
|||
|
|||
case "$1" in |
|||
scd*|sr*) |
|||
# CDROM/DVD |
|||
NAME=cd |
|||
LINK="cdroms/cdrom"`get_next_number $1 cdrom` |
|||
;; |
|||
sd*) |
|||
if [ "$3" ]; then |
|||
NAME=part$3 |
|||
LINK="discs/disc"`get_next_number $1 disk`/part${3} |
|||
else |
|||
NAME=disc |
|||
LINK="discs/disc"`get_next_number $1 disk`/disc |
|||
fi |
|||
;; |
|||
nst*) |
|||
NAME=$(echo "$1" | sed -e 's/nst0m/nmt/') |
|||
[ $NAME = "mt0" ] && LINK=ntape |
|||
;; |
|||
st*) |
|||
NAME=$(echo "$1" | sed -e 's/st0m/mt/') |
|||
[ $NAME = "mt0" ] && LINK=tape |
|||
;; |
|||
sg*|*) |
|||
NAME=generic |
|||
;; |
|||
esac |
|||
|
|||
echo scsi/host$HOST/bus$BUS/target$TARGET/lun$LUN/$NAME $LINK |
|||
|
|||
echo $l_log discs/disc${x}/${lpart} |
|||
exit 0 |