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 및 파티션 복구