다음과 같은 불량 섹터에 대한 정보를 받았다고 가정합니다.
[48792.329933] Add. Sense: Unrecovered read error - auto reallocate failed
[48792.329936] sd 0:0:0:0: [sda] CDB:
[48792.329938] Read(10): ...
[48792.329949] end_request: I/O error, dev sda, sector 1545882485
[48792.329968] md/raid1:md126: sda: unrecoverable I/O read error
for block 1544848128
[48792.330018] md: md126: recovery interrupted.
이 섹터가 포함될 수 있는 파일을 찾는 방법은 무엇입니까? 섹터를 파일에 매핑하는 방법은 무엇입니까? 아니면 사용 가능한 파일 시스템 공간에만 매핑되는지 확인하는 방법은 무엇입니까?
매핑 프로세스는 일반적인 스토리지 스택을 처리할 수 있어야 합니다.
예를 들어 위의 예에서 스택은 다음과 같습니다.
/dev/sda+sdb -> Linux MD RAID 1 -> LVM PV -> LVM VG -> LVM LV -> XFS
그러나 물론 다음과 같이 보일 수도 있습니다.
/dev/sda+sdb -> Linux MD RAID 1 -> DM_CRYPT -> LVM PV -> LVM VG -> LVM LV -> XFS
답변1
전통적인 접근 방식은 모든 파일을 다른 곳에 복사하고 어떤 파일이 읽기 오류를 유발하는지 확인하는 것입니다. 물론 RAID 레이어의 중복으로 인해 오류가 숨겨지는 경우 이는 질문에 전혀 대답하지 않습니다.
그 외에는 수동 방법만 알고 있습니다. 이는 실제로 수행하기에는 너무 번거롭고 이러한 마법을 수행할 수 있는 도구가 있다면 들어본 적이 없으며 blktrace
View(예: View)와 같은 보다 일반적인 도구가 도움이 될지 확실하지 않습니다.
파일 시스템의 경우 filefrag
또는 를 사용하여 hdparm --fibmap
모든 파일의 블록 범위를 결정할 수 있습니다. 일부 파일 시스템은 다른 방향으로 탐색하기 위한 기능을 제공하지만(예: debugfs icheck
) 동일한 작업을 수행하는 시스템 호출을 인식하지 못하므로 블록->파일 탐색을 위한 공통 인터페이스가 없는 것 같습니다.
LVM의 경우 각 LV가 저장된 위치를 확인하려면 물리적 범위 오프셋/크기 lvs -o +devices
도 알아야 합니다 . pvs -o +pe_start,vg_extent_size
실제로 작동할 수도 있습니다 vgcfgbackup
. 이를 통해 파일 시스템 주소를 각 PV 내의 블록 주소로 변환할 수 있습니다.
LUKS의 경우 오프셋을 볼 수 있습니다 cryptsetup luksDump
.
mdadm의 경우 오프셋을 볼 수 있습니다 mdadm --examine
. RAID 수준이 1이 아닌 경우 계산도 수행해야 하며, 특히 RAID 레이아웃을 이해하여 장치의 어떤 주소가 md
어떤 RAID 구성원 장치의 어떤 블록으로 변환되는지 알아야 합니다 .
마지막으로, 파티션을 나누지 않고 디스크를 직접 사용하지 않는 한 파티션 오프셋을 고려해야 합니다.