2013. 12. 19. 13:21

[Linux/Ubuntu 파일 시스템 관리] linux LVM (Logical volume manager) 관리하기

Logical volume manager(LVM)은 disk volume의 크기를 늘리거나 줄이거나 혹은 이동할 수 있게 하는 유연성을 제공한다. 또한 SAN(Storage-area networks)과 유사한 snapshot을 제공하기도 한다.


ubuntu에서는 LVM2 package를 설치($ sudo apt-get install lvm2)한뒤, 우선 volume group을 생성하고, logical volume, 그리고 physical volume을 차례로 정의해야 한다. logical volume은 logical extent로, physical volume은 physical extent로 나눠진다.


LVM을 사용하는데 있어 주요한 작업은 volume group과 logical volume을 생성하고, extent(disk 공간의 작은 조각(chunk))를 필요한 영역에 할당한다. 전통적인 파티션 방식으로 data를 백업하고 파티션을 변경한뒤 data를 다시 복사하는 전통적인 방법 대신에, LVM을 사용하면 단순히 사용하지 않는 extend를 필요한 곳에 추가만 하면 된다.


LVM volume 생성하기


우선 새로운 비어있는 disk인 /dev/sda로 부터 시작하겠다.


아래와 같이 fdisk를 이용하여 8e type, 즉, LVM 형식의 파티션을 생성한다.

~$ sudo fdisk /dev/sda

[sudo] password for greenfish: 


WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

         switch off the mode (command 'c') and change display units to

         sectors (command 'u').


Command (m for help): p


Disk /dev/sda: 42.9 GB, 42949672960 bytes

255 heads, 63 sectors/track, 5221 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0xfe80fe80


   Device Boot      Start         End      Blocks   Id  System


Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-5221, default 1): 

Using default value 1

Last cylinder, +cylinders or +size{K,M,G} (1-5221, default 5221): 

Using default value 5221


Command (m for help): t

Selected partition 1

