Data recovery : TestDisk

http://www.cgsecurity.org/

[root@centos7 ~]# dumpe2fs /dev/mapper/vg_centos6-lv_root | grep superblock

dumpe2fs 1.42.9 (28-Dec-2013)

  Primary superblock at 0, Group descriptors at 1-4

  Backup superblock at 32768, Group descriptors at 32769-32772

  Backup superblock at 98304, Group descriptors at 98305-98308

  Backup superblock at 163840, Group descriptors at 163841-163844

  Backup superblock at 229376, Group descriptors at 229377-229380

  Backup superblock at 294912, Group descriptors at 294913-294916

  Backup superblock at 819200, Group descriptors at 819201-819204

  Backup superblock at 884736, Group descriptors at 884737-884740

  Backup superblock at 1605632, Group descriptors at 1605633-1605636

  Backup superblock at 2654208, Group descriptors at 2654209-2654212

  Backup superblock at 4096000, Group descriptors at 4096001-4096004

  Backup superblock at 7962624, Group descriptors at 7962625-7962628

  Backup superblock at 11239424, Group descriptors at 11239425-11239428

[root@centos7 ~]# e2fsck -b32768 -f -j ext3 -y /dev/sdb1

# lvscan

# pvscan

# vgchange -a y vg_centos6

# vgextend vg_centos6 /dev/hda3

# vgdisplay vg_centos6

http://tip.daum.net/openknow/13048292

