LVM設定のext4でフォーマットされたボリュームを縮小することは可能です。
それは、同時に拡張もする必要があります。
その理由と、ext4フォーマットでの縮小と拡張方法について解説します。
下記の図のように、同じVG(VolumeGroup)上に2つ以上のLV(Logical Volume)が構成されているときに、縮小と拡張が可能となります。
すなわち
縮小したLVの空き容量は、もう一方のLVに拡張して利用してもらうことになります。
仮想ディスクの容量(総容量)は、そのままで、LVの割当て配分を変更するという方法になります。
今回のLVの縮小と拡張の特徴は、保存されているデータ(ファイル)の移動やコピーを一切せずに実現できます。
【実例解説】LVMで論理ボリュームの縮小と拡張方法(ext4のデータ編)
LVM上で設定したext4ファイルシステムは、xfsとは違い保存されているデータ(ファイル)を保持したまま、縮小することができます。
縮小して余った容量を別のLV(Logical Volume)へ、こちらもデータ(ファイル)を保持したまま拡張することができます。
すなわち、データを保持したままLVの容量配分を変更することができます。
この一連の操作方法を以下の構成で解説します。
作業概要
LVM設定したディスク容量を
「作業前のディスク構成」から「作業後のディスク構成」へ変更します。
※構成イメージは上記画像のリンクより
■作業前のディスク構成
VG名 | LV Path | LV Name | デバイス | ファイルシステム | マウントポイント | 容量 |
vg-sdb | /dev/vg-sdb/lv-sdb01 | lv-sdb01 | /dev/mapper/vg--sdb-lv--sdb01 | ext4 | /lv-data01 | 1.1G |
vg-sdb | /dev/vg-sdb/lv-sdb02 | lv-sdb02 | /dev/mapper/vg--sdb-lv--sdb01 | ext4 | /lv-data02 | 0.4G(384M) |
↓
■作業後のディスク構成
VG名 | LV Path | LV Name | デバイス | ファイルシステム | マウントポイント | 容量 |
vg-sdb | /dev/vg-sdb/lv-sdb01 | lv-sdb01 | /dev/mapper/vg--sdb-lv--sdb01 | ext4 | /lv-data01 | 0.5G(461M) |
vg-sdb | /dev/vg-sdb/lv-sdb02 | lv-sdb02 | /dev/mapper/vg--sdb-lv--sdb01 | ext4 | /lv-data02 | 1G(992M) |
※補足1
カッコ()の値が実際にサーバ内で割り当てられた値になります。
ーーーー
・OSの仕様(デフォルトで5%の予約領域確保)
・ディスクの割当て方法(1M=1024K×1byte or 1M=1000K×1byte)
・ブロックサイズ、セクタ
などの関係で容量に誤差が発生するので
ディスク容量のサイズ変更は余裕をみて決定してください。
※補足2
1.作業開始前のディスク情報確認
1-1.拡張と縮小するマウントポイントのデバイスと容量、データ(ファイル)を確認
df -h
->縮小する「/lv-data01」と拡張する「/lv-data02」のデバイスと容量を確認
ls -al /lv-data01
->縮小する「/lv-data01」マウントポイントにデータ(ファイル)があること確認
ls -al /lv-data02
->拡張する「/lv-data02」マウントポイントにデータ(ファイル)があることを確認
1-2.ext4のファイルシステムであることを確認
blkid
->縮小する「/dev/mapper/vg--sdb-lv--sdb01」と拡張する「/dev/mapper/vg--sdb-lv--sdb02」デバイスのファイルシステムが「ext4」であることを確認
1-3.縮小と拡張をするLVM設定の情報を確認
pvdisplay
->縮小する「/dev/mapper/vg--sdb-lv--sdb01」と拡張する「/dev/mapper/vg--sdb-lv--sdb02」デバイスが1デバイス(/dev/sdb)、1VG(vg-sdb)であることを確認
vgdisplay
->VGの構成が1デバイス(/dev/sdb)であることを確認
lvdisplay
->LVの構成が1VG(vg-sdb)に対して2つ(「/dev/vg-sdb/lv-sdb01」と「/dev/vg-sdb/lv-sdb02」)であることとディスク容量(「lv-sdb01:1.1G」と「lv-sdb02:384M」)を確認
2.データを保持したままディスク容量を縮小(ext4)
2-1.縮小するデバイスをアンマウントし、ext4ファイルシステムとLV(Logical Volume)の縮小
df -h
->縮小する「/lv-data01」がマウントしていることを確認
umount /lv-data01
->縮小する「/lv-data01」をアンマウント
df
->「/lv-data01」がアンマウントされたことを確認
すなわち、「/dev/mapper/vg--sdb-lv--sdb01」デバイスをアンマウントしたことを確認
e2fsck -f /dev/mapper/vg--sdb-lv--sdb01
->アンマウントした「/dev/mapper/vg--sdb-lv--sdb01」デバイスをファイルチェック
※縮小する前にかならず実行する必要があり、実行しないと縮小できません。
resize2fs /dev/mapper/vg--sdb-lv--sdb01 500M
->「/dev/mapper/vg--sdb-lv--sdb01」デバイスのファイルシステム(ext4)を500Mに縮小
※指定したサイズ(500M)に縮小します。「1.1G」->「500M(-600M)」
※xfsファイルシステムでは縮小できません。
lvreduce -L 500M /dev/mapper/vg--sdb-lv--sdb01
->[y/n]の確認があるので「y」実行(enterキー)することで、「/dev/vg-sdb/lv-sdb01」のLVサイズを500Mに縮小
※「/dev/mapper/vg--sdb-lv--sdb01」=「/dev/vg-sdb/lv-sdb01」
※「-L」オプションは指定したサイズ(500M)に縮小します。「1.1G」->「500M(-600M)」
※ext4ファイルシステムを縮小してからLVを縮小すると順番にも注意
2-2.縮小後のLVMのLVとVGの容量を確認
lvdisplay
->「/dev/vg-sdb/lv-sdb01」のLVが「1.1G」から「500M」の容量に縮小(-628M縮小)したことを確認
vgdisplay
->「vg-sdb」のVGに縮小した分の空き容量(628M)があることを確認
2-3.縮小したデバイスをマウントしてデータ(ファイル)も保持されていることを確認
df -h
->「/lv-data01」がマウントされていないことを確認
mount /dev/mapper/vg--sdb-lv--sdb01 /lv-data01
->縮小した「/dev/mapper/vg--sdb-lv--sdb01」デバイスをマウント
df -h
->「/lv-data01」がマウントできたこと、容量が「1.1G」から「461M」に縮小されていることを確認
ls al /lv-data01
->「/lv-data01」を縮小してもデータ(ファイル)が削除されずに残っていることを確認
3.縮小して余ったディスクをもう一つのLVへ割振りデータを保持したまま拡張(ext4)
3-1.拡張する対象デバイスのLVM設定と空き容量を確認
df -h
->拡張する「/lv-data02」のデバイス名と容量を確認
vgdisplay
->「vg-sdb」のVGに割当て可能な空き容量(628Mの空き容量)があることを確認
lvdisplay
->空き容量がある「vg-sdb」のVGに属しているLVの中に、拡張したい「/dev/vg-sdb/lv-sdb02」のLVが該当するのか?を確認するのと、現在のディスク容量を確認
3-2.LV(Logical Volume)の拡張
lvextend -l +100%FREE /dev/maper/vg--sdb-lv--sdb02
->「vg-sdb」のVGで確認した空き容量(628M)を拡張対象の「/dev/vg-sdb/lv-sdb02」)のLVへすべて割当て
vgdisplay
->「vg-sdb」のVGに空き容量がなく、すべて割当てられたこと(Freeが「0」)を確認
lvdisplay
->「/dev/vg-sdb/lv-sdb02」のLVが「404M」から「1.01G」に拡張(+628M拡張)していることを確認
※「/dev/mapper/vg--sdb-lv--sdb02」=「/dev/vg-sdb/lv-sdb02」
3-3.ファイルシステム(ext4)の拡張
df -h
->LV拡張後も「/dev/mapper/vg--sdb-lv--sdb02」デバイスのディスク容量に変化がないことを確認(384Mのまま)
※LVを拡張してもファイルシステムの容量は増えません。
※「/dev/mapper/vg--sdb-lv--sdb02」=「/dev/vg-sdb/lv-sdb02」
resize2fs /dev/mapper/vg--sdb-lv--sdb02
->LVで拡張後に「/dev/mapper/vg--sdb-lv--sdb02」デバイスのファイルシステム(ext4)を拡張
※LVで拡張されたことがファイルシステムに反映されます。
df -h
->「lv-data02」が「384M」から「992M」に拡張していることを確認
ls -al /lv-data02
->「/lv-data02」を拡張してもデータ(ファイル)が削除されずに残っていることを確認
まとめ&注意事項
- LVM設定のext4ファイルシステムの場合、xfsとは違い、データ(ファイル)を保持したまま、縮小ができます。
- 仮想ディスクにおけるLVM設定の縮小は、割当てた仮想ディスクそのものが縮小されるわけではないので、以下の3つのケースに当てはまるかどうかで、縮小を検討してください。
- デバイス名と「LV Path」の紐づけを把握して、どちらを指定するのか注意して作業を実施してください。
- 縮小するときは、「e2fsck」->「resize2fs」->「lvreduce」の順番で実施してください。※「ext4」-> 「LV」の順番で縮小
- 縮小する容量が、
・設定した数値の容量に縮小するのか?
・縮小したい(減らしたい)容量を指定するのか?
明確にして設定してください。 - VGに空き容量があり、該当のVGに所属しているLVを拡張する場合は、アンマウントせずに動的に拡張することができます。
※データ(ファイル)を利用しながら拡張が可能
下記3つのケースでは、今回の縮小手順では対応できませんのでご注意ください。
- LVが1つで縮小した容量を受け持ってくれるLVがいない場合
->LVの縮小は、このサイトで解説している手順で可能です。
但し、縮小の目的である仮想ディスクの縮小が行えませんので、縮小して余った容量は未使用として扱われて利用されない状態で残ってしまいます。
後々、未使用の容量を別LVにして利用するとか、縮小したLVに再利用する可能性があるのであれば、今回の手順をご利用ください。 - LVが2つ以上で、縮小するLVがあり、縮小して余った容量を受け持ってくれるLVがいない場合
->「1.」と同様の理由となります。 - 仮想ディスクそのものを縮小させたい場合
->今回の手順では、仮想ディスクの容量そのものを縮小する手順ではありません。
LVの割振りを変更して縮小と拡張を実現しますので今回の手順では対応できません。
これら、3つの問題を解消する方法は、
【Linux】LVMで論理ボリューム縮小(XFSのデータ編)-5ステップ設定
を参照してください。
※「XFS」での対応方法ですが、コマンドなど適宜、読みかえることで「ext4」でも対応可能です
コメント