Linux 2.6.39 커널이 설치된 컴퓨터의 (가변) 수의 디스크에 PCI 연결 SATA 컨트롤러가 연결되어 있습니다. 컨트롤러의 PCI 주소를 알고 디스크의 물리적 위치를 찾으려고 합니다.
이 예에서 컨트롤러는 주소 0000:01:00.0에 있고 SCSI 주소가 6:0.0.0.0 및 8:0.0.0인 두 개의 디스크가 있습니다(마지막 두 개가 반드시 고정된 것은 아니지만 이것이 의미임). 지금).
lshw -c storage
컨트롤러 및 SCSI 장치 표시(시스템 디스크 및 컨트롤러 정리):
*-storage
description: SATA controller
product: Marvell Technology Group Ltd.
vendor: Marvell Technology Group Ltd.
physical id: 0
bus info: pci@0000:01:00.0
version: 10
width: 32 bits
clock: 33MHz
capabilities: storage pm msi pciexpress ahci_1.0 bus_master cap_list rom
configuration: driver=ahci latency=0
resources: irq:51 ioport:e050(size=8) ioport:e040(size=4) ioport:e030(size=8) ioport:e020(size=4) ioport:e000(size=32) memory:f7b10000-f7b107ff memory:f7b00000-f7b0ffff
*-scsi:1
physical id: 2
logical name: scsi6
capabilities: emulated
*-scsi:2
physical id: 3
logical name: scsi8
capabilities: emulated
lshw -c disk
디스크 표시:
*-disk
description: ATA Disk
product: TOSHIBA THNSNF25
vendor: Toshiba
physical id: 0.0.0
bus info: scsi@6:0.0.0
logical name: /dev/sdb
version: FSXA
serial: 824S105DT15Y
size: 238GiB (256GB)
capabilities: gpt-1.00 partitioned partitioned:gpt
configuration: ansiversion=5 guid=79a679b1-3c04-4306-a498-9a959e2df371 sectorsize=4096
*-disk
description: ATA Disk
product: TOSHIBA THNSNF25
vendor: Toshiba
physical id: 0.0.0
bus info: scsi@8:0.0.0
logical name: /dev/sdc
version: FSXA
serial: 824S1055T15Y
size: 238GiB (256GB)
capabilities: gpt-1.00 partitioned partitioned:gpt
configuration: ansiversion=5 guid=79a679b1-3c04-4306-a498-9a959e2df371 sectorsize=4096
그러나 PCI 주소에서 SCSI 주소로 이동할 수 있는 방법은 없는 것 같습니다. 또한 PCI 및 SCSI 장치에 대한 sysfs 항목을 살펴보았지만 연결을 설정하는 항목을 찾지 못했습니다. 디스크가 컨트롤러의 다른 물리적 포트에 연결될 때 SCSI 주소는 반드시 변경되지 않으므로 디스크 위치를 올바르게 결정하기 위해 오프셋과 함께 사용할 수 없습니다.
ID별로 디스크를 나열하는 것도 작동하지 않습니다. ls -lah /dev/disks/by-path
표시된 항목은 pci-0000:01:00.0-scsi-0:0:0:0
( 또는 일반적으로 연결된 마지막 디스크)를 가리키며 해당 드라이브 파티션에 대한 링크 외에 /dev/sdc
시작할 다른 경로가 없습니다 .pci-0000:01:00.0
디스크를 찾는 데 사용할 수 있는 주소에 컨트롤러 주소를 매핑하는 다른 방법이 있습니까?
답변1
lshw -c disk
이 명령의 출력을 상호 참조하면 원하는 것을 얻을 수 있을 것 같습니다 udevadm info -q all -n <device>
.
예를 들어
내 /dev/sda
장치에는 다음 출력이 표시됩니다 lshw
.
$ sudo lshw -c disk
*-disk
description: ATA Disk
product: ST9500420AS
vendor: Seagate
physical id: 0
bus info: scsi@0:0.0.0
logical name: /dev/sda
version: 0003
serial: 5XA1A2CZ
size: 465GiB (500GB)
capabilities: partitioned partitioned:dos
configuration: ansiversion=5 signature=ebc57757
다음 명령을 사용하여 동일한 장치에 요청하면 udevadm
그것이 무엇인지 알 수 있습니다 DEVPATH
.
$ sudo udevadm info -q all -n /dev/sda | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda
이 문자열에는 장치에 대해 찾고 있는 모든 정보가 포함되어 있습니다. PCI 주소 "0000:00:1f.2"
및 SCSI 주소 "0:0:0:0"
. 이 데이터를 슬래시("/")로 구분하면 SCSI 주소는 6번째 위치의 데이터입니다.
답변2
다음을 직접 사용할 수 있습니다 -q path
.
SD=`ls /dev | grep -E "^sd[a-z]+$"`
for sd in $SD; do
sys_path=`udevadm info -q path -p /sys/block/$sd 2>/dev/null`
echo "$sd: $sys_path"
done
예제 출력:
sda: /devices/pci0000:00/0000:00:01.0/0000:01:01.0/ata1/host0/target0:0:0/0:0:0:0/block/sda
sdaa: /devices/pci0000:04/0000:04:04.0/0000:06:01.0/ata29/host28/target28:0:0/28:0:0:0/block/sdaa
sdab: /devices/pci0000:04/0000:04:04.0/0000:06:01.0/ata31/host30/target30:0:0/30:0:0:0/block/sdab
sdac: /devices/pci0000:04/0000:04:04.0/0000:06:01.0/ata32/host31/target31:0:0/31:0:0:0/block/sdac
sdad: /devices/pci0000:04/0000:04:04.0/0000:06:01.0/ata33/host32/target32:0:0/32:0:0:0/block/sdad
sdae: /devices/pci0000:04/0000:04:04.0/0000:06:01.0/ata34/host33/target33:0:0/33:0:0:0/block/sdae
sdaf: /devices/pci0000:09/0000:09:07.0/0000:0a:01.0/ata35/host34/target34:0:0/34:0:0:0/block/sdaf