lvm 명령어 사용하기
lvm을 사용하려면 먼저 lvm 관련 패키지를 설치해야 한다. 데비안에서는 다음과 같이
하면 lvm 관련 패키지가 설치된다.
apt-get install lvm
레드햇 계열 배포본을 사용한다면 ftp://ftp.gwdg.de/pub/
linux/misc/lvm/v0.8final/에서 패키지를 다운받아 설치한다.
lvm 관련 명령어는 <표 1>과 같다. 주로 사용하는 것은 create, display, scan,
remove 등이다. pvscan을 실행하면 <리스트 1>과 같이 출력된다. <리스트
1>을 보면 현재 /dev/hda3, /dev/hdd1, /dev/hdd2가 pv로, 즉 lvm(0x8e)으로
설정돼 있는 것을 알 수 있다. 또한 /dev/hda3, /dev/hdd1이 vg1이라는 볼륨 그룹으로
묶여 하나로 구성돼 있음을 알 수 있다. 자세히 살펴보면 /dev/hda3이 1.95GB이고,
/dev/hdd1이 1.95GB이다. 두개의 파티션을 합치면 약 4GB의 vg1을 형성했음을 알 수
있다. 따라서 vg1이라는 4GB의 새로운 논리적인 하드가 하나 만들어진 것이다. 또한
/dev/hdd2에는 아무 그룹도 만들어지지 않은 것을 알 수 있다.
vgdisplay를 실행하면 볼륨 그룹에 대한 자세한 내용을 알 수 있다. <리스트
2>와 같이 볼륨 그룹은 vg1이고, read/write을 할 수 있고, 크기를 조정할 수도
있으며 4GB를 사용할 수 있다. PE는 기본설정이 4MB로 설정되어 있기 때문에 1000개를
사용해야 4GB가 된다.
lvscan을 실행하면 현재 볼륨 그룹과 크기를 알 수 있다. <리스트 3>을 보면 총
3.05GB의 vg1의 그룹에 test, test1이라는 라벨명으로 각각 3GB와 120MB로 설정돼
있음을 알 수 있다.
lvdisplay를 실행해보자. 볼륨 그룹의 내의 논리적인 파티션이 될 곳의 정보가
출력된다. <리스트 4>에 나온 것처럼 볼륨 이름은 /dev/vg1/ test이고, 볼륨
그룹은 vg1이며, 읽고 쓰기가 가능하고, 크기는 2.93GB이다.
lvm 만들기
1. fdisk /dev/hdd를 실행하고 나서 l을 입력하면 <리스트 5>와 같이
파일시스템 타입이 나온다. 8e번 Linux LVM을 선택해 사용해야 한다.
선택 후 p를 누르면 정상으로 설정돼 있는 것을 알 수 있다. w로 저장하고 빠져
나오면 된다.
Command (m for help): p
Disk /dev/hdd: 255 heads, 63 sectors, 784 cylinders
Units = cylinders of 16065 * 512 bytes
Device Boot Start End Blocks Id System
/dev/hdd1 1 255 2048256 8e Linux LVM
/dev/hdd2 256 765 4096575 8e Linux LVM
/dev/hdd3 766 784 152617+ 5 Extended
/dev/hdd5 766 784 152586 82 Linux swap
2. 파티션 설정을 한 다음 PV를 만들어야 한다. pvcreate를 사용해 다음과 같이
만들어 준다. lvm을 사용하고자 하는 파티션 모두를 다음과 같이 해주면 사용할 수
있다.
# pvcreate /dev/hdd1
pvcreate -- reinitializing physical volume
pvcreate -- physical volume “/dev/hdd1” successfully created
# pvcreate /dev/hdd2
pvcreate -- reinitializing physical volume
pvcreate -- physical volume “/dev/hdd2” successfully created
3. 다음으로 볼륨 그룹을 만들어 준다. vgcreate를 사용해 /dev/hdd1와 /dev/hdd2를
vg01 그룹으로 만든다.
# vgcreate vg01 /dev/hdd1 /dev/hdd2
vgcreate -- INFO: using default physical extent size 4 MB
vgcreate -- INFO: maximum logical volume size is 255.99 Gigabyte
vgcreate -- doing automatic backup of volume group “vg01”
vgcreate -- volume group “vg01” successfully created and activated
볼륨 그룹 vg01에 대한 정보는 앞서 설명한 것과 같이 vgdisplay를 이용해 알아볼 수
있다. vgdisplay를 실행하면 볼륨 그룹 이름은 vg01로 정의하고, 읽고 쓰기와 크기
변환을 할 수 있고, 현재 5.86GB를 사용할 수 있음을 알 수 있다.
4. 다음으로는 로지컬 파티션을 만들어야 한다. 이곳에 마운트 포인터를 지정,
마운트해 데이터를 저장할 수 있다. 사용 형식은 다음과 같다.
lvcreate <크기> <로지컬 볼륨 이름> <볼륨 그룹>
-L 옵션은 크기를 MB 단위로 입력을, -l은 PE 단위로 입력을 각각 의미하며, -n은
로지컬 볼륨 이름을 나타낸다.
# lvcreate -L 1500M -n lvol1 vg01
lvcreate -- doing automatic backup of “vg01”
lvcreate -- logical volume “/dev/vg01/lvol1” successfully created
lvcreate -L 500M -n lvol2 vg01
lvcreate -- doing automatic backup of “vg01”
lvcreate -- logical volume “/dev/vg01/lvol2” successfully created
lvcreate -L 2000M -n lvol3 vg01
lvcreate -- doing automatic backup of “vg01”
lvcreate -- logical volume “/dev/vg01/lvol3” successfully created
정상적으로 만들어졌는지 알아보려면 lvscan을 사용하면 알 수 있다. lvol1에 1.46GB,
lvol2에 500MB, lvol3에 1.95GB가 만들어졌음을 알 수 있다.
# lvscan
lvscan -- ACTIVE “/dev/vg01/lvol1” [1.46 GB]
lvscan -- ACTIVE “/dev/vg01/lvol2” [500 MB]
lvscan -- ACTIVE “/dev/vg01/lvol3” [1.95 GB]
lvscan -- 3 logical volumes with 3.91 GB total in 1 volume group
lvscan -- 3 active logical volumes
5. 로지컬 볼륨을 생성한 후 파일을 저장할 수 있도록 파일시스템을 만들어야 한다.
로지컬 볼륨을 하나의 파티션이라 생각하면 된다. 기존의 파티션이랑 다른 점은
크기를 변경할 수 있다는 것이다.
6. 기존의 꽉 찬 디렉토리나 남는 디렉토리, lvm으로 바꿀 디렉토리를 다음과 같이
이름을 바꿔 준다.
# mv /home /home.old

mv /var /var.old

mv /data /data.old

이름을 바꾼 디렉토리를 다음과 같이 새로 만들어 준다.
# mkdir /home

mkdir /var

mkdir /data

새로 만든 디렉토리에 다음과 같이 마운트한다.
# mount /dev/vg01/lvol1 /home

mount /dev/vg01/lvol2 /data

mount /dev/vg01/lvol3 /var