Hex code (type L to list codes): L


 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        

 1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-

 2  XENIX root      3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-

 3  XENIX usr       40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-

 4  FAT16 <32M      41  PPC PReP Boot   85  Linux extended  c7  Syrinx         

 5  Extended        42  SFS             86  NTFS volume set da  Non-FS data    

 6  FAT16           4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .

 7  HPFS/NTFS       4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility   

 8  AIX             4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt         

 9  AIX bootable    50  OnTrack DM      93  Amoeba          e1  DOS access     

 a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O        

 b  W95 FAT32       52  CP/M            9f  BSD/OS          e4  SpeedStor      

 c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs        

 e  W95 FAT16 (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  GPT            

 f  W95 Ext'd (LBA) 55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/

10  OPUS            56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b

11  Hidden FAT12    5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor      

12  Compaq diagnost 61  SpeedStor       a9  NetBSD          f4  SpeedStor      

14  Hidden FAT16 <3 63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary  

16  Hidden FAT16    64  Novell Netware  af  HFS / HFS+      fb  VMware VMFS    

17  Hidden HPFS/NTF 65  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 

18  AST SmartSleep  70  DiskSecure Mult b8  BSDI swap       fd  Linux raid auto

1b  Hidden W95 FAT3 75  PC/IX           bb  Boot Wizard hid fe  LANstep        

1c  Hidden W95 FAT3 80  Old Minix       be  Solaris boot    ff  BBT            

1e  Hidden W95 FAT1

Hex code (type L to list codes): 8e

Changed system type of partition 1 to 8e (Linux LVM)


Command (m for help): p


Disk /dev/sda: 42.9 GB, 42949672960 bytes

255 heads, 63 sectors/track, 5221 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0xfe80fe80


   Device Boot      Start         End      Blocks   Id  System

/dev/sda1               1        5221    41937651   8e  Linux LVM


Command (m for help): w

The partition table has been altered!


Calling ioctl() to re-read partition table.

Syncing disks.

~$ sudo sfdisk -l /dev/sda


Disk /dev/sda: 5221 cylinders, 255 heads, 63 sectors/track

Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0


   Device Boot Start     End   #cyls    #blocks   Id  System

/dev/sda1          0+   5220    5221-  41937651   8e  Linux LVM

/dev/sda2          0       -       0          0    0  Empty

/dev/sda3          0       -       0          0    0  Empty

/dev/sda4          0       -       0          0    0  Empty

~$


이제 /dev/sda1에 새로운 pvcreate 명령으로 LVM physical volume을 생성하고, pvs 명령으로 physical LVM volume에 대한 정보를 구해 보자.

~$ sudo pvcreate /dev/sda1

  Physical volume "/dev/sda1" successfully created

~$ sudo pvs

  PV         VG   Fmt  Attr PSize  PFree 

  /dev/sda1       lvm2 --   39.99g 39.99g

~$


이제 vgcreate 명령으로 volume group을 생성하고 vgs로 현재 활성화된 volume group을 구해 본다.

~$ sudo vgcreate group_lvm_greenfish /dev/sda1

  Volume group "group_lvm_greenfish" successfully created

~$ sudo vgs

  VG                  #PV #LV #SN Attr   VSize  VFree 

  group_lvm_greenfish   1   0   0 wz--n- 39.99g 39.99g

~$


이제 lvcreate로 10G 크기의 새로운 LVM 파티션을 앞에서 만든 volume group으로 부터 생성한다. 그리고 lvs로 logical volume을 확인하고 vgs로 비어있는 공간의 크기를 구해보도록 한다.

~$ sudo lvcreate --size 10GB --name lv_greenfish group_lvm_greenfish

  Logical volume "lv_greenfish" created

~$ sudo lvs

  LV           VG                  Attr   LSize  Origin Snap%  Move Log Copy%  Convert

  lv_greenfish group_lvm_greenfish -wi-a- 10.00g

~$ sudo vgs

  VG                  #PV #LV #SN Attr   VSize  VFree 

  group_lvm_greenfish   1   1   0 wz--n- 39.99g 29.99g

~$


마지막으로 lvm 파티션을 ext4 file system으로 포맷한다.

~$ sudo mkfs.ext4 /dev/mapper/group_lvm_greenfish-lv_greenfish

mke2fs 1.41.14 (22-Dec-2010)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

655360 inodes, 2621440 blocks

131072 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=2684354560

80 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks: 

32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632


Writing inode tables: done                            

Creating journal (32768 blocks): 

done

Writing superblocks and filesystem accounting information: done


This filesystem will be automatically checked every 29 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

~$


LVM volume 사용하기


/dev/mapper로 표현되는 경로로 mount하여 사용한다.


~$ ls /dev/mapper

control  group_lvm_greenfish-lv_greenfish

~$ sudo mkdir /mnt/001

~$ sudo mount -t ext4 /dev/mapper/group_lvm_greenfish-lv_greenfish /mnt/001

~$ df -m /mnt/001

Filesystem           1M-blocks      Used Available Use% Mounted on

/dev/mapper/group_lvm_greenfish-lv_greenfish

                         10080       151      9417   2% /mnt/001

~$


이제 파일을 열거해 본다.

~$ ls /mnt/001

lost+found

~$


파일을 추가한다. 중간에 permission 오류 발생시 chown을 호출하여 소유자를 변경한다.

~$ cp examples.desktop /mnt/001

cp: cannot create regular file `/mnt/001/examples.desktop': Permission denied

~$ sudo chown greenfish /mnt/001

~$ cp examples.desktop /mnt/001

~$ dd if=/dev/zero of=/mnt/001/dummy.bin count=204800

204800+0 records in

204800+0 records out

104857600 bytes (105 MB) copied, 1.67602 s, 62.6 MB/s

~$ df -m /mnt/001

Filesystem           1M-blocks      Used Available Use% Mounted on

/dev/mapper/group_lvm_greenfish-lv_greenfish

                         10080       251      9317   3% /mnt/001

~$ md5sum /mnt/001/examples.desktop

e7444acd4d538ede466c6d6cb932c5ec  /mnt/001/examples.desktop

~$


LVM volume 늘리기


남은 공간이 모자르다면, LVM volume에 용량을 더 추가할 수 있다. 이는 lvresize 명령이면 가능하다. 이후 e2fsck로 file system을 검사해야 하고, resize2fs로 ext4 file system의 크기를 늘려줘야 한다.


우선, un-mount 상태에서 lvresize로 크기를 조정하고, e2fsck로 검사한다.

~$ sudo umount /mnt/001/

~$ sudo lvresize --size 15G /dev/mapper/group_lvm_greenfish-lv_greenfish

  Extending logical volume lv_greenfish to 15.00 GiB

  Logical volume lv_greenfish successfully resized

~$ sudo e2fsck -f /dev/mapper/group_lvm_greenfish-lv_greenfish

e2fsck 1.41.14 (22-Dec-2010)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/dev/mapper/group_lvm_greenfish-lv_greenfish: 13/655360 files (7.7% non-contiguous), 105264/2621440 blocks

~$

그릭고 아래와 같이 resize2fs를 통해 file system의 크기를 조절한다. 그리고 다시 mount하고, 크기와 기존 파일의 checksum과 비교한다.

~$ sudo resize2fs /dev/mapper/group_lvm_greenfish-lv_greenfish

resize2fs 1.41.14 (22-Dec-2010)

Resizing the filesystem on /dev/mapper/group_lvm_greenfish-lv_greenfish to 3932160 (4k) blocks.

The filesystem on /dev/mapper/group_lvm_greenfish-lv_greenfish is now 3932160 blocks long.

~$ sudo mount -t ext4 /dev/mapper/group_lvm_greenfish-lv_greenfish /mnt/001

~$ df -m /mnt/001

Filesystem           1M-blocks      Used Available Use% Mounted on

/dev/mapper/group_lvm_greenfish-lv_greenfish

                         15119       253     14098   2% /mnt/001

~$ md5sum /mnt/001/examples.desktop 

e7444acd4d538ede466c6d6cb932c5ec  /mnt/001/examples.desktop

~$


즉, 이전에 3% use에서 2% use로 변경되었으며, check sum이 유지된것으로 봐서 파일 내용에 대한 변경은 없는것이 확인된다.


LVM volume 줄이


기존의 LVM volume으로 부터 불필요한 공간을 회수하고 싶다면, 역시 lvresize 명령을 사용한다.


~$ sudo umount /mnt/001

~$ sudo e2fsck -f /dev/mapper/group_lvm_greenfish-lv_greenfish

e2fsck 1.41.14 (22-Dec-2010)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/dev/mapper/group_lvm_greenfish-lv_greenfish: 13/983040 files (7.7% non-contiguous), 126465/3932160 blocks

~$ sudo resize2fs /dev/mapper/group_lvm_greenfish-lv_greenfish 5G

resize2fs 1.41.14 (22-Dec-2010)

Resizing the filesystem on /dev/mapper/group_lvm_greenfish-lv_greenfish to 1310720 (4k) blocks.

The filesystem on /dev/mapper/group_lvm_greenfish-lv_greenfish is now 1310720 blocks long.

~$ sudo lvresize --size 5G /dev/mapper/group_lvm_greenfish-lv_greenfish

  WARNING: Reducing active logical volume to 5.00 GiB

  THIS MAY DESTROY YOUR DATA (filesystem etc.)

Do you really want to reduce lv_greenfish? [y/n]: y

  Reducing logical volume lv_greenfish to 5.00 GiB

  Logical volume lv_greenfish successfully resized

~$ sudo mount -t ext4 /dev/mapper/group_lvm_greenfish-lv_greenfish /mnt/001

~$ df -m /mnt/001

Filesystem           1M-blocks      Used Available Use% Mounted on

/dev/mapper/group_lvm_greenfish-lv_greenfish

                          5040       248      4536   6% /mnt/001

~$


LVM Logical Volume과 Group 삭제하기


다음과 같이 삭제한다.

~$ sudo lvremove /dev/mapper/group_lvm_greenfish-lv_greenfish

Do you really want to remove active logical volume lv_greenfish? [y/n]: y

  Logical volume "lv_greenfish" successfully removed

~$ sudo vgremove group_lvm_greenfish

  Volume group "group_lvm_greenfish" successfully removed

~$