LUKS 및 XFS를 사용하는 디스크의 어떤 파일이 불량 블록의 영향을 받는지 어떻게 확인합니까?

LUKS 및 XFS를 사용하는 디스크의 어떤 파일이 불량 블록의 영향을 받는지 어떻게 확인합니까?

내 설정은 다음과 같습니다. 파티션이 없고 LUKS1과 XFS만 있습니다.

확인을 위해 디스크 설정은 disk mount, luksFormat, luksOpen, mkfs.xfs, install, get start 입니다.

첫째, 불량 블록에는 어떤 블록 크기를 사용해야 합니까? 인 것 같다:

불량 블록에 가장 적합한 블록 크기와 블록 수를 선택하는 방법은 무엇입니까?

lsblk -o NAME,PHY-SeC /dev/sdb

결과: 4096

물리적 장치에서 불량 블록을 실행하고 있습니다. 즉:

badblocks -b 4096 /dev/sdb -sv 

불량 블록 3개를 발견했습니다.

이제 LUKS와 XFS의 조합을 정렬하여 어떤 파일이 손상되었는지 확인해야 합니다.

LUKS1 커넥터의 크기는 어떻게 되나요?

여기에 상충되는 정보가 있습니다.

cryptsetup luksDump /dev/sdb

페이로드 오프셋은 4096으로 표시되지만 블록 크기는 얼마입니까?

아마도 XFS 파일 시스템의 크기를 블록 단위로 얻을 수 있을 것입니다.

xfs_info /dev/mapper/my_data:

blocks=976754134 

('데이터' 행 아래)

badblocks는 총 블록 수를 알려줍니다.

badblocks -b 4096 /dev/sdb -sv 

Checking blocks 0 to 976754645

따라서 976754645 + 1 = 976754646 디스크의 총 블록 수입니다(올바른 경우).

976754646(불량 블록) - 976754134(xfs_info) = LUKS1 헤더에 대한 디스크 시작 부분의 512개 블록입니다.

그러나 여기에서:

https://www.smartmontools.org/wiki/BadBlockHowto

LUKS 헤더가 16MB라고 나오나요? (MiB도 되지 않을까요?) LUKS2 헤더가 16MiB인 것은 알지만 LUKS1 헤더는 잘 모르겠습니다. 위의 테스트에서 2MiB로 보이지만 cryptsetup convert디스크 시작 부분에 16MiB를 사용할 수 없다면 어떻게 그런 작업이 가능할까요? smartmontools 기사에 따르면 cryptsetup convert페이로드 오프셋의 블록 크기가 4096임을 암시하는 것 같습니다.

하지만 디스크에 어떻게 맞는지 알 수 없으므로 계속해서 4096 개수(페이로드 오프셋) * 512바이트 블록 크기 = 2MiB LUKS1 헤더 오프셋을 가정합니다.

2MiB 오프셋 / 4096 블록 크기 = LUKS1 헤더에 대한 디스크의 처음 512개 블록. 따라서 번역하려면 badblocks의 출력에서 ​​512를 빼야 할 것 같습니다.디스크진입 차단파일 시스템조각.

예를 들어, badblocks는 블록 #512가 불량이며 XFS 파일 시스템에서는 블록 #0이 될 것임을 알려줍니다.

이제 각 불량 블록에 대한 XFS 블록 번호가 있습니다.

이제 각 불량 블록에 대해 다음을 수행합니다.

xfs_db -c 'blockget -b <xfs block number>' /dev/mapper/my_data

아이노드 번호를 알려줄 것이다. 그러나 여기에 이상한 점이 있습니다. 출력이 다음과 같은 것으로 나타났습니다.

xfs_db -c 'blockget -b 21512351' /dev/mapper/my_data
setting block 3/3847384 to data
setting inode to 7589729572 for block 3/3847384
inode 7589729572 block 21512351 at offset 34534

이것은 무엇을 block 3/3847384의미 하는가?

이 inode 번호를 기록하고 파일 시스템을 다시 마운트합니다.

다음으로 파일 시스템에서 다음을 수행합니다.

find /mnt/my_data -inum <inode>

이러한 불량 블록의 영향을 받는 파일을 제공합니다.

다음으로 테스트하기 위해 다음을 수행합니다.

dd if=/path/to/file of=/dev/null iflag=direct status=progress

그러나 이것은 내가 찾은 파일에 어떤 오류도 발생하지 않았으며 불량 드라이브에서 마지막으로 rsync를 수행한 결과 io 오류가 있는 완전히 다른 파일이 표시되었습니다.할 수 있는위와 같이 dd를 사용하여 재현합니다.

그럼... 내 실수는 어디에 있나요? LUKS 헤더 크기가 잘못되었나요? 일종의 추가 오프셋을 빼야 합니까?

관련 정보