Recently retired some SUN fire X4540 nodes. They are very good machines, so get chance to have them reinsalled to Linux, also installed ZOL ZFS 0.6.3.

Got used to see disk name on them as cxty, so tried to use ZOL vdev configuration, but it turns out that ZOL vdev is good for external sas connection, either sas-direct or sas switch, but not for SUN fire X4540 which sas controllers internally connected within the box.

Linux provides by-path(/dev/disk/by-path) naming, it clearly shows the pci path of each disk, but not enough because you still don't know the disk location.

Here is the link talked about mentioned 3 different dev name conventions,  What Dev Names Should I Use When Creating My Pool

Here is what I did to make disk name look like Solaris disk naming.

Step1:  Create a udev script

Here is the script look like, only 4 lines

# cat /etc/udev/scripting/sun_fire_x4540_vdev
#!/bin/bash
ID_VDEV=`/sbin/udevadm info --query=path --name /dev/$1 |awk -F'/' '{print $6$7}' | sed -e 's/host/c/g' |sed -e 's/port-.:/t/g'`
echo "ID_VDEV=$ID_VDEV"
echo "ID_VDEV_PATH=disk/by-vdev/${ID_VDEV}"

Step2: Create a udev rule

# cat /etc/udev/rules.d/90-vdev.rules 
#
# /etc/udev/rules.d/90-vdev.rules
#

ENV{DEVTYPE}=="disk", IMPORT{program}="/etc/udev/scripting/sun_fire_x4540_vdev %k"

KERNEL=="*[!0-9]", ENV{SUBSYSTEM}=="block", ENV{ID_VDEV}=="?*", SYMLINK+="$env{ID_VDEV_PATH}"
KERNEL=="*[0-9]", ENV{SUBSYSTEM}=="block", ENV{DEVTYPE}=="partition", ENV{ID_VDEV}=="?*", SYMLINK+="$env{ID_VDEV_PATH}-part%n"
KERNEL=="dm-[0-9]*", ENV{SUBSYSTEM}=="block", ENV{ID_VDEV}=="?*", SYMLINK+="$env{ID_VDEV_PATH}"

Step3: Test

#start_udev
# ls /dev/disk/by-vdev/
c0t0        c0t6-part9    c1t5-part1  c2t4-part9    c3t4        c4t3-part1    c5t2-part9
c0t0-part1  c0t7    c1t5-part9  c2t5    c3t4-part1  c4t3-part9    c5t3
c0t0-part2  c0t7-part1    c1t6        c2t5-part1    c3t4-part9  c4t4    c5t3-part1
c0t0-part3  c0t7-part9    c1t6-part1  c2t5-part9    c3t5        c4t4-part1    c5t3-part9
c0t0-part4  c1t0    c1t6-part9  c2t6    c3t5-part1  c4t4-part9    c5t4
c0t1        c1t0-part1    c1t7        c2t6-part1    c3t5-part9  c4t5    c5t4-part1
c0t1-part1  c1t0-part2    c1t7-part1  c2t6-part9    c3t6        c4t5-part1    c5t4-part9
c0t1-part9  c1t0-part3    c1t7-part9  c2t7    c3t6-part1  c4t5-part9    c5t5
c0t2        c1t0-part4    c2t0        c2t7-part1    c3t6-part9  c4t6    c5t5-part1
c0t2-part1  c1t1    c2t0-part1  c2t7-part9    c3t7        c4t6-part1    c5t5-part9
c0t2-part9  c1t1-part1    c2t0-part9  c3t0    c3t7-part1  c4t6-part9    c5t6
c0t3        c1t1-part9    c2t1        c3t0-part1    c3t7-part9  c4t7    c5t6-part1
c0t3-part1  c1t2    c2t1-part1  c3t0-part9    c4t0        c4t7-part1    c5t6-part9
c0t3-part9  c1t2-part1    c2t1-part9  c3t1    c4t0-part1  c4t7-part9    c5t7
c0t4        c1t2-part9    c2t2        c3t1-part1    c4t0-part9  c5t0    c5t7-part1
c0t4-part1  c1t3    c2t2-part1  c3t1-part9    c4t1        c5t0-part1    c5t7-part9
c0t4-part9  c1t3-part1    c2t2-part9  c3t2    c4t1-part1  c5t0-part9    d1
c0t5        c1t3-part9    c2t3        c3t2-part1    c4t1-part9  c5t1
c0t5-part1  c1t4    c2t3-part1  c3t2-part9    c4t2        c5t1-part1
c0t5-part9  c1t4-part1    c2t3-part9  c3t3    c4t2-part1  c5t1-part9
c0t6        c1t4-part9    c2t4        c3t3-part1    c4t2-part9  c5t2
c0t6-part1  c1t5    c2t4-part1  c3t3-part9    c4t3        c5t2-part1

 

Note: c0t0 and c1t0 are being used for system disks, while others have Solaris ZFS partitions.

Now, you can safely create zfs pools, probably you know CxTy name convention

Cx: controller #
Ty: target disk #

You can easily find this naming mapping to physical disk from the Vendor's document, so easier to maintenance.

You can also find the mapping from zfs-configuration-and-tuning-example-on-sun-fire-x4540

Overall, if you have other similar product, then you can just simply adjust(maybe not) my script to rename the vdisk to map to your vendor's disk logical --> physical mapping.