발견 된 모든 불량 블록의 블록 번호가 필요합니다 ( ddrescue
목록을 제공해야하며 저장했으면합니다 ). 이 블록을 사용하는 파일을 찾아야합니다 (예 : 여기 참조 ). 불량 블록이 많은 경우이를 스크립팅 할 수 있습니다.
e2fsck
도움이되지 않고 단지 파일 시스템 자체의 일관성을 검사하기 때문에 "관리적"파일 시스템 정보를 포함하는 불량 블록 만 작동합니다.
파일의 불량 블록은 비어 있습니다.
편집하다
좋아, 블록 크기를 알아 봅시다. 512 바이트 장치 블록으로 시험 파일 시스템을 만들어 봅시다 :
$ dd if=/dev/zero of=fs bs=512 count=200
$ /sbin/mke2fs fs
$ ll fs
-rw-r--r-- 1 dirk dirk 102400 Apr 27 10:03 fs
$ /sbin/tune2fs -l fs
...
Block count: 100
...
Block size: 1024
Fragment size: 1024
Blocks per group: 8192
Fragments per group: 8192
따라서 파일 시스템 블록 크기는 1024이고 우리는 100 개의 파일 시스템 블록 (및 200 512 바이트 장치 블록)을 가지고 있습니다. 그것을 구하십시오 :
$ ddrescue -b512 fs fs.new fs.log
GNU ddrescue 1.19
Press Ctrl-C to interrupt
rescued: 102400 B, errsize: 0 B, current rate: 102 kB/s
ipos: 65536 B, errors: 0, average rate: 102 kB/s
opos: 65536 B, run time: 1 s, successful read: 0 s ago
Finished
$ cat fs.log
# Rescue Logfile. Created by GNU ddrescue version 1.19
# Command line: ddrescue fs fs.new fs.log
# Start time: 2017-04-27 10:04:03
# Current time: 2017-04-27 10:04:03
# Finished
# current_pos current_status
0x00010000 +
# pos size status
0x00000000 0x00019000 +
$ printf "%i\n" 0x00019000
102400
따라서 16 진 ddrescue
단위는 블록이 아닌 바이트 단위입니다. 마지막으로 무엇을 debugfs
사용 하는지 봅시다 . 먼저 파일을 만들고 내용을 찾으십시오.
$ sudo mount -o loop fs /mnt/tmp
$ sudo chmod go+rwx /mnt/tmp/
$ echo 'abcdefghijk' > /mnt/tmp/foo
$ sudo umount /mnt/tmp
$ hexdump -C fs
...
00005400 61 62 63 64 65 66 67 68 69 6a 6b 0a 00 00 00 00 |abcdefghijk.....|
00005410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
따라서 데이터의 바이트 주소는 0x5400
입니다. 이것을 1024 바이트 파일 시스템 블록으로 변환하십시오 :
$ printf "%i\n" 0x5400
21504
$ expr 21504 / 1024
21
그리고 블록 범위에있는 동안 블록 범위를 시험해 봅시다 :
$ /sbin/debugfs fs
debugfs 1.43.3 (04-Sep-2016)
debugfs: testb 0
testb: Invalid block number 0
debugfs: testb 1
Block 1 marked in use
debugfs: testb 99
Block 99 not in use
debugfs: testb 100
Illegal block number passed to ext2fs_test_block_bitmap #100 for block bitmap for fs
Block 100 not in use
debugfs: testb 21
Block 21 marked in use
debugfs: icheck 21
Block Inode number
21 12
debugfs: ncheck 12
Inode Pathname
12 //foo
따라서 파일 시스템 메타 데이터가 있기 때문에 블록 0이 유효하지 않은 것을 제외하고는 예상대로 작동합니다. 그래서, 당신의 바이트 주소 0x30F8A71000
에서 ddrescue
당신은 전체 디스크가 아닌 파티션에 근무 가정, 우리는 파티션의 시작의 바이트 주소를 빼기
210330128384-7815168 * 512 = 206328762368
에 의해 것을 나누어 tune2fs
파일 시스템 블록을 얻을 블록 크기 (여러 물리적, 가능한 손상, 블록, 정확한 숫자를 배수 할 필요는 파일 시스템 블록을 구성하기 때문에 점에 유의) :
206328762368/4096 = 50373233.0
이것이 바로 테스트해야 할 블록입니다 debugfs
.