ddrescue 복구 시도를 통해 손실 된 파일을 어떻게 알 수 있습니까?


6

1TB 오류가 발생한 드라이브에서 데이터를 복구 하는 중입니다 (하드 디스크 교체 절차 에서 질문 했습니까? ). 나는 ddrescue191 오류에서 557568 B의 결과 오류 크기를 가진 시스템 구조 USB에서 수행 했을 것입니다 /home.

이제 내가 본 몇 가지 가이드 e2fsck는 새 디스크에서 수행 할 것을 제안 하며, 어떤 파일을 저장할 수 없는지 아는 효과에 따라 일부 파일에 "빈 섹터 / 블록"이 할당되어 있음을 알 수있었습니다. 완전한. 그러나 전혀 오류가 발견 -y되지 않았습니다 (아무 것도 놓치지 않도록 오류없이 실행했습니다 ). 이제으로 다시 실행 -c하지만 95 %에서는 지금까지 오류가 발견되지 않았습니다. 필자는 해당 소프트웨어로 파일을 열거 나 Linux Mint가 필요로 할 때까지 감지 할 수없는 내부에 0 또는 임의의 조각이있는 정상적인 파일이있는 새 드라이브가 있다고 생각합니다.

손상된 파일 목록을 얻기 위해 이전 / 새 드라이브로 무엇을 할 수 있습니까? 191이 파일을 가로 질러 갈 수 있기 때문에 얼마나 많은지 알 수 없지만 적어도 총 크기는 크지 않습니다. 나는 대부분 오래된 가족 사진과 비디오 (각각 1MB 이상)에 대해 우려하고 있으며 나머지는 관련이 없거나 최근에 백업되었습니다.

업데이트 : e2fsck의 새로운 패스는 아무것도 이해하지 못하는 새로운 것을 제공했습니다.

Block bitmap differences:  +231216947 +(231216964--231216965) +231216970 +231217707 +231217852 +(231217870--231217871) +231218486
Fix<y>? yes
Free blocks count wrong for group #7056 (497, counted=488).                    
Fix<y>? yes
Free blocks count wrong (44259598, counted=44259589).
Fix<y>? yes

여기저기서 읽은 내용에서 "블록 비트 맵 차이"항목을 이해하지만 손상된 파일을 찾는 문제에 사용할 수 있는지 이해하지 못합니다.
David Sevilla

발견 된 모든 불량 블록의 블록 번호가 필요합니다 ( ddrescue목록을 제공해야하며 저장했으면합니다 ). 이 블록을 사용하는 파일을 찾아야합니다 (예 : 여기 참조 ). e2fsck도움이되지 않습니다, 나쁜 블록은 이제 비어 있습니다.
dirkt

그것이 생성하는 맵 파일을 의미한다면 나는 그렇게합니다. 의견을 수락 할 수 있도록 답변으로 작성 하시겠습니까?
David Sevilla

이 Q를 보시고 그 사용법은 ddrutility당신이 원하는 것을 거의 수행합니다 : askubuntu.com/q/904569/271
Andrea Lazzarotto

답변:


3

