ext4 수퍼 블록 복구


47

최근에 내 외장 하드 드라이브 인클로저에 장애가 발생했습니다 (하드 드라이브 자체가 다른 인클로저에서 켜집니다). 그러나 결과적으로 EXT4 파일 시스템이 손상되었습니다.

드라이브에는 단일 파티션이 있으며 GPT 파티션 테이블 (레이블이있는 ears)을 사용합니다.

fdisk -l /dev/sdb 보여줍니다 :

   Device Boot      Start         End      Blocks   Id  System
     /dev/sdb1          1  1953525167   976762583+  ee  GPT

testdisk 파티션이 손상되지 않았 음을 나타냅니다.

1 P MS Data                     2049 1953524952 1953522904 [ears]

...하지만 파티션을 마운트하지 못했습니다 :

$ sudo mount /dev/sdb1 a
mount: you must specify the filesystem type
$ sudo mount -t ext4 /dev/sdb1 a 
mount: wrong fs type, bad option, bad superblock on /dev/sdb1,

fsck 잘못된 수퍼 블록을보고합니다.

$ sudo fsck.ext4 /dev/sdb1            
e2fsck 1.42 (29-Nov-2011)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/sdb1

e2fsck유사한 오류를보고합니다 :

$ sudo e2fsck /dev/sdb1        
Password: 
e2fsck 1.42 (29-Nov-2011)
e2fsck: Superblock invalid, trying backup blocks...
e2fsck: Bad magic number in super-block while trying to open /dev/sdb1

dumpe2fs 또한:

$ sudo dumpe2fs /dev/sdb1                      
dumpe2fs 1.42 (29-Nov-2011)
dumpe2fs: Bad magic number in super-block while trying to open /dev/sdb1

mke2fs -n(주, -n)는 수퍼 블록을 반환합니다.

$ sudo mke2fs -n /dev/sdb1       
mke2fs 1.42 (29-Nov-2011)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
61054976 inodes, 244190363 blocks
12209518 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
7453 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000, 214990848

...하지만 각 블록에 대해 "e2fsck -b [block]"을 시도하면 실패합니다.

$ sudo e2fsck -b 71663616 /dev/sdb1 
e2fsck 1.42 (29-Nov-2011)
e2fsck: Invalid argument while trying to open /dev/sdb1

그러나 내가 이해하는 것처럼, 이것이 파일 시스템이 만들어 졌을 때 수퍼 블록이 있었던 곳이며, 이것이 여전히 그대로 있다는 것을 의미하지는 않습니다.


누군가 로그를 해독 할 수 있다면 testdisk 깊은 검색을 실행했습니다 . 다음과 같은 많은 항목을 언급합니다.

recover_EXT2: s_block_group_nr=1/7452, s_mnt_count=6/20,
s_blocks_per_group=32768, s_inodes_per_group=8192
recover_EXT2: s_blocksize=4096
recover_EXT2: s_blocks_count 244190363
recover_EXT2: part_size 1953522904
recover_EXT2: "e2fsck -b 32768 -B 4096 device" may be needed

해당 값으로 e2fsck를 실행하면 다음이 제공됩니다.

e2fsck: Bad magic number in super-block while trying to open /dev/sdb1

나는 모든 수퍼 블록으로 그것을 시도했다. testdisk.log

for i in $(grep e2fsck testdisk.log | uniq | cut -d " " -f 4); do
   sudo e2fsck -b $i -B 4096 /dev/sdb1
done

... 모두 같은 e2fsck오류 메시지가 나타납니다.


마지막 시도에서 다른 파일 시스템 오프셋을 시도했습니다. 각 오프셋 i에 대해 i31744, 32768, 1048064, 1049088 중 하나입니다.

$ sudo losetup -v -o $i /dev/loop0 /dev/sdb

... 그리고 달리기 testdisk /dev/loop0, 나는 재미있는 것을 찾지 못했습니다.


상당히 철저했지만, 저수준 파일 복구 도구 ( / )에 의존하지 않고 파일 시스템을 복구 할 수 있는 방법 이 있습니까?foremostphotorec


