Linux RAID, LVM
- Linux RAID와 LVM에 대해 설명한다.
- Linux RAID: 리눅스 커널의 RAID 구현 소프트웨어다. 물리적인 블록 장치(=디스크)를 논리적으로 묶어, 일종의 블록장치(Multiple Devices, /dev/md)를 만든다. 예전엔 Software RAID라 명명했으나 최근 이름이 변경되었다.
- LVM: LVM(Logical Volume Manager, 논리 볼륨 매니저)은 볼륨을 관리하기 쉽도록 해주는 소프트웨어로 리눅스 커널의 일부이다. HP-UX에서 사용되던 볼륨 매니저를 기반으로 1998년 Heinz Mauelshagen에 의해 개발되었다. 하나 이상의 물리 볼륨(PV, Physical Volume, 하드디스크 또는 Software RAID로 생성한 가상 블록장치)을 묶어 볼륨 그룹(VG, Volume Group)을 생성하고, 다시 볼륨 그룹으로 논리 볼륨(LV, Logical Volume, LVM이 아닌 시스템에서는 파티션에 해당, 역시 '가상 블록장치'다)을 생성한 후, 논리 볼륨을 포맷해 사용한다. [PV → VG → LV]를 잘 기억해두기 바란다.
- LVM에는 미러링기능이 없고(LVM은 논리 볼륨을 미러링할 수 있다. 디스크 미러링이 아니다), Linux RAID에는 볼륨을 나누거나 늘이거나 줄이는 기능이 없기 때문에 두 가지를 상호 보완적으로 같이 사용한다. 이를 [LVM on RAID]라 부르며, 이 경우 [MD → PV → VG → LV]가 되는 셈이다.
- 아래의 예제는 아래와 같은 구성을 사용했다.
- OS: Ubunto Server 10.04 LTS 버전 사용. 설치시 LVM 사용하지 않음
- sda: 10GB ATA Disk
- sdb, sdc, sdd: 2GB SCSI 디스크
용량, ATA, SCSI 여부는 상관 없다. 예제를 따라하려면 3개의 여유 하드디스크가 필요하다는 의미다.
- LVM HOWTO
Linux Raid
-
mdadm 패키지 설치
root@wll ~ # apt-get install mdadm
root@wll ~ # cat /etc/mdadm/mdadm.conf
...
-
Linear RAID 생성
root@wll:~# mdadm --create --verbose /dev/md0 --level=linear --raid-devices=2 /dev/sdb /dev/sdc
mdadm: chunk size defaults to 64K
mdadm: array /dev/md0 started.
root@wll:~# cat /proc/mdstat
Personalities : [linear]
md0 : active linear sdc[1] sdb[0]
4194176 blocks 64k rounding
unused devices: <none>
-
RAID 0 생성
root@wll:~# mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: array /dev/md0 started.
root@wll:~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4]
md0 : active raid0 sdc[1] sdb[0]
4194176 blocks 64k chunks
unused devices: <none>
-
RAID 1 생성
root@wll:~# mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 --spare-disks=1 /dev/sdb /dev/sdc /dev/sdd
mdadm: array /dev/md0 started.
root@wll:~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sdd[2](S) sdc[1] sdb[0]
2097088 blocks [2/2] [UU]
unused devices: <none>
-
RAID 5 생성
root@wll:~# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
mdadm: array /dev/md0 started.
root@wll:~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdd[2] sdc[1] sdb[0]
4194176 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
-
상태 보기
root@wll:~# mdadm --detail /dev/md0
/dev/md0:
Version : 00.90
Creation Time : Wed Oct 13 16:51:17 2010
Raid Level : raid1
Array Size : 2097088 (2048.28 MiB 2147.42 MB)
Used Dev Size : 2097088 (2048.28 MiB 2147.42 MB)
Raid Devices : 2
Total Devices : 3
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Mon Oct 18 09:36:43 2010
State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1
UUID : cd25e116:d89492c5:442adbe2:10e49378
Events : 0.56
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
2 8 48 - spare /dev/sdd
-
생성한 레이드 삭제
root@wll:~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
-
생성한 RAID 디스크 사용
문서 하단에서 설명할 LVM을 사용할 수 있지만, 아래와 같이 직접 포맷해서 사용할 수도 있다. root@wll:~# mkfs -t ext3 /dev/md0
root@wll:~# mkdir /mnt
root@wll:~# mount /dev/md0 /mnt
root@wll:~# df -h /mnt
파일시스템 크기 사용됨 사용가능 사용율% 마운트 됨
/dev/md0 4.0G 73M 3.7G 2% /mnt
root@wll:~#
-
정크(Chunk) 크기
- 위에서 설명한 소프트 레이드들은 모두 기본 정크(데이터의 저장 단위) 크기를 사용했지만, 사용한 디스크와 서비스에 따라 정크 크기를 조절하고, 사용하는 파일 시스템의 블록크기 및 입출력 크기를 맞춰야 제대로된 성능이 나온다. 정크 크기는 mdadm 의 -s 옵션을 통해 설정 가능하다. [mdadm -s 64k ...]
- ext2를 예를 들자면, 32KiB 정크를 사용한 RAID의 경우, mke2fs -b 4096 -R stride=8 /dev/md0 명령을 사용하는 것이 좋다.
-
장애처리
/dev/sdb 디스크가 고장났을때, 장애를 처리하는 방법이다. root@wll:~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdd[2] sdc[1] sdb[0]
4194176 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
root@wll:~# mdadm /dev/md0 --fail /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
root@wll:~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdd[2] sdc[1] sdb[3](F)
4194176 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
unused devices: <none>
root@wll:~# mdadm /dev/md0 --remove /dev/sdb
mdadm: hot removed /dev/sdb
root@wll:~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdd[2] sdc[1]
4194176 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
unused devices: <none>
[/dev/sdb 디스크 교체]
root@wll:~# mdadm /dev/md0 --add /dev/sdb
mdadm: re-added /dev/sdb
root@wll:~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdb[0] sdd[2] sdc[1]
4194176 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
LVM
LVM2 패키지 설치
LVM2 패키지와 ReiserFS 패키지를 설치한다.
root@wll:~# apt-get install lvm2
root@wll:~# apt-get install reiserfsprogs
VG 관리
-
PV 생성
블록 장치 초기화를 의미한다. 블록 장치에 PV에서 사용할 PV UUID를 저장한다. LVM에 관리될 모든 디스크는 초기화 되어있어야 한다. root@wll:~# pvcreate /dev/sdb
Wiping software RAID md superblock on /dev/sdb
Physical volume "/dev/sdb" successfully created
root@wll:~# pvcreate /dev/sdc
Wiping software RAID md superblock on /dev/sdc
Physical volume "/dev/sdc" successfully created
root@wll:~# pvcreate /dev/sdd
Wiping software RAID md superblock on /dev/sdd
Physical volume "/dev/sdd" successfully created
root@wll:~# pvscan
PV /dev/sdb lvm2 [2.00 GiB]
PV /dev/sdc lvm2 [2.00 GiB]
PV /dev/sdd lvm2 [2.00 GiB]
Total: 3 [6.00 GiB] / in use: 0 [0 ] / in no VG: 3 [6.00 GiB]
root@wll:~# pvdisplay
--- Physical volume ---
PV Name /dev/sdb
VG Name VG_1
PV Size 2.00 GiB / not usable 1.00 GiB
Allocatable yes
PE Size 1.00 GiB
Total PE 1
Free PE 1
Allocated PE 0
PV UUID 3mCSkv-ODb9-i8h7-qLGM-POVp-az6N-CKk9le
--- Physical volume ---
...
root@wll:~#
만약 오류 발생시 0번 섹터를 초기화하고 다시 시도해 본다. root@wll:~# dd if=/dev/zero of=/dev/sdb bs=512 count=1
root@wll:~# blockdev --rereadpt /dev/hdb
-
VG 생성
PV를 생성했으면 VG를 생성할 차례다. root@wll:~# vgcreate VG_1 /dev/sdb /dev/sdc
Volume group "VG_1" successfully created
root@wll:~# vgdisplay
--- Volume group ---
VG Name VG_1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 3.99 GiB
PE Size 4.00 MiB
Total PE 1022
Alloc PE / Size 0 / 0
Free PE / Size 1022 / 3.99 GiB
VG UUID FZgrFY-AtKn-JTLf-YMQG-gkoZ-C0qN-WFd7xK
-
VG 활성화
사용하기에 앞서 생성된 VG를 활성화 한다. root@wll:~# vgchange -a y VG_1
0 logical volume(s) in volume group "VG_1" now active
-
VG에 PV추가
root@wll:~# vgextend VG_1 /dev/sdd
Volume group "VG_1" successfully extended
root@wll:~# vgdisplay
--- Volume group ---
VG Name VG_1
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size 5.99 GiB
PE Size 4.00 MiB
Total PE 1533
Alloc PE / Size 0 / 0
Free PE / Size 1533 / 5.99 GiB
VG UUID FZgrFY-AtKn-JTLf-YMQG-gkoZ-C0qN-WFd7xK
-
VG에서 PV삭제
root@wll:~# pvmove /dev/sdd
root@wll:~# vgreduce VG_1 /dev/sdd
Removed "/dev/sdd" from volume group "VG_1"
pvmove의 두번째 인자가 없으면 PV에서 사용하고 있는 익스텐드를 다른 곳으로 옮긴다.
-
VG 제거
root@wll:~# vgchange -a n VG_1
0 logical volume(s) in volume group "VG_1" now active
root@wll:~# vgremove VG_1
Volume group "VG_1" successfully removed
-
PV 삭제
root@wll:~# pvremove /dev/sdb /dev/sdc /dev/sdd
Labels on physical volume "/dev/sdb" successfully wiped
Labels on physical volume "/dev/sdc" successfully wiped
Labels on physical volume "/dev/sdd" successfully wiped
LV 관리
-
LV 생성
생성한 VG에 LV를 생성한다. root@wll:~# lvcreate -L 1g -n LV_1 VG_1
Logical volume "LV_1" created
root@wll:~# lvscan
ACTIVE '/dev/VG_1/LV_1' [1.00 GiB] inherit
root@wll:~# lvdisplay
--- Logical volume ---
LV Name /dev/VG_1/LV_1
VG Name VG_1
LV UUID DceWpk-MLbL-tGry-QVaC-CzLX-uT4A-yoekYx
LV Write Access read/write
LV Status available
# open 0
LV Size 1.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
/dev/VG_1/LV_1 이 블록장치 경로다.
-
LV 사용
root@wll:~# mkfs -t reiserfs /dev/VG_1/LV_1
root@wll:~# mount /dev/VG_1/LV_1 /mnt
root@wll:~# df -h /mnt
파일시스템 크기 사용됨 사용가능 사용율% 마운트 됨
/dev/mapper/VG_1-LV_1
1.0G 33M 992M 4% /mnt
-
LV 확장
볼륨이 사용중이면, 온라인으로 확장할 수 있는지 파일 시스템 매뉴얼을 읽어보자. 필요하다면 볼륨을 확장 한 후 FS에 맞춰 작업해줘야 할 일이 있다. root@wll:~# lvextend -L +1g /dev/VG_1/LV_1
Extending logical volume LV_1 to 2.00 GiB
Logical volume LV_1 successfully resized
root@wll:~# lvextend -L 4g /dev/VG_1/LV_1
Extending logical volume LV_1 to 4.00 GiB
Logical volume LV_1 successfully resized
ReiserFS의 경우 아래와 같이 작업한다. root@wll:~# resize_reiserfs -f /dev/VG_1/LV_1
resize_reiserfs 3.6.21 (2009 www.namesys.com)
resize_reiserfs: On-line resizing finished successfully.
root@wll:~# df -h /mnt
파일시스템 크기 사용됨 사용가능 사용율% 마운트 됨
/dev/mapper/VG_1-LV_1
4.0G 33M 4.0G 1% /mnt
ext2/ext3: unmount 후 [resize2fs /dev/VG_1/LV_1]
XFS: [xfs_growfs /mnt]
JFS: [mount -o remount,resize /mnt]
-
LV 축소
모든 FS가 축소를 지원하는 것이 아니기 때문에, 사용중인 볼륨을 축소하기 전에 FS의 매뉴얼을 확인해보자. ext3의 경우 축소가 지원되지 않는다. root@wll:~# umount /mnt
root@wll:~# resize_reiserfs -s-1G /dev/VG_1/LV_1
...
root@wll:~# lvreduce -L-1G /dev/VG_1/LV_1
WARNING: Reducing active logical volume to 3.00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce LV_1? [y/n]: y
Reducing logical volume LV_1 to 3.00 GiB
Logical volume LV_1 successfully resized
root@wll:~# mount /dev/VG_1/LV_1 /mnt
root@wll:~# df -h /mnt
파일시스템 크기 사용됨 사용가능 사용율% 마운트 됨
/dev/mapper/VG_1-LV_1
3.0G 33M 3.0G 2% /mnt
-
LV 삭제
마운트를 해제하고, LV를 삭제한다. root@wll:~# umount /mnt
root@wll:~# lvremove /dev/VG_1/LV_1
-
LV 스냅샷
스냅샷의 용도는 기본적으로 백업이다. 볼륨에 파일의 쓰기가 빈번히 일어나는 경우, 현재 상태를 백업받고 싶다면 아래와 같이 할 수 있다. root@wll:~# lvcreate -L 512m -s -n LV_1_SNAP`date "+%Y%m%d"` /dev/VG_1/LV_1
Logical volume "LV_1_SNAP20101017" created
root@wll:~# mkdir /mntbackup
root@wll:~# mount /dev/VG_1/LV_1_SNAP`date "+%Y%m%d"` /mntbackup
root@wll:~# tar cvfz mntbackup.tar.gz /mntbackup
스냅샷의 삭제는 LV를 지우는 작업과 동일하다. root@wll:~# umount /mntbackup
root@wll:~# lvremove /dev/VG_1/LV_1_SNAP`date "+%Y%m%d"`
Do you really want to remove active logical volume LV_1_SNAP20101017? [y/n]: y
Logical volume "LV_1_SNAP20101017" successfully removed
팁
LVM on RAID
- 이 문서의 내용을 응용하는 예다. Linux RAID와 LVM을 동시에 사용한다.
-
생성
Linux RAID를 사용해 [md0]를 생성하고, [md0]를 PV로 사용한다, 다시 볼륨 그룹 [VG_1]을 생성한 후, [VG_1]에 논리 볼륨 [LV_1]을 생성한다. root@wll:~# mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 --spare-disks=1 \
/dev/sdb /dev/sdc /dev/sdd
root@wll:~# mdadm --assemble /dev/md0 /dev/sdb /dev/sdc /dev/sdd
root@wll:~# pvcreate /dev/md0
root@wll:~# vgcreate VG_1 /dev/md0
root@wll:~# lvcreate -L 1G -n LV_1 VG_1
-
마운트
생성한 LV_1 볼륨을 마운트 한다. root@wll:~# mkfs -t reiserfs /dev/VG_1/LV_1
root@wll:~# mkdir /u01
root@wll:~# mount /dev/VG_1/LV_1 /u01
-
시스템 재시작
재시작 후에도 자동으로 마운트 하도록 mdadm.conf 와 fstab 을 수정한다. root@wll:~# echo "DEVICES /dev/sdb /dev/sdc /dev/sdd" > /etc/mdadm/mdadm.conf
root@wll:~# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
root@wll:~# vi /etc/mdadm/mdadm.conf
ARRAY 에서 metadata=00.90 을 metadata=0.90 으로 변경
MAILADDR xxx@example.com
root@wll:~# vi /etc/fstab
...
/dev/VG_1/LV_1 /u01 reiserfs defaults 0 0
root@wll:~# sync; reboot
재시작 후 아래와 같이 마운트 되어있는 것을 확인할 수 있다. root@wll:~# df -h /u01
파일시스템 크기 사용됨 사용가능 사용율% 마운트 됨
/dev/mapper/VG_1-LV_1
1.0G 33M 992M 4% /u01
댓글목록
등록된 댓글이 없습니다.