EC2に複数EBSを束ねたLVMボリュームを作成し,後からEBS追加して容量拡張する方法

サマリ

以下の手順でLVMボリュームの作成,追加ができる.

$ sudo apt-get install lvm2
# PV作成
$ sudo pvcreate /dev/xvdf
$ sudo pvcreate /dev/xvdg
# VG作成
$ sudo vgcreate vg1 /dev/xvdf /dev/xvdg
# LV作成
$ sudo lvcreate -L 1.99G -n lv1 vg1
# ファイルシステム構築 & mount
$ sudo mkfs -t ext4 /dev/vg1/lv1
$ sudo mount /dev/vg1/lv1 /data
# 追加ディスクのPV作成
$ sudo pvcreate /dev/xvdh
# VGに追加PVを追加
$ sudo vgextend vg1 /dev/xvdh
# LVを拡張
$ sudo lvextend -l +100%FREE /dev/vg1/lv1
# ファイルシステムを拡張
$ sudo resize2fs /dev/vg1/lv1

事前準備

EC2セットアップ

EC2にDebian (Wheezy 7.5)のインスタンスを立てる. 今回はami-b53570b4を利用. 1GBのEBSを3つ用意. 最初に2つで組んだ後,もう一つを追加する.

  • /dev/sdf
  • /dev/sdg
  • /dev/sdh

必要なパッケージをインストール

$ sudo apt-get update
$ sudo apt-get install lvm2

LVMボリュームの作成手順

物理ボリューム(PV)作成

$ sudo pvcreate /dev/xvdf
  Writing physical volume data to disk "/dev/xvdf"
  Physical volume "/dev/xvdf" successfully created
$ sudo pvcreate /dev/xvdg
  Writing physical volume data to disk "/dev/xvdg"
  Physical volume "/dev/xvdg" successfully created
$ sudo pvscan
  PV /dev/xvdf                      lvm2 [1.00 GiB]
  PV /dev/xvdg                      lvm2 [1.00 GiB]
  Total: 2 [2.00 GiB] / in use: 0 [0   ] / in no VG: 2 [2.00 GiB]

ボリュームグループ(VG)作成

$ sudo vgcreate vg1 /dev/xvdf /dev/xvdg 
  Volume group "vg1" successfully created
$ sudo vgs
  VG   #PV #LV #SN Attr   VSize VFree
  vg1    2   0   0 wz--n- 1.99g 1.99g

論理ボリューム(LV)作成

$ sudo lvcreate -L 1.99G -n lv1 vg1
  Rounding up size to full physical extent 1.99 GiB
  Logical volume "lv1" created
$ sudo lvscan
  ACTIVE            '/dev/vg1/lv1' [1.99 GiB] inherit

ファイルシステム(ext4)構築

$ sudo mkfs -t ext4 /dev/vg1/lv1 
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
130560 inodes, 522240 blocks
26112 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

マウント

$ sudo mount /dev/vg1/lv1 /data
$ df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1  2.0G   35M  1.9G   2% /data

/etc/fstabに追記

/dev/vg1/lv1    /data   ext4    defaults        1       2

新しいEBSの追加

追加ディスクにPV作成

$ sudo pvcreate /dev/xvdh
  Writing physical volume data to disk "/dev/xvdh"
  Physical volume "/dev/xvdh" successfully created
$ sudo pvscan
  PV /dev/xvdf   VG vg1             lvm2 [1020.00 MiB / 0    free]
  PV /dev/xvdg   VG vg1             lvm2 [1020.00 MiB / 0    free]
  PV /dev/xvdh                      lvm2 [1.00 GiB]
  Total: 3 [2.99 GiB] / in use: 2 [1.99 GiB] / in no VG: 1 [1.00 GiB]

VGに新しいPVを追加

$ sudo vgextend vg1 /dev/xvdh 
  Volume group "vg1" successfully extended
$ sudo vgs
  VG   #PV #LV #SN Attr   VSize VFree   
  vg1    3   1   0 wz--n- 2.99g 1020.00m

LVを拡張.この時点ではまだ実容量は増えていない.

$ sudo lvextend -l +100%FREE /dev/vg1/lv1 
  Extending logical volume lv1 to 2.99 GiB
  Logical volume lv1 successfully resized
$ sudo lvscan
  ACTIVE            '/dev/vg1/lv1' [2.99 GiB] inherit
$ df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1  2.0G   36M  1.9G   2% /data

ファイルシステムを拡張

$ sudo resize2fs /dev/vg1/lv1 
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/vg1/lv1 is mounted on /data; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/vg1/lv1 to 783360 (4k) blocks.
The filesystem on /dev/vg1/lv1 is now 783360 blocks long.
$ df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1  3.0G   36M  2.8G   2% /data

EBSを別のインスタンスにアタッチするとき

まず大きいファイルを書き込んでおく

$ fallocate -l 2G /data/dummy.img
$ md5sum /data/dummy.img
a981130cf2b7e09f4686dc273cf7187e  /data/dummy.img
$ df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1  3.0G  2.1G  777M  73% /data
$ sudo umount /data

AWSコンソールから3つのEBSをすべてデタッチして別のインスタンスにアタッチする. 以降新インスタンスで作業.

起動してlvm2インストール直後の状態

$ lsblk
NAME             MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
xvda1            202:1    0     4G  0 disk /
xvdb             202:16   0 149.1G  0 disk 
xvda3            202:3    0   896M  0 disk [SWAP]
xvdf             202:80   0     1G  0 disk 
└─vg1-lv1 (dm-0) 254:0    0     3G  0 lvm  
xvdg             202:96   0     1G  0 disk 
└─vg1-lv1 (dm-0) 254:0    0     3G  0 lvm  
xvdh             202:112  0     1G  0 disk 
└─vg1-lv1 (dm-0) 254:0    0     3G  0 lvm
$ sudo lvscan
  ACTIVE            '/dev/vg1/lv1' [2.99 GiB] inherit

普通にマウントすれば使えた.

$ sudo mount /dev/vg1/lv1 /data
$ md5sum /data/dummy.img
a981130cf2b7e09f4686dc273cf7187e  /data/dummy.img
$ df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1  3.0G  2.1G  777M  73% /data

lvm2がインストール済みだった場合は参考URLの手続きが必要になるかも.