그리고 정상적으로 만들었는지 df를 실행해 마운트돼 있는 디렉토리를 확인한다.
다음과 같이 나오면 정상이다.
# df
Filesystem 1k-blocks Used Available Use% Mounted
on
/dev/hda5 2008108 1780148 125952 94% /
/dev/vg01/lvol1 1511856 20 1435036 1% /home
/dev/vg01/lvol2 495844 13 470231 1%
/data
/dev/vg01/lvol3 2015824 20 1913404 1% /var
이상 없이 마운트했으면 old로 바꾸어 놓은 내용을 다시 복사해 원상 복귀시킨다.
cp -dpR /home.old/* /home
cp -dpR /data.old/* /data
cp -dpR /var.old/* /var
그 다음은 부팅할 때마다 마운트를 할 필요없게 /etc/fstab에 다음과 같이
추가해준다.
/dev/vg01/lvol1 /home ext2 defaults 1 2
/dev/vg01/lvol2 /data ext2 defaults 1 2
/dev/vg01/lvol3 /var ext2 defaults 1 2
이렇게 현재 시스템을 새로 포맷하지 않고 꽉 찬 디렉토리를 lvm으로 만들 수 있다.
다음은 크기 변경을 해보도록 해보겠다.
lvm을 이용한 파티션 크기 변경
볼륨 그룹 바꾸기
볼륨 그룹을 변경하기 위해서는 활성화(ACTIVE) 상태의 볼륨 그룹을
비활성화(inactive)로 만들어줘야 한다. 활성화, 비활성화는 vgchange로 바꿔주면
된다. vgchange -a n vg01이면 비활성화 한다는 의미이고, vgchange -a y는 활성화
한다는 의미다. 볼륨 그룹을 변경하는 명령어는 vgrename이다.
vgrename <기존의 볼륨 그룹 이름> <바꿀 볼륨 그룹 이름>
<리스트 8>과 같은 순서대로 하면 간단히 볼륨 그룹 이름을 바꿀 수 있다.
기존 볼륨 그룹에 파티션 추가하기
기존에 있던 볼륨 그룹의 다른 하드 디스크에 있는 파티션을 추가할 때는 vgextend를
사용해, 하드 디스크나 파티션을 추가할 수 있다. 예를 들면 /dev/hdd1에 있는
myvg라는 파티션에 /dev/hda3의 비어 있는 lvm 파티션을 합칠 경우에 사용한다. 먼저
myvg가 활성화가 되어 있지 않기 때문에 활성화해줘야 한다. 다음과 같이 활성화해
준다.
# pvscan
pvscan -- reading all physical volumes (this may take a while...)
pvscan -- inactive PV “/dev/hda3” is in no VG [1.95 GB]
pvscan -- inactive PV “/dev/hdd1” of VG “myvg” [5.86 GB / 5.86 GB free]
pvscan -- total: 2 [7.81 GB] / in use: 1 [5.86 GB] / in no VG: 1 [1.95 GB]
# vgchange -a y myvg
vgchange -- volume group “myvg” successfully activated
활성화했으면 vgextend를 사용해 myvg에 /dev/hda3을 다음과 같이 추가해 준다.
# vgextend myvg /dev/hda3
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte
vgextend -- doing automatic backup of volume group “myvg”
vgextend -- volume group “myvg” successfully extended
정상적으로 됐는지 확인하기 위해 vgdisplay을 실행해보면 같은 볼륨 그룹으로 돼
있는 것을 알 수 있다. 크기를 확인하면 다음과 같이 7.81GB로 확장됐음을 알 수
있다.
# vgdisplay myvg
--- Volume group ---
VG Name myvg
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 0
Open LV 0
MAX LV Size 255.99 GB
Max PV 256
Cur PV 2
Act PV 2
VG Size 7.81 GB
PE Size 4 MB
Total PE 2000
Alloc PE / Size 0 / 0
Free PE / Size 2000 / 7.81 GB
볼륨 그룹 나누기
vgreduce는 하나로 묶여 있던 볼륨 그룹의 파티션을 나눌 때 사용한다. 예를 들어
myvg /dev/hdd1와 /dev/hda3와 함께 묶여 있는 /dev/hda3를 따로 떼어낼 때 다음과
같이, vgreduce를 사용한다.
vgreduce <볼륨 그룹 이름> <떼어낼 물리적 파티션>
# vgreduce myvg /dev/hda3
vgreduce -- doing automatic backup of volume group “myvg”
vgreduce -- volume group “myvg” successfully reduced by physical volume:
vgreduce -- /dev/hda3
다음과 같이 /dev/hda3와 /dev/hdd1이 서로 분리됐음을 알 수 있다.
# pvscan
pvscan -- reading all physical volumes (this may take a while...)
pvscan -- inactive PV “/dev/hda3” is in no VG [1.95 GB]
pvscan -- ACTIVE PV “/dev/hdd1” of VG “myvg” [5.86 GB / 5.86 GB free]
pvscan -- total: 2 [7.81 GB] / in use: 1 [5.86 GB] / in no VG: 1 [1.95 GB]
로지컬 볼륨(파티션) 늘이고, 줄이기
로지컬 볼륨의 크기를 늘리는 방법으로는 다음과 같이 -L+100을 해주는 방법이 있다.
이렇게 하면 다음과 같이 기존의 크기에 100이 추가된다.
# lvextend -L+100 /dev/myvg/lvol2
lvextend -- extending logical volume “/dev/myvg/lvol2” to 600 MB
lvextend -- doing automatic backup of volume group “myvg”
lvextend -- logical volume “/dev/myvg/lvol2” successfully extended
다음과 같이 + 기호를 없애면 해당 숫자의 크기만큼 증가한다.
# lvextend -L900 /dev/myvg/lvol2
lvextend -- extending logical volume “/dev/myvg/lvol2” to 900 MB
lvextend -- doing automatic backup of volume group “myvg”
lvextend -- logical volume “/dev/myvg/lvol2” successfully extended
크기를 줄일 때는 lvreduce를 사용해 줄일만큼의 숫자를 지정하면 그만큼 줄어들게
된다. 크기를 줄일 때는 기존의 데이터가 저장돼 있을 경우를 대비, 정말로 크기를
줄일 것인지를 확인하고 줄이게 되어 있다. 만약 데이터가 저장돼 있는 이상만큼
줄어들게 되면, 기존의 데이터는 당연히 삭제된다. 크기를 줄일 때는 주의해 줄이기
바란다.
# lvreduce -L-300 /dev/myvg/lvol2
lvreduce -- WARNING: reducing active logical volume to 600 MB
lvreduce -- THIS MAY DESTROY YOUR DATA
lvreduce -- do you really want to reduce “/dev/myvg/lvol2”? [y/n]: y
lvreduce -- doing automatic backup of volume group “myvg”
lvreduce -- logical volume “/dev/myvg/lvol2” successfully reduced
다음과 같이 하면 크기가 300MB로 줄일 수 있다.
# lvreduce -L300 /dev/myvg/lvol2
로지컬 볼륨(파티션) 이름 바꾸기
로지컬 볼륨 이름을 바꾸려면 활성화 상태를 비활성화로 바꿔줘야 한다. 다음과 같이
비활성화로 바꿔준다.
# lvchange -an /dev/myvg/lvol1
lvchange -- logical volume “/dev/myvg/lvol1” changed
lvchange -- doing automatic backup of volume group “myvg”
로지컬 볼륨의 이름을 변경한다.
lvrename <기존의 로지컬 볼륨> <새로운 볼륨 이름>
# lvrename /dev/myvg/lvol1 /dev/myvg/label1
lvrename -- doing automatic backup of volume group “myvg”
lvrename -- logical volume “/dev/myvg/lvol1” successfully renamed to
“/dev/myvg/label1”
다음으로 비활성화 상태의 로지컬 볼륨을 활성화로 바꿔 준다.
# lvchange -ay /dev/myvg/label1
lvchange -- logical volume “/dev/myvg/label1” changed
lvchange -- doing automatic backup of volume group “myvg”
확인해보면 다음과 같이 바뀐 것을 알 수 있다.
# lvscan
lvscan -- ACTIVE “/dev/myvg/label1” [1.46 GB]
lvscan -- ACTIVE “/dev/myvg/lvol2” [600 MB]
lvscan -- ACTIVE “/dev/myvg/lvol3” [1.95 GB]
lvscan -- 3 logical volumes with 4 GB total in 1 volume group
lvscan -- 3 active logical volumes
스왑 로지컬 볼륨 만들기
다음과 같이 스왑 로지컬 볼륨을 만든다.
lvcreate -L256M -n swap1 myvg
mkswap /dev/myvg/swap1
swapon /dev/myvg/swap1
부팅할 때 자동으로 마운트하기 위해 /etc/fstab에 다음을 추가해주면 된다.
/dev/myvg/swap1 sw swap defaults 0 0
루트 파티션까지 마운트하려면 램드라이브를 만들어 주면 파티션 전체를 로지컬
볼륨으로 사용할 수 있다. 다음과 같이 lvmcreate_initrd를 실행하면 /boot/initrd.
gz라는 파일이 생긴다.
# lvmcreate_initrd
Logical Volume Manager 0.8 by Heinz Mauelshagen 06/08/1999
lvmcreate_initrd -- this script creates a LVM initial ram disk in
/boot/initrd.gz
lvmcreate_initrd -- making ram filesystem
위와 같이 실행한 후에는 <리스트 9>와 같이 /etc/lilo.conf를 수정해줘야
한다.
위에서 보는 것과 같이 initrd=/boot/initrd.gz라는 파일을 읽을 수 있게 한 줄을
추가해주면 되고, 저장하고 나서 lilo를 실행해주면 된다. 그 다음으로 /etc/fstab을
다음과 같이 수정한다.
/dev/myvg/label1 / ext2 defaults 0 1