linux system에서 partition table을 자주 날려 먹을때가 있다.

그래서 이것을 복구하는 방법을 간단히 소개해볼까 한다.

superblock 이 깨진 경우에는 다음을 따라한다.

ext2, ext3 인경우

fsck -b 32768 /dev/sdb1

이런식으로 백업되어 있는 확장 블럭인 block 속의 superblock으로 깨진 superblock을 복구한다.

이것은 block size가 4096(4K)인 경우이다.

block size가 4K인경우 backup된 superblock 위치

1st : 32768

2nd : 98304

3rd : 163840

4th : 229376

5th : 294912

6th : 819200

7th : 884739

8th : 1605632

xfs

xfs_repair -f /dev/sdb1

이렇게 하면 자동으로 superblock의 위치를 검색해서 복구를 해준다.

partition table을 실수로 지웠을경우

fdisk -l   /dev/sdb

Disk /dev/sdb: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device      Boot    start        end        blocks    id   system

/dev/sdb1                1          37        297171    83   Linux

/dev/sdb2              38         646      4891792+   83   Linux

/dev/sdb3             647       1044      3196935     82  Linux swap / Solaris

이 파티션 테이블을 백업을 해두거나 적어두었다면 문제가 되지 않으나 안했다면 복구를 해야한다. 다음처럼 정보를 모아 계산해서 해준다.

테이블 삭제하기

dd if=/dev/zero of=/dev/sdb bs=512 count=1

삭제했으면 시스템 재부팅하지 말고 백업을 한후에 복구작업을 하고나서 필요하면 재부팅을 해주는것이 좋다.

정보 모으기

df -h 또는 cat /etc/fstab 명령어로 각 파티션이 무슨 기능인지 살펴본다.

swap 정보 찾기

cat /proc/swaps

partition table block 정보 얻기

cat /proc/partitions

major    minor       #blocks    name

      8         16       8388608    sdb

      8         16         297171    sdb1

      8         16       4891792    sdb2

      8         16       3196935    sdb3

이렇게 정보를 다 얻었으면 fdisk 명령어로 복구를 해준다.

그러기전에 fdisk 명령어는 cylinder 값으로 table을 쓰기 때문에 계산해줘야한다.

partition table을 날렸다해도 fdisk -l 로 보면 기본 정보는 뜬다.

fdisk -l   /dev/sdb

Disk /dev/sdb: 8589 MB, 8589934592 bytes

255 heads, 63 sectors/track, 1044 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

그러면 다음처럼 계산해준다.

각 device의 cylinder수는 = ( 각 device의 block수 / (총 블럭수 / cylinder 수) )

여기서 반올림으로 값을 찾아준다.

예)

총블럭/cylinder = 8035.0651

cylinder of sdb1 = 297171 / 8035.0651 = 36.984 = 37

cylinder of sdb2 = 4891792 / 8035.0651 = 608.8 = 609

그러면 sdb1은 cylinder가 1 ~ 37 이고

sdb2는 38 ~ 646 ( 37 + 609 )

sdb3은 647 ~ 1044 (끝까지)

가되므로 이값을 이용하여 fdisk /dev/sdb 를 이용하여 partition table을 새로 만들어 준다.

그러면 다음에 재부팅해도 문제없이 사용이 가능하다.

혹시 모르는 일이므로 작업후에는 partition table을 백업해두는것이 좋다.

백업하기

dd if=/dev/sdb of=sdb.table.1024 bs=1024 count=1

임의로 table 날려보기

dd if=/dev/zero of=/dev/sdb bs=512 count=1

table 복원하기

dd if=sdb.table.1024 of=/dev/sdb bs=1024 count=1

이렇게 백업해둔것을 이용하여 복원도 가능하다.

아니면 fdisk -l 정보를 문서에 적어두어도 복원이 가능하다. 위에서 한것처럼….

혹시라도 적어두지 않았어도 위에서 했던 예처럼 따라해서 복원해도 된다.

인터넷을 찾아보니 TestDisk란 application이 무척 좋다고 되어 있다.

이것은 opensource이며 공식 홈페이지(http://www.cgsecurity.org/wiki/TestDisk)도 있다고 한다.

이것은 boot sector, partition table, superblock 복구하는 좋은 프로그램이라고 한다.

이것이 지원하는 파일 시스템은 아래와 같다고 한다.

BeFS ( BeOS )

BSD disklabel ( FreeBSD/OpenBSD/NetBSD )

CramFS, Compressed File System

DOS/Windows FAT12, FAT16 and FAT32

HFS, HFS+ and HFSX, Hierarchical File System

JFS, IBM's Journaled File System

Linux ext2 and ext3

Linux LUKS encrypted partition

Linux RAID md 0.9/1.0/1.1/1.2

RAID 1: mirroring

RAID 4: striped array with parity device

RAID 5: striped array with distributed parity information

RAID 6: striped array with distributed dual redundancy information

Linux Swap (versions 1 and 2)

LVM and LVM2, Linux Logical Volume Manager

Mac partition map

Novell Storage Services NSS

NTFS ( Windows NT/2000/XP/2003/Vista/2008 )

ReiserFS 3.5, 3.6 and 4

Sun Solaris i386 disklabel

Unix File System UFS and UFS2 (Sun/BSD/…)

XFS, SGI's Journaled File System

그러므로 지원하는 OS역시 DOS, Windows, Linux, FreeBSD, NetBSD, OpenBSD, SunOS, MacOS가 되는것이다

Linux super block 및 파티션 복구

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다