LVMとは?
LVM(Logical Volume Manager)は、ディスク(ボリューム)管理をするツールです。今ではLinuxをインストールすると自動的にLVMで管理される設定になります。
ひと昔前はLVMがありませんでした。LVMが実装されていないと、ディスクの空き容量が無くなると大がかりな作業が必要でしたが、LVMのおかげて簡単に済ませることが出来るようになりました。
LVMは「物理的」にパーティションを管理するのではなく、「論理的」にパーティションを管理します。
論理的にパーティションを区切ることのメリットは次の通りです。
- 無駄なパーティション領域を削減できる
- 領域不足のパーティションを拡張できる
- 物理的なディスク容量より大きいパーティションを作成できる
LVMの基本的な仕組み
LVMは物理ディスクを3つの階層で論理的に管理します。
- PV(物理ボリューム:Physical Volume)で物理パーティションを管理
- VG(ボリュームグループ:Volume Group)でPVを管理
- LV(論理ボリューム:Logical Volume)でVGを管理
基本的なLVMの作成手順
次のような手順でLVMを利用したパーティションを作成します。
- パーティションの作成
- PV(物理ボリューム)を作成
- VG(ボリュームグループ)を作成
- LV(論理ボリューム)を作成
- フォーマット
- マウント
パーティションの作成
物理ディスク(/dev/sdb)に対してfdiskコマンドを実行し、新しいパーティションをを作成します。
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x2e7614ee.
コマンド (m でヘルプ): n ← 新しくパーティションを作成
新しくパーティションを作成し、全領域を割り当てます。
コマンド (m でヘルプ): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p ← プライマリーを選択 パーティション番号 (1-4, default 1): ← 空エンター 最初 sector (2048-16777215, 初期値 2048): ← 空エンター Last sector, +sectors or +size{K,M,G} (2048-16777215, 初期値 16777215): ← 空エンター 初期値 16777215 を使います Partition 1 of type Linux and of size 8 GiB is set
パーティションのタイプをLVMに設定します。
コマンド (m でヘルプ): t ← パーティションのタイプを設定 Selected partition 1 Hex code (type L to list all codes): 8e ← LVMを選択 Changed type of partition 'Empty' to 'Linux LVM'
最後に書込みを行います。
コマンド (m でヘルプ): w ← 書込み
パーティションテーブルは変更されました!
ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
PV(物理ボリューム)を作成
pvcreateコマンドを利用してPVを作成します。
# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created.
実行結果は色々なコマンドから確認できます。
# pvs PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <29.51g 44.00m /dev/sdb1 lvm2 a-- <8.00g <8.00g ← 新しいPVが作成 # pvscan PV /dev/sda2 VG centos lvm2 [<29.51 GiB / 44.00 MiB free] PV /dev/sdb1 lvm2 [<8.00 GiB] ← 新しいPVが作成 Total: 2 [<37.51 GiB] / in use: 1 [<29.51 GiB] / in no VG: 1 [<8.00 GiB] # pvdisplay --- Physical volume --- PV Name /dev/sda2 VG Name centos PV Size 29.51 GiB / not usable 3.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 7554 Free PE 11 Allocated PE 7543 PV UUID VefoGZ-0R9L-eNlh-xbK8-zlNO-Ge4W-WfEm28 "/dev/sdb1" is a new physical volume of "<8.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 ← 新しいPVが作成 VG Name PV Size <8.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 3gtLSl-qfpQ-R0gp-4jgw-NWdY-pse9-qiTx25
VG(ボリューム・グループ)を作成
vgcreateコマンドを利用してVGを作成します。VG名を”test-vg”としました。
#vgcreate test-vg /dev/sdb1 Volume group "test-vg" successfully created
実行結果は色々なコマンドから確認できます。
# vgs VG #PV #LV #SN Attr VSize VFree centos 1 2 0 wz--n- <29.51g 44.00m test-vg 1 0 0 wz--n- <8.00g <8.00g ← 新しいVGが作成 # vgscan Reading volume groups from cache. Found volume group "centos" using metadata type lvm2 Found volume group "test-vg" using metadata type lvm2 ← 新しいVGが作成 # vgdisplay --- Volume group --- VG Name centos System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 1 Act PV 1 VG Size <29.51 GiB PE Size 4.00 MiB Total PE 7554 Alloc PE / Size 7543 / 29.46 GiB Free PE / Size 11 / 44.00 MiB VG UUID fvJ2Gp-hR96-ysZ9-IWxw-C9BA-G8YN-kZ0bk9 --- Volume group --- VG Name test-vg ← 新しいVGが作成 System ID Format lvm2 Metadata Areas 1 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 1 Act PV 1 VG Size <8.00 GiB PE Size 4.00 MiB Total PE 2047 Alloc PE / Size 0 / 0 Free PE / Size 2047 / <8.00 GiB VG UUID 2ZG94A-PZOK-9JDR-MDUy-BTUD-T2OS-O2doFL
LV(論理ボリューム)を作成
lvcreateコマンドを利用します。空き領域の全てを割り当てるLVを作成します。LV名を”test-lv”としました。
#lvcreate -n test-lv -l 100%FREE test-vg Logical volume "test-lv" created.
実行結果は色々なコマンドから確認できます。
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root centos -wi-ao---- 27.46g swap centos -wi-ao---- 2.00g test-lv test-vg -wi-a----- <8.00g ← 新しいLVが作成 # lvscan ACTIVE '/dev/centos/swap' [2.00 GiB] inherit ACTIVE '/dev/centos/root' [27.46 GiB] inherit ACTIVE '/dev/test-vg/test-lv' [<8.00 GiB] inherit ← 新しいLVが作成 # lvdisplay --- Logical volume --- LV Path /dev/centos/swap LV Name swap VG Name centos LV UUID wWBtao-OAOk-IdMq-ch4b-vcFB-SoeS-EFScBp LV Write Access read/write LV Creation host, time hogehoge, 2016-10-11 09:59:25 +0900 LV Status available # open 2 LV Size 2.00 GiB Current LE 512 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:1 --- Logical volume --- LV Path /dev/centos/root LV Name root VG Name centos LV UUID Vd88ms-fbbK-Shcj-mDrD-Iloj-3HDs-RONj3G LV Write Access read/write LV Creation host, time hogehoge, 2016-10-11 09:59:26 +0900 LV Status available # open 1 LV Size 27.46 GiB Current LE 7031 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:0 --- Logical volume --- LV Path /dev/test-vg/test-lv ← 新しいLVが作成 LV Name test-lv VG Name test-vg LV UUID YFO6Rd-ewSt-l3UR-a7nt-tcHa-jQPd-6MCfSN LV Write Access read/write LV Creation host, time hogehoge, 2019-03-27 17:22:22 +0900 LV Status available # open 0 LV Size <8.00 GiB Current LE 2047 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:2
フォーマット
lsblkコマンドを利用してデバイス・マッパーを確認します。
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT fd0 2:0 1 4K 0 disk sda 8:0 0 30G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 29.5G 0 part ├─centos-root 253:0 0 27.5G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 8G 0 disk └─sdb1 8:17 0 8G 0 part └─test--vg-test--lv 253:2 0 8G 0 lvm sr0 11:0 1 1024M 0 rom
CentOS7はxfsを利用しています。
mkfs.xfs コマンドを利用してフォーマットします。
# mkfs.xfs /dev/mapper/test--vg-test--lv meta-data=/dev/mapper/test--vg-test--lv isize=512 agcount=4, agsize=524032 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=2096128, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
マウント
マウントポイントを作成し、mountコマンドを利用してマウントします。
# mkdir test-lvm # mount /dev/test-vg/test-lv /test-lvm/
実行結果の確認
# df -h ファイルシス サイズ 使用 残り 使用% マウント位置 /dev/mapper/centos-root 28G 3.1G 25G 11% / devtmpfs 485M 0 485M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 7.1M 489M 2% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/sda1 497M 255M 243M 52% /boot tmpfs 100M 0 100M 0% /run/user/0 tmpfs 100M 0 100M 0% /run/user/1000 /dev/mapper/test--vg-test--lv 8.0G 33M 8.0G 1% /test-lvm
既にある領域を拡張したい場合
LVMで作成した領域は、非常に容易に領域を拡張することができます。
昔は、ディスク容量の増強は大仕事でした。今ではLVMでディスクを管理しているのでコマンドで、チョイチョイと進めて行くだけです。本当に便利になりました。
使用率が100%に近づいてきたら領域拡張を実施してください。
基本的なLVMの削除手順
削除は、作成の逆を順番に実施します。
アンマウント
umountコマンドを利用してアンマウントします。
umount /test-lvm/
LV(論理ボリューム)削除
lvremoveコマンドを利用してLVを削除します。
# lvremove test-vg test-lv Do you really want to remove active logical volume test-vg/test-lv? [y/n]: y Logical volume "test-lv" successfully removed Volume group "test-lv" not found Cannot process volume group test-lv
VG(ボリューム・ボリューム)削除
vgremoveコマンドを利用してVGを削除します。
# vgremove test-vg Volume group "test-vg" successfully removed
PV(物理ボリューム)削除
pvremoveコマンドを利用してPVを削除します。
# pvremove /dev/sdb1 Labels on physical volume "/dev/sdb1" successfully wiped.