무엇을 sudo fdisk -l /dev/sdb보여줍니까?
Karlson

4
나는 당신이 슈퍼 블록의 모든 사본을 지울만큼 운이 없다고 스스로 믿을 수 없습니다 . 따라서 파티션 테이블에 문제가있어 파일 시스템에서 논리 블록 오프셋을 제거하여 fsck가 대체 수퍼 블록을 찾을 수 없게합니다.
Kyle Jones

이 디스크에 LVM이 없습니까? 이전과 동일한 유형 (같은 블록 크기 등)의 외장 인클로저가 있습니까?
Jan Marek

1
작성자의 조언에 따라 @KyleJones는 testdisk전술 한 바와 같이, I를 사용하는 다른 시도 오프셋 losetup( i * 512여기서, i62, 64, 2047 또는 2049이다).
tlvince

@JanMarek 아니오, 불행히도 LVM은 없습니다. 인클로저는 표준 3.5 "디스크가 들어있는 디스크이지만 다른 디스크 나 다른 1TB 디스크는 없습니다.
tlvince

답변:


15

불행히도 파일 시스템을 복구 할 수 없었고 , Sleuth Kit 가 가장 유용한 것으로 입증 된 하위 수준의 데이터 복구 기술 (우분투의 데이터 복구 위키 항목 에 잘 요약되어 있음 )을 사용해야했습니다 .

청결을 위해 답변으로 표시합니다.


8

이미 구식 일 수도 있지만 몇 가지 제안 사항이 있습니다.

에서 주장한대로 원래 블록 크기가 4096임을 확실히 확신하는 경우을 testdisk사용하여 디스크의 수퍼 블록을 다시 작성할 수 있습니다 mke2fs -S. 남자에서 :

   -S    Write  superblock and group descriptors only.  This is useful if all
          of the superblock and backup superblocks are corrupted, and a  last-
          ditch  recovery method is desired.  It causes mke2fs to reinitialize
          the superblock and group descriptors, while not touching  the  inode
          table and the block and inode bitmaps.  The e2fsck program should be
          run immediately after this option is used, and there is no guarantee
          that  any  data  will be salvageable.  It is critical to specify the
          correct filesystem blocksize when using this option, or there is  no
          chance of recovery.

올바른 블록 크기에 대해 잘 모르면 mke2fs -n -b 2048 /dev/sdb1이 명령이 제공하는 모든 수퍼 블록 백업을 사용 하고 그 이후에는 마지막 블록 크기 1024를 사용하십시오.


0

언급 한 바와 같이, 구식이지만 fdisk (AFAIK)는 GPT 디스크를 지원하지 않습니다. 부분 또는 다른 도구를 사용해야합니다.

방금 Debian squeeze (커널 2.6.32-5-486)를 실행하는 가상 머신을 테스트하고 parted를 사용하여 가상 디스크를 GPT로 포맷했습니다 ...

# parted /dev/sde
(parted) mklabel GPT
(parted) mkpart part1 0 10G
(parted) quit
# fdisk -l /dev/sde
.
WARNING: GPT (GUID Partition Table) detected on '/dev/sdb'! The util fdisk doesn't support GPT. Use GNU Parted.
.
Disk /dev/sde: 85.9 GB, 85899345920 bytes
 255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
. 
   Device Boot      Start         End      Blocks   Id  System
/dev/sde1               1       10444    83886079+  ee  GPT

이것은 fdisk 버전 2.17.2 (util-linux-ng)입니다.

mkfs와 fsck는 '실제'파티션을 선택해야합니다. 그러나 GPT 파티션 테이블이 손상되지 않았는지 확인하려면 GNU parted를 사용해야합니다.


0

컴퓨터를 재부팅 한 후에도 동일한 마운트 문제가 발생했습니다. 내 경우에는 parted를 실행하고 다음과 같은 명령을 실행하기에 충분했습니다.

set 1 lvm on

그런 다음 종료하고 다시 마운트하십시오. 어쩌면 그것은 또한 당신을 도울 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.