Hi all,
This is a bit of a challenge to me. I tried for 3 days so i hope you all can help me solve it. The topic is a bit long but I'm trying not to leave any detail out.
Summary
I need help setting up udev on my identical hard drives that apparently show no serial number.
Problem
What i'm trying to do is use udev to ease the adding/removing of hard drives and setting up RAID on my server. Currently the server has about 8 hard disks connected, and i have another 6 more to connect. They are ordered in a specific way so everytime I add one more, their order gets messed up (sdd becomes sdf, sde becomes sdd, etc..), so I spend a whole day reorganizing them so that they mount to the right places.
I was told that I could use udev to specifically name the devices so that they'll always be ordered. I tried, but noticed that because my hard drives are identical, it caused a big challenge to me. I buy in bulk, so I have for example 4 x 500Gb SATA2 WD disks, 2 x 320Gb WD disks, etc..
The Details
The way I got my information is using
udevinfo and
hdparm. Let's start with the controller cards and 2 of the disks of which are identical.
Controller Cards (PCI)
Code:
sempron xushi # lspci
02:07.0 RAID bus controller: Silicon Image, Inc. SiI 3114 [SATALink/SATARaid] Serial ATA Controller (rev 02)
02:09.0 RAID bus controller: Silicon Image, Inc. SiI 3114 [SATALink/SATARaid] Serial ATA Controller (rev 02)
Hard disk 3
Code:
sempron xushi # hdparm -I /dev/sdd
/dev/sdd:
ATA device, with non-removable media
Model Number: WDC WD3200KS-00PFB0
Serial Number: WD-WCAPD2516974
Firmware Revision: 21.00M21
Standards:
Supported: 7 6 5 4
Likely used: 7
Configuration:
Logical max current
cylinders 16383 16383
heads 16 16
sectors/track 63 63
--
CHS current addressable sectors: 16514064
LBA user addressable sectors: 268435455
LBA48 user addressable sectors: 625142448
device size with M = 1024*1024: 305245 MBytes
device size with M = 1000*1000: 320072 MBytes (320 GB)
Capabilities:
LBA, IORDY(can be disabled)
Queue depth: 1
Standby timer values: spec'd by Standard, with device specific minimum
R/W multiple sector transfer: Max = 16 Current = 0
Recommended acoustic management value: 128, current value: 254
DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 udma6
Cycle time: min=120ns recommended=120ns
PIO: pio0 pio1 pio2 pio3 pio4
Cycle time: no flow control=120ns IORDY flow control=120ns
Commands/features:
Enabled Supported:
* SMART feature set
Security Mode feature set
* Power Management feature set
* Write cache
* Look-ahead
* Host Protected Area feature set
* WRITE_BUFFER command
* READ_BUFFER command
* NOP cmd
* DOWNLOAD_MICROCODE
Power-Up In Standby feature set
* SET_FEATURES required to spinup after power up
SET_MAX security extension
Automatic Acoustic Management feature set
* 48-bit Address feature set
* Device Configuration Overlay feature set
* Mandatory FLUSH_CACHE
* FLUSH_CACHE_EXT
* SMART error logging
* SMART self-test
* General Purpose Logging feature set
* SATA-I signaling speed (1.5Gb/s)
* SATA-II signaling speed (3.0Gb/s)
* Native Command Queueing (NCQ)
* Host-initiated interface power management
* Phy event counters
DMA Setup Auto-Activate optimization
* Software settings preservation
* SMART Command Transport (SCT) feature set
* SCT Long Sector Access (AC1)
* SCT LBA Segment Access (AC2)
* SCT Error Recovery Control (AC3)
* SCT Features Control (AC4)
* SCT Data Tables (AC5)
unknown 206[12]
Security:
Master password revision code = 65534
supported
not enabled
not locked
not frozen
not expired: security count
not supported: enhanced erase
Checksum: correct
sempron xushi #
Code:
sempron xushi # udevinfo -a -p /sys/block/sdd/
looking at device '/block/sdd':
KERNEL=="sdd"
SUBSYSTEM=="block"
DRIVER==""
ATTR{capability}=="12"
ATTR{stat}==" 2351 2619 58020 24628 1767 5452 57776 2968 0 5740 27596"
ATTR{size}=="625142448"
ATTR{removable}=="0"
ATTR{range}=="16"
ATTR{dev}=="8:48"
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:09.0/host7/target7:0:0/7:0:0:0':
KERNELS=="7:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{ioerr_cnt}=="0x2"
ATTRS{iodone_cnt}=="0x1028"
ATTRS{iorequest_cnt}=="0x1028"
ATTRS{iocounterbits}=="32"
ATTRS{timeout}=="60"
ATTRS{state}=="running"
ATTRS{rev}=="21.0"
ATTRS{model}=="WDC WD3200KS-00P"
ATTRS{vendor}=="ATA "
ATTRS{scsi_level}=="6"
ATTRS{type}=="0"
ATTRS{queue_type}=="none"
ATTRS{queue_depth}=="1"
ATTRS{device_blocked}=="0"
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:09.0/host7/target7:0:0':
KERNELS=="target7:0:0"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:09.0/host7':
KERNELS=="host7"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:09.0':
KERNELS=="0000:02:09.0"
SUBSYSTEMS=="pci"
DRIVERS=="sata_sil"
ATTRS{msi_bus}==""
ATTRS{broken_parity_status}=="0"
ATTRS{enable}=="1"
ATTRS{numa_node}=="0"
ATTRS{modalias}=="pci:v00001095d00003114sv00001095sd00006114bc01sc04i00"
ATTRS{local_cpus}=="00000001"
ATTRS{irq}=="16"
ATTRS{class}=="0x010400"
ATTRS{subsystem_device}=="0x6114"
ATTRS{subsystem_vendor}=="0x1095"
ATTRS{device}=="0x3114"
ATTRS{vendor}=="0x1095"
looking at parent device '/devices/pci0000:00/0000:00:0e.0':
KERNELS=="0000:00:0e.0"
SUBSYSTEMS=="pci"
DRIVERS==""
ATTRS{msi_bus}=="1"
ATTRS{broken_parity_status}=="0"
ATTRS{enable}=="1"
ATTRS{numa_node}=="0"
ATTRS{modalias}=="pci:v000010DEd000000EDsv00000000sd00000000bc06sc04i00"
ATTRS{local_cpus}=="00000001"
ATTRS{irq}=="0"
ATTRS{class}=="0x060400"
ATTRS{subsystem_device}=="0x0000"
ATTRS{subsystem_vendor}=="0x0000"
ATTRS{device}=="0x00ed"
ATTRS{vendor}=="0x10de"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
sempron xushi #
And here's HD6
Code:
sempron xushi # hdparm -I /dev/sde
/dev/sde:
ATA device, with non-removable media
Model Number: WDC WD3200KS-00PFB0
Serial Number: WD-WCAPD2637232
Firmware Revision: 21.00M21
Standards:
Supported: 7 6 5 4
Likely used: 7
Configuration:
Logical max current
cylinders 16383 16383
heads 16 16
sectors/track 63 63
--
CHS current addressable sectors: 16514064
LBA user addressable sectors: 268435455
LBA48 user addressable sectors: 625142448
device size with M = 1024*1024: 305245 MBytes
device size with M = 1000*1000: 320072 MBytes (320 GB)
Capabilities:
LBA, IORDY(can be disabled)
Queue depth: 1
Standby timer values: spec'd by Standard, with device specific minimum
R/W multiple sector transfer: Max = 16 Current = 0
Recommended acoustic management value: 128, current value: 254
DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 udma6
Cycle time: min=120ns recommended=120ns
PIO: pio0 pio1 pio2 pio3 pio4
Cycle time: no flow control=120ns IORDY flow control=120ns
Commands/features:
Enabled Supported:
* SMART feature set
Security Mode feature set
* Power Management feature set
* Write cache
* Look-ahead
* Host Protected Area feature set
* WRITE_BUFFER command
* READ_BUFFER command
* NOP cmd
* DOWNLOAD_MICROCODE
Power-Up In Standby feature set
* SET_FEATURES required to spinup after power up
SET_MAX security extension
Automatic Acoustic Management feature set
* 48-bit Address feature set
* Device Configuration Overlay feature set
* Mandatory FLUSH_CACHE
* FLUSH_CACHE_EXT
* SMART error logging
* SMART self-test
* General Purpose Logging feature set
* SATA-I signaling speed (1.5Gb/s)
* SATA-II signaling speed (3.0Gb/s)
* Native Command Queueing (NCQ)
* Host-initiated interface power management
* Phy event counters
DMA Setup Auto-Activate optimization
* Software settings preservation
* SMART Command Transport (SCT) feature set
* SCT Long Sector Access (AC1)
* SCT LBA Segment Access (AC2)
* SCT Error Recovery Control (AC3)
* SCT Features Control (AC4)
* SCT Data Tables (AC5)
unknown 206[12]
Security:
Master password revision code = 65534
supported
not enabled
not locked
not frozen
not expired: security count
not supported: enhanced erase
Checksum: correct
sempron xushi #
Code:
sempron xushi # udevinfo -a -p /sys/block/sde
looking at device '/block/sde':
KERNEL=="sde"
SUBSYSTEM=="block"
DRIVER==""
ATTR{capability}=="12"
ATTR{stat}==" 87 1248 3036 160 2 3 16 8 0 144 168"
ATTR{size}=="625142448"
ATTR{removable}=="0"
ATTR{range}=="16"
ATTR{dev}=="8:64"
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:09.0/host8/target8:0:0/8:0:0:0':
KERNELS=="8:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{ioerr_cnt}=="0x2"
ATTRS{iodone_cnt}=="0x6b"
ATTRS{iorequest_cnt}=="0x6b"
ATTRS{iocounterbits}=="32"
ATTRS{timeout}=="60"
ATTRS{state}=="running"
ATTRS{rev}=="21.0"
ATTRS{model}=="WDC WD3200KS-00P"
ATTRS{vendor}=="ATA "
ATTRS{scsi_level}=="6"
ATTRS{type}=="0"
ATTRS{queue_type}=="none"
ATTRS{queue_depth}=="1"
ATTRS{device_blocked}=="0"
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:09.0/host8/target8:0:0':
KERNELS=="target8:0:0"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:09.0/host8':
KERNELS=="host8"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:09.0':
KERNELS=="0000:02:09.0"
SUBSYSTEMS=="pci"
DRIVERS=="sata_sil"
ATTRS{msi_bus}==""
ATTRS{broken_parity_status}=="0"
ATTRS{enable}=="1"
ATTRS{numa_node}=="0"
ATTRS{modalias}=="pci:v00001095d00003114sv00001095sd00006114bc01sc04i00"
ATTRS{local_cpus}=="00000001"
ATTRS{irq}=="16"
ATTRS{class}=="0x010400"
ATTRS{subsystem_device}=="0x6114"
ATTRS{subsystem_vendor}=="0x1095"
ATTRS{device}=="0x3114"
ATTRS{vendor}=="0x1095"
looking at parent device '/devices/pci0000:00/0000:00:0e.0':
KERNELS=="0000:00:0e.0"
SUBSYSTEMS=="pci"
DRIVERS==""
ATTRS{msi_bus}=="1"
ATTRS{broken_parity_status}=="0"
ATTRS{enable}=="1"
ATTRS{numa_node}=="0"
ATTRS{modalias}=="pci:v000010DEd000000EDsv00000000sd00000000bc06sc04i00"
ATTRS{local_cpus}=="00000001"
ATTRS{irq}=="0"
ATTRS{class}=="0x060400"
ATTRS{subsystem_device}=="0x0000"
ATTRS{subsystem_vendor}=="0x0000"
ATTRS{device}=="0x00ed"
ATTRS{vendor}=="0x10de"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
sempron xushi #
What i learned is that i should build my udev rule using the information in udevinfo. Here is an example of how my rule started as,
Code:
SUBSYSTEMS=="scsi", ATTR{size}=="625142448", ATTRS{model}=="WDC WD3200KS-00P", NAME="storage3"
Notice from the above that what I managed to gather is the disk size and the disk model. However, I noticed when I tried to create the same rule for HD6, I got identical information too, so the rule was useless.
What supprized me is that I did not find any
ATTR{serial} tag in udevinfo. That's when i switched over to
hdparm, and I found one there! So here is how my two rules ended up looking at,
Code:
#hd3
KERNEL=="sd*", ATTR{serial}="WD-WCAPD2516974", ATTRS{model}=="WDC WD3200KS-00P", NAME="%k", SYMLINK+="storage3%n"
#hd6
KERNEL=="sd*", ATTR{serial}="WD-WCAPD2637232", ATTRS{model}=="WDC WD3200KS-00P", NAME="%k", SYMLINK+="storage6%n"
However, this gave me random results everytime i trigger udev. Sometimes
/dev/storage6X points to totally other hard drives that are not on the list, sometimes it points to the same disk as HD3, and sometimes it doesn't exist at all. This led me to believe that the ATTR{serial}is not functioning or malfunctioning as a parameter in the rule. I also tried the same rules without the ATTR{model} but same results.
So now i'm stuck. I don't know what I can use to distinguish between the hard drives.
I don't really want to list the udevinfo and hdparm of every single hard drive i have, because that will make this thread too long. It's the same problem with the other hard drives, so I thought if we start with 2 or 3 of them, then the others will be solved the same way. However, If it will help the problem by listing all the information, please tell me and I will.
At first I thought it might have been a problem or limitation of my SATA Raid controller, so I had a look at the other controllers I have, but still, i have the same problem.
Here is the information of
/dev/sda, which is a SCSI160 connected to an
Adaptec 29160LP U160 controller card
Code:
sempron xushi # udevinfo -a -p /sys/block/sda
Udevinfo starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/block/sda':
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{capability}=="12"
ATTR{stat}==" 3552 1032 151976 53580 1764 2706 35754 78884 0 20956 132464"
ATTR{size}=="35916548"
ATTR{removable}=="0"
ATTR{range}=="16"
ATTR{dev}=="8:0"
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:08.0/host0/target0:0:4/0:0:4:0':
KERNELS=="0:0:4:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{ioerr_cnt}=="0x1"
ATTRS{iodone_cnt}=="0x1508"
ATTRS{iorequest_cnt}=="0x1508"
ATTRS{iocounterbits}=="32"
ATTRS{timeout}=="60"
ATTRS{state}=="running"
ATTRS{rev}=="020W"
ATTRS{model}=="ATLAS10K3_18_WLS"
ATTRS{vendor}=="QUANTUM "
ATTRS{scsi_level}=="4"
ATTRS{type}=="0"
ATTRS{queue_type}=="ordered"
ATTRS{queue_depth}=="32"
ATTRS{device_blocked}=="0"
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:08.0/host0/target0:0:4':
KERNELS=="target0:0:4"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:08.0/host0':
KERNELS=="host0"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
looking at parent device '/devices/pci0000:00/0000:00:0e.0/0000:02:08.0':
KERNELS=="0000:02:08.0"
SUBSYSTEMS=="pci"
DRIVERS=="aic7xxx"
ATTRS{msi_bus}==""
ATTRS{broken_parity_status}=="0"
ATTRS{enable}=="1"
ATTRS{numa_node}=="0"
ATTRS{modalias}=="pci:v00009005d00000080sv00009005sd0000E2A0bc01sc00i00"
ATTRS{local_cpus}=="00000001"
ATTRS{irq}=="18"
ATTRS{class}=="0x010000"
ATTRS{subsystem_device}=="0xe2a0"
ATTRS{subsystem_vendor}=="0x9005"
ATTRS{device}=="0x0080"
ATTRS{vendor}=="0x9005"
looking at parent device '/devices/pci0000:00/0000:00:0e.0':
KERNELS=="0000:00:0e.0"
SUBSYSTEMS=="pci"
DRIVERS==""
ATTRS{msi_bus}=="1"
ATTRS{broken_parity_status}=="0"
ATTRS{enable}=="1"
ATTRS{numa_node}=="0"
ATTRS{modalias}=="pci:v000010DEd000000EDsv00000000sd00000000bc06sc04i00"
ATTRS{local_cpus}=="00000001"
ATTRS{irq}=="0"
ATTRS{class}=="0x060400"
ATTRS{subsystem_device}=="0x0000"
ATTRS{subsystem_vendor}=="0x0000"
ATTRS{device}=="0x00ed"
ATTRS{vendor}=="0x10de"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
sempron xushi #
Code:
sempron xushi # hdparm -I /dev/sda
/dev/sda:
HDIO_DRIVE_CMD(identify) failed: Invalid argument
sempron xushi #
Odd with the hdparm, but no serial number found in udevinfo. The same is with my
built in nVidia CK8S IDE controller with a 300Gb disk.
Code:
sempron xushi # udevinfo -a -p /sys/block/hda
looking at device '/block/hda':
KERNEL=="hda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{capability}=="10"
ATTR{stat}==" 118 286 1516 552 3 2 16 8 0 516 560"
ATTR{size}=="586072368"
ATTR{removable}=="0"
ATTR{range}=="64"
ATTR{dev}=="3:0"
looking at parent device '/devices/pci0000:00/0000:00:08.0/ide0/0.0':
KERNELS=="0.0"
SUBSYSTEMS=="ide"
DRIVERS=="ide-disk"
ATTRS{modalias}=="ide:m-disk"
ATTRS{drivename}=="hda"
ATTRS{media}=="disk"
looking at parent device '/devices/pci0000:00/0000:00:08.0/ide0':
KERNELS=="ide0"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
looking at parent device '/devices/pci0000:00/0000:00:08.0':
KERNELS=="0000:00:08.0"
SUBSYSTEMS=="pci"
DRIVERS=="AMD_IDE"
ATTRS{msi_bus}==""
ATTRS{broken_parity_status}=="0"
ATTRS{enable}=="1"
ATTRS{numa_node}=="0"
ATTRS{modalias}=="pci:v000010DEd000000E5sv00001043sd0000813Fbc01sc01i8a"
ATTRS{local_cpus}=="00000001"
ATTRS{irq}=="0"
ATTRS{class}=="0x01018a"
ATTRS{subsystem_device}=="0x813f"
ATTRS{subsystem_vendor}=="0x1043"
ATTRS{device}=="0x00e5"
ATTRS{vendor}=="0x10de"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{uevent}==""
sempron xushi #
And the same thing with the built in SATA CK8 chipset too.
Extra Information
Finally, here is some additional information.
I'm running Linux on an AMD Sempron with udev v114, on kernel 2.6.22, GCC 4.1.2.
Code:
sempron xushi # uname -a
Linux sempron 2.6.22-gentoo-r2 #10 SMP Sat Aug 25 20:55:26 EEST 2007 x86_64 AMD Sempron(tm) Processor 2800+ AuthenticAMD GNU/Linux
Code:
sempron xushi # emerge --info
=================================================================
System uname: 2.6.22-gentoo-r2 x86_64 AMD Sempron(tm) Processor 2800+
app-shells/bash: 3.2_p17
dev-java/java-config: 1.3.7, 2.0.33-r1
dev-lang/python: 2.4.4-r4
dev-python/pycrypto: 2.0.1-r6
sys-apps/baselayout: 1.12.9-r2
sys-apps/sandbox: 1.2.17
sys-devel/autoconf: 2.13, 2.61
sys-devel/automake: 1.4_p6, 1.5, 1.6.3, 1.7.9-r1, 1.8.5-r3, 1.9.6-r2, 1.10
sys-devel/binutils: 2.17
sys-devel/gcc-config: 1.3.16
sys-devel/libtool: 1.5.23b
virtual/os-headers: 2.6.21
CFLAGS="-O2 -pipe -march=k8 -fomit-frame-pointer -msse3 -falign-functions=64"
CHOST="x86_64-pc-linux-gnu"
CXXFLAGS="-O2 -pipe -march=k8 -fomit-frame-pointer -msse3 -falign-functions=64"
MAKEOPTS="-j2"
Summary
So to sum it up, I'm not sure what I can use from the udevinfo information that I can distinguish between the hard drives. I'm not also sure if my udev rules are correct. I hope someone can shed some light onto this problem. If you need more info i'm happy to help.
Thanks a lot,