Posted
Filed under Computer/Linux
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가 되는것이다.

2010/02/10 10:08 2010/02/10 10:08
[로그인][오픈아이디란?]