UNIX/Redhat

LVM - 솔라리스에서 RAID 사용 및 VG 활성화, VG제거, PV삭제, LV스냅샷, LV축소

99iberty 2012. 8. 28. 13:22


http://www.solanara.net/solanara/lvm



 

Linux RAID, LVM - WindyHana's Solanara

목차

개요

  • 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
    

  • VG 이전

    wll 시스템의 디스크를 wll2 시스템으로 이전하는데 필요한 작업이다. vgexport, vmimport 를 사용한다.
    root@wll:~# unmount /mnt
    root@wll:~# vgchange -a n VG_1
    root@wll:~# vgexport VG_1
    디스크를 전부 wll2 시스템으로 이전
    root@wll2:~# pvscan
    root@wll2:~# vgimport VG_1
    root@wll2:~# vgchange -a y VG_1
    root@wll2:~# mount /dev/VG_1/LV_1 /mnt
    

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
    


'UNIX > Redhat' 카테고리의 다른 글

12/08/29 10장   (0) 2012.08.29
12/08/28 6장 인증 관리  (0) 2012.08.28
12/08/28 5장 계정 관리  (0) 2012.08.28
12/08/28 4장 논리 볼륨 관리  (0) 2012.08.28
12/08/28 3장 iSCSI 저장소에 액세스  (0) 2012.08.28