뭘 이런걸..

Posted
Filed under Tech/Tip & Trick
MegaRAID 의 VD 의 device name 을 구하는 방법

일단, controller 별 device 정보는 다음에서 구할 수 있다

/dev/disk/by-path/*
/sys/block/*/device


이 두 경로 리스트의 softlink target 에 device name 이 존재한다.

[root@host ~]# ls -l /dev/disk/by-path/
합계 0
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:00:11.5-ata-3.0 -> ../../sdg
lrwxrwxrwx 1 root root 10 9월 5 01:30 pci-0000:00:11.5-ata-3.0-part1 -> ../../sdg1
lrwxrwxrwx 1 root root 10 9월 5 01:30 pci-0000:00:11.5-ata-3.0-part2 -> ../../sdg2
lrwxrwxrwx 1 root root 10 9월 5 01:30 pci-0000:00:11.5-ata-3.0-part3 -> ../../sdg3
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:17:00.0-scsi-0:2:0:0 -> ../../sda
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:17:00.0-scsi-0:2:1:0 -> ../../sdb
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:0:0 -> ../../sdc
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:1:0 -> ../../sdd
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:2:0 -> ../../sde
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:3:0 -> ../../sdf


by-path 의 장점은 위의 정보와 같아 cotroller 에 연결이 안되어 있는 disk 가 존재하는 경우을 처리할 수 있다는 장점이 있으나, CentOS 5 이전의 경우에는 by-path를 지원하지 않는 단점이 있다. CentOS 5 에서도 커널 버전에 따라 지원되고 안되고의 차이가 발생할 있다.

/sys 는 아래와 같다.

[root@a1page074.ndrive z]# ls -l /sys/block/sd*/device
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sda/device -> ../../../0:2:0:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdb/device -> ../../../0:2:1:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdc/device -> ../../../12:2:0:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdd/device -> ../../../12:2:1:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sde/device -> ../../../12:2:2:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdf/device -> ../../../12:2:3:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdg/device -> ../../../3:0:0:0


/sys 의 경우 /sys 를 지원하는 커널에서는 다 사용을 할 수 있지만, 위와 같이 controller 에 연결이 되어 있지 않은 device 를 솎아 내기가 좀 애매하다.

여기서는 경우의 수를 될 수 있으면 많이 처리하기 위하여 /dev/disk/by-path 를 이용하여 구하는 코드를 만들어 볼 것이다.

일단, MegaRAID 를 사용하는 device 만 솎아 내기 위하여 PCI table 을 확인한다.

[root@host ~]# lspci | grep -E "LSI|Dell|IBM|MegaRAID"
17:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)
b3:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)


여기서 주의할 것이 sort 를 해서는 안된다. 여기에 나오는 순서가 MegaCLI 에서 나오는 controller 의 순서와 동일하다. 이 정보의 첫번째 필드만 있으면 된다.

그럼 by-path 에서 controller 정보와 VD 정보는 어떻게 매핑 하면 되는지 보겠다.

pci-0000:17:00.0-scsi-0:2:0:0
pci-0000:{PCI_TABLE_NUMBER}-scsi-0:2:{VD_NUMBER}:0


위와 같은 규칙을 이용하여 찾도록 한다. 그럼 완성된 코드는 다음과 같다.

idx=0
for rc in $(lspci | grep -E "LSI|Dell|IBM|MegaRAID" | sort | awk '{print $1}')
do
bypath="$(
ls -l /dev/disk/by-path/pci-0000:${rc}-* 2> /dev/null | awk -v ctrlidx=${idx} '
{
n = split ($(NF-2), A, ":");
vdnum = A[n-1]
dev = gensub (/.*\//, "", "g", $NF);

print ctrlidx ":" vdnum ":" dev

#print $(NF-2) " " $NF
}
'
)"
echo "$bypath"
let "idx++"
done


위의 코드의 결과는 다음과 같다.

controller_number:VD_number:device_name
0:0:sda
0:1:sdb
1:0:sdc
1:1:sdd
1:2:sde
1:3:sdf
2019/09/05 13:19 2019/09/05 13:19