발견 된 모든 불량 블록의 블록 번호가 필요합니다 ( 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.


큰. 이제 그 숫자를 알아내는 데 약간의 도움이 필요합니다 (첫 번째 시도는 나에게 유용한 것을 제공하지 않습니다). 필요한 경우 주위를 둘러보고 새로운 질문을 열 것입니다. 그러나 먼저 debugfs새 디스크 대신 오래된 디스크에 문제를 해결 해야 합니까?
David Sevilla

아니요, 새로운 담당자를 사용하십시오. 이미지를 만든 경우 파일을 식별하기 전에 새 디스크를 마운트하지 말고 변경하십시오.
dirkt

알았어. 이제 ddrescue로그 파일 의 이진 숫자 와 파티션의 블록 (디스크의 첫 번째가 아닌) 간의 대응 관계를 파악해야합니다 . 당신이 제안한 페이지는 좋은 시작이지만, 나는 거기에 말한 것보다 더 많은 것을해야합니다.
David Sevilla

파티션 시작의 블록 번호 등이 필요 fdisk하며 절대 블록 번호에서 빼십시오.
dirkt

글쎄, 전에 시도해 보았습니다 ... fdisk시작 = 7815168, 첫 번째 "-"블록의 ddrescue0x30F8A71000이지만 빼기는 210322313216을 제공합니다 testb. "/ dev / sc5의 경우 잘못된 블록 번호 ..." 또한 그 위치를 512 (= 0x200) 또는 4096 (= 0x1000)으로 나누려고했습니다 (다른 위치는 1000의 배수가 아니고 200에 불과하므로 후자는 의미가 없습니다). 어떻게 든 유닛을 엉망으로 생각합니다.
David Sevilla

1

가장 빠르거나 가장 효율적인 방법은 아니지만 가장 쉬운 방법은 다음과 같습니다.

  1. ddrescue를 정상적으로 실행하여 전체 드라이브를 구출 하고 mapfile보존하십시오 .
  2. 유효 ddrescue하지 않은 섹터를 고유 한 패턴으로 표시하려면 채우기 모드에서 다시 실행하십시오. 그들은 다음과 같은 것을 권장합니다.
    ddrescue --fill-mode=- <(printf "BAD-SECTOR ") outfile mapfile
    오 탐지를 완화하기 위해 일반적으로 파일에 존재하지 않는 패턴을 사용하려고합니다.
  3. 복구 된 이미지 / 디스크를 기본 운영 체제로 마운트하십시오.
  4. e2fsck파일 시스템 디렉토리 구조를 확인하고 복구하려면 Linux 와 같은 적절한 운영 체제 유틸리티를 사용하십시오 . 파일 시스템 구조에 속하는 불량 섹터는 먼저 모든 파일 손상을 찾기 전에 해결해야합니다.

    디렉토리 구조를 복구하는 것은 예술이며이 답변 범위를 벗어난 자체입니다.

  5. 운영 체제에서 제공하는 적절한 유틸리티를 사용 grep하여 파일 시스템의 모든 파일을 스캔하고 채우기 모드로 표시 한 고유 패턴이 포함 된 파일을 나열하십시오.
  6. 필요한 경우 적절한 편집기를 사용하여 파일을 검사하여 파일 내에서 고유 한 패턴을 검색하여 실제 데이터 손실 위치를 찾을 수 있습니다.

이것은 운영 체제에 독립적이므로 특정 파일 시스템 유형에 따라 다른 세부 정보를 의도적으로 제공하지 않습니다. 먼저 Windows 유틸리티를 사용하여 NTFS 파일 시스템 에서이 작업을 수행해야했지만 ext3 / 4 등에서 동일한 아이디어입니다.


0

NTFS, ext3, ext4

로 페일 {ing, ed} 드라이브에서 데이터를 복사 한 후을 ddrescue사용 ddrutility하여 영향을받는 파일 이름을 찾으십시오.

ddrescue20 초 안에 맵 파일이 제공된 1TB 파티션의 영향을받는 NTFS 파일을 나열하는 데 성공했습니다 .

로그 파일을 현재 디렉토리에 기록합니다.

링크 된 페이지는 NTFS, ext3 및 ext4에 대한 지원을 언급합니다.

btrfs, zfs

이러한 파일 시스템에는 자체 내장 scrub기능이 있습니다.


-2

Filezilla를 간단하게 사용하고 문제를 해결했습니다. 정기적 인 Filezilla를 사용하여 모든 양호한 데이터를 백업하십시오. 하나의 큰 파일이 올바르게 복사되지 않은 것으로 나타났습니다 (중간에 중단하고 전송을 다시 시작 함). 운 좋게 같은 파일의 이전 백업이 있습니다. 디스크를 복제하려면이 절차를 사용하여 디스크에서 불량 블록을 찾아야했습니다.

먼저 fdisk -l을 사용하여 HD 정보를 식별하는 문제 디스크를 찾으십시오.

두 번째로 디스크가 / dev / sdb 라고 말하면 badblocks -v / dev / sdb 명령을 실행해야 드라이브의 모든 불량 블록이 나열됩니다. 다행히 몇 가지가있을 것입니다. 불량 블록이 없으면 드라이브 블록에 문제가 없으며 다른 것을 알아 내야합니다. 내 블록 크기는 512이므로 기본 번호를 사용하여 DD를 실행합니다.

세 번째 각 블록은 512 크기이므로 bs = 512를 설정하는 것입니다.

항상 DD를 정기적으로 실행할 때마다 오류 후 데이터가 손상됩니다. https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html 페이지에 설명 된대로 매개 변수를 사용하여 "실패한 디스크"부분을 검색하십시오.

dd if=/dev/sdb of=/dev/sda bs=512 conv=noerror,sync iflag=fullblock 

시간이 걸렸습니다. 각 불량 블록에는 결함이있는 드라이브에서 두드리는 소리가 들렸습니다. 그것은 블록별로 복사하고 모든 나쁜 블록을 통해 같은 소음을 냈습니다. 소음이 발생한 횟수는 다른 불량 블록을 발견하고 표시 오류 메시지에 대해 알려주기 때문입니다. 뭐라고 '전환 = NOERROR, 동기화' 수행, 패드 밖으로 나쁜이다는 동안, NUL을 함께 읽는 'iflag = fullblock' 짧은 읽기를 충족시켜줍니다 만, 끝까지 동기화 데이터를 유지합니다. 전혀 손상이 없으며 결함있는 블록을 복사하지 않고 빈 NUL로 채 웁니다.

DD로 복사 한 후, 나는 과거 백업에서 Filezilla를 되 돌리는 나쁜 파일을 교체하고 모든 것이 잘 작동했습니다. 결함이있는 드라이브를 백업하려는 다른 사람들에게 유용 할 수 있기를 바랍니다.

참고 : 내 나쁜 블록은 서로 매우 가까운 곳에 있습니다. 불량이 감지 된 그룹에서 한 번에 약 4 개의 블록. 블록이 디스크 전체에있는 경우 여러 파일이 영향을받을 수 있습니다. 운 좋게도, 제 경우에는 큰 데이터베이스 4GB 파일 만 영향을 받았습니다.


1
Filezilla를 사용해도 질문에 대답하지 않습니다. 또한 지정하는 옵션은 dd실제로 데이터를 변경하는 것입니다 (복사중인 손상된 데이터를 채 웁니다). 이것은이 질문에 대한 답변이 아니며, 사본을 작성하는 올바른 방법이 아닙니다.
역설

예, 여러 번 다운로드하거나 다시 시도하지 않아 손상된 파일을 파악합니다. 그렇게하면 서버에서 내 워크 스테이션으로 파일을 복사 할 수 없어서 알아낼 수 있습니다. 하나의 파일 만 다운로드 할 수 없었으며 동일한 파일에서 실패한 재시도 횟수가 많습니다. 그래서 그것은 나를 위해 일했습니다. 그리고 다른 사람들을 위해 일할 수 있습니다. 이제 파일을 교체하는 것만으로도 행복합니다. 전체 시스템이 실행 중입니다
Luis H Cabrejo

1
그 질문에 대한 대답은 주제에 맞지 않습니다. 이야기의 끝. 그것이 당신을 위해 일하게 된 것을 기쁘게 생각하지만 이것은 문제가 아닙니다 . 블로그 나 Reddit 스레드가 아니므 로 행동 강령답변 방법을 참조하십시오 .
역설

내가 말한 것처럼 dd언급 한 플래그가 있더라도 conv=noerror,sync iflag=fullblock이것은 원시 사본이 아닙니다. 따라서이를 "부패"또는 다른 것으로 부르십시오. 그러나 원래가 아닌 임의의 값으로 채워 져야하는 최종 데이터는 이러한 데이터를 기존 데이터와 다르게 만듭니다. 패딩 된 값의 절반으로이 방법으로 검색 한 사진을 상상한다고 상상해보십시오. 그렇다면, 당신은 무엇을하고 있는지 이해하지 못합니다. 이것은 간단합니다.
역설

손상된 파일은 이미 파악되었습니다. 나는 그 파일에 패딩을 기대하고 있었다. 나머지 파일들은 완벽하게 복사되었습니다. 패딩으로 드라이브 사본을 사용하고 백업 할 수 있었으므로 다른 드라이브로 완전히 복사하십시오. 그 파일에 대해별로 신경 쓰지 않았지만 이미 백업했습니다. 내 filezilla가 백업을 수행하기 위해 파일을 읽을 수 없으므로 시간이 초과 될 때까지 다시 시도했기 때문에 어떤 파일이 손상되었는지 이미 알고 있습니다. 문제는 손상된 파일을 파악할 수 있었으며 실제로 상식과 규칙적인 filezilla를 사용하여 파일을 작성하는 것입니다.
Luis H Cabrejo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.