로그에서 다음과 같은 내용을 얻습니다.
10월 2일 22:11:21 목성 커널: [439646.093111] ata4.00: 예외 Emask 0x0 SAct 0x0 SErr 0x0 작업 0x6 10월 2일 22:11:21 목성 커널: [439646.093144] ata4.00: BMDMA 통계 0x6 10월 2일 22:11:21 jupiter 커널: [439646.093176] ata4.00: 실패한 명령: WRITE DMA EXT 10월 2일 22:11:21 목성 커널: [439646.093206] ata4.00: cmd 35/00:98:00:0d:ff/00:02:42:00:00/e0 태그 0 dma 339968 out 10월 2일 22:11:21 목성 커널: [439646.093282] ata4.00: 상태: { DRDY ERR } 10월 2일 22:11:21 주피터 커널: [439646.093306] ata4.00: 오류: { ICRC ABRT } 10월 2일 22:11:21 jupiter 커널: [439646.093353] ata4: 소프트 재설정 링크 10월 2일 22:11:21 jupiter 커널: [439646.265242] ata4.00: UDMA/133용으로 구성됨 10월 2일 22:11:21 주피터 커널: [439646.265268] ata4: EH 완료
이제 어떤 디스크를 교체해야 할지 궁금합니다. 그러나 "ataX.YZ"와 /dev/disk/ 항목 사이의 명확한 매핑을 찾을 수 없습니다.
답변1
dmesg에서 더 많은 정보를 얻어야 합니다:
dmesg | grep ata
다음과 같은 것 :
[ 2.345126] ata2.00: ATA-8: WDC WD20EARX-00PASB0, 51.0AB51, max UDMA/133
그것이 내 Wester Digital 하드 드라이브가 될 것입니다.
한 모델의 드라이브가 여러 개 있는 경우 방법은 다음과 같습니다(위의 내용이 도움이 되지 않는 경우).
SCSI 호스트에서 ata* ID로의 매핑을 찾습니다.
$ egrep "^[0-9]{1,}" /sys/class/scsi_host/host*/unique_id /sys/class/scsi_host/host0/unique_id:1 /sys/class/scsi_host/host1/unique_id:2 /sys/class/scsi_host/host2/unique_id:3 /sys/class/scsi_host/host3/unique_id:4
SCSI 호스트에서 sd* ID로의 매핑을 찾습니다.
$ ls -l /sys/block/sd* ... /sys/block/sda -> ../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda ... /sys/block/sdb -> ../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/sdb
이제 호스트* 식별자를 통해 이 두 결과를 연결할 수 있습니다. 따라서 이 경우 ata2에 문제가 발생하면 Unique_id 2 → host1을 찾은 다음 어떤 sd*가 host1 → sdb인지 찾습니다.
나는 또한 한 줄의 라이너를 생각해 내려고 노력했습니다. 그것이 견고한지는 전혀 모릅니다. 먼저 ata*를 변수로 설정해야 합니다.
FAIL=ata1
그런 다음 다음을 실행하십시오.
echo "$FAIL -> $(ls -l /sys/block/ | grep $(grep "^$(echo $FAIL | cut -c 4-)" /sys/class/scsi_host/host*/unique_id | sed "s/.*\(host[0-9]\{1,\}\).*/\1/") | awk '{print $8}')"
이는 다음과 같은 결과를 반환해야 합니다:
ata1 -> sda
답변2
일부 서버에는 하나의 scsi_host에 두 개 이상의 장치가 있습니다. 그것이 맞는지는 모르겠지만 대상별로 구별할 수 있고 나에게 효과적이라고 가정했습니다.
ls -l /sys/block/sd*
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sda -> ../devices/pci0000:00/0000:00:01.0/0000:01:00.0/host3/target3:0:0/3:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdb -> ../devices/pci0000:00/0000:00:1f.2/host6/target6:0:0/6:0:0:0/block/sdb
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdc -> ../devices/pci0000:00/0000:00:1f.2/host7/target7:0:0/7:0:0:0/block/sdc
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdd -> ../devices/pci0000:00/0000:00:1f.2/host8/target8:0:0/8:0:0:0/block/sdd
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sde -> ../devices/pci0000:00/0000:00:1f.2/host9/target9:0:0/9:0:0:0/block/sde
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdf -> ../devices/pci0000:00/0000:00:1f.2/host10/target10:0:0/10:0:0:0/block/sdf
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdg -> ../devices/pci0000:00/0000:00:1f.2/host11/target11:0:0/11:0:0:0/block/sdg
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdh -> ../devices/pci0000:00/0000:00:1c.4/0000:04:00.0/host13/target13:0:0/13:0:0:0/block/sdh
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdi -> ../devices/pci0000:00/0000:00:1c.4/0000:04:00.0/host13/target13:0:1/13:0:1:0/block/sdi
간단한 bash 스크립트:
#!/bin/bash
#inspired by http://askubuntu.com/questions/64351/how-to-match-ata4-00-to-the-apropriate-dev-sdx-or-actual-physical-disk
for d in /sys/block/sd*
do
s=`basename $d`
h=`ls -l $d | egrep -o "host[0-9]+"`
t=`ls -l $d | egrep -o "target[0-9:]*"`
a2=`echo $t | egrep -o "[0-9]:[0-9]$" | sed 's/://'`
a=`cat /sys/class/scsi_host/$h/unique_id`
echo "$s -> ata$a.$a2"
done
그리고 그것은 출력됩니다 :
sda -> ata4.00
sdb -> ata7.00
sdc -> ata8.00
sdd -> ata9.00
sde -> ata10.00
sdf -> ata11.00
sdg -> ata12.00
sdh -> ata14.00
sdi -> ata14.01
답변3
지금은 너무 늦었지만 다른 독자들을 위해... "이제 어떤 디스크를 교체해야 할지 궁금합니다."라는 귀하의 다른 질문에 답변해야 했습니다.
ICRC 오류 플래그는 거의 항상 불량 SATA 케이블과 연관되어 있으며 교체/테스트가 쉽습니다. 드라이브 전원에 결함이 있는 경우 ICRC 플래그를 올리는 것이 약간 가능합니다.
그래도 확실한 건 있다.아니요드라이브에 문제가 있다는 증거입니다! SATA 케이블을 교체하세요.