
Linuxの論理ボリュームマネージャコマンドは、新しいディスクを追加したり既存のボリュームを拡張したりするのに私が使った中で最も便利なツールの一つです。ダウンタイムや再起動を必要とせず、即座に簡単に実行できますが、既存のボリューム上のすべてのデータの完全バックアップと、関連する仮想マシンのスナップショットを必ず作成することをお勧めします。
参照:知っておくべきオープンソースと Linux の用語 40 選(TechRepublic Premium)
このチュートリアルでは、LVMを使用してボリュームを拡張および縮小する方法を説明します。詳しくはこちらをご覧ください。
ジャンプ先:
- LVMを使用してボリュームを拡張する
- LVMを使用してボリュームを縮小する
- ディスクを構成するための便利なフレームワーク
LVMを使用してボリュームを拡張する
最近、1GBの容量でセットアップされたサーバーの/homeボリュームを拡張するために行った一連の手順を説明します。これはテストサーバーでしたが、念のためボリュームを10GB拡張することにしました。
当社ではサーバーに VMWare のみを使用しているため、このシナリオは vSphere 環境で行われますが、物理サーバーにディスクを追加する場合も手順は同じです。
まず、サーバーにログインし、root になって、次のコマンドを実行して存在するディスクを調べました。
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 49G 0 part │ ├─rhel-root 253:0 0 20G 0 lvm / │ ├─rhel-swap 253:1 0 4G 0 lvm [SWAP] │ ├─rhel-home 253:3 0 1G 0 lvm /home │ ├─rhel-var 253:4 0 10G 0 lvm /var │ ├─rhel-var_log 253:5 0 20G 0 lvm /var/log │ ├─rhel-var_opt 253:6 0 3G 0 lvm /var/opt │ ├─rhel-var_tmp 253:7 0 3G 0 lvm /var/tmp │ ├─rhel-usr_local 253:8 0 10G 0 lvm /usr/local │ ├─rhel-var_log_audit 253:9 0 1012M 0 lvm /var/log/audit │ ├─rhel-opt 253:10 0 65G 0 lvm /opt │ ├─rhel-opt_fireeye 253:11 0 2G 0 lvm /opt/fireeye │ ├─rhel-besclient 253:12 0 8G 0 lvm /var/opt/BESClient │ ├─rhel-opt_encase 253:13 0 2G 0 lvm /opt/encase │ └─rhel-tmp 253:14 0 15G 0 lvm /tmp sdb 8:16 0 850G 0 disk └─appvg-vaplv 253:2 0 850G 0 lvm /opt/vap
/etc/fstab を確認したところ、/dev/mapper/rhel-home が /home のマウントポイントであることがわかりました。これは sda 物理ディスクの sda2 パーティション上にあり、EXT2/3/4 ではなく XFS ファイルシステムです。
次に、vgsを実行してボリューム グループを表示しました。
VG #PV #LV #SN Attr VSize VFree appvg 1 1 0 wz--n- <850.00g 0 rhel 2 14 0 wz--n- 198.99g 35.00g
これにより、使用するボリューム グループが rhel であることが確立されました。
次に、vSphere コンソールにログインし、次の手順で新しいディスクを追加しました。
- VM を右クリックします。
- [設定の編集]を選択します。
- [新しいデバイスの追加]を選択します。
- ハードディスクを選択します。
- 図のように 10 GB のディスクを追加します (図 A)。
図A

スナップショットがない場合など、特定の状況では既存のボリュームを拡張し、拡張した領域をボリュームグループに追加して論理ボリュームに割り当てることが可能です。ただし、人為的なミスによって既存のデータに悪影響を与える可能性があるため、新しいディスクを直接追加するよりもリスクが高いと考えています。新しいディスクと空の関連パーティションを使用する方がはるかにクリーンです。OSは論理ボリュームにどのディスクを使用しているかを気にしません。これがLVMの優れた点です。
次に、lsblk を再度実行しました。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 49G 0 part │ ├─rhel-root 253:0 0 20G 0 lvm / │ ├─rhel-swap 253:1 0 4G 0 lvm [SWAP] │ ├─rhel-home 253:3 0 1G 0 lvm /home │ ├─rhel-var 253:4 0 10G 0 lvm /var │ ├─rhel-var_log 253:5 0 20G 0 lvm /var/log │ ├─rhel-var_opt 253:6 0 3G 0 lvm /var/opt │ ├─rhel-var_tmp 253:7 0 3G 0 lvm /var/tmp │ ├─rhel-usr_local 253:8 0 10G 0 lvm /usr/local │ ├─rhel-var_log_audit 253:9 0 1012M 0 lvm /var/log/audit │ ├─rhel-opt 253:10 0 65G 0 lvm /opt │ ├─rhel-opt_fireeye 253:11 0 2G 0 lvm /opt/fireeye │ ├─rhel-besclient 253:12 0 8G 0 lvm /var/opt/BESClient │ ├─rhel-opt_encase 253:13 0 2G 0 lvm /opt/encase │ └─rhel-tmp 253:14 0 15G 0 lvm /tmp sdb 8:16 0 850G 0 disk └─appvg-vaplv 253:2 0 850G 0 lvm /opt/vap sdc 8:32 0 10G 0 disk
ここでは、新しい 10 GB ディスクが sdc として追加されています。
次に、fdisk を実行してディスクにプライマリ パーティションを追加し、ファイル システムがそれを認識できるようにしました。
fdisk -u -c /dev/sdc
新しいパーティションの場合は n を、プライマリの場合は p を押し、Enter キーを 2 回押してデフォルトを確認し、次に w キーを押して変更を書き込みます。結果は次のようになります。
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 0xf9417ab7. Command (m for help):
新しいパーティションを作成するために n を押しました。
Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p):
プライマリパーティションを作成するために、p を押しました。
Partition number (1-4, default 1):
Enter キーを押して、デフォルトの 1 を受け入れます。
First sector (2048-20971519, default 2048):
Enter キーを押して、デフォルトの 2048 を受け入れます。
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519):
Enter キーを押して、デフォルトの 20971519 を受け入れます。
Using default value 20971519 Partition 1 of type Linux and of size 10 GiB is set Command (m for help):
変更を書き込むために w を押しました。
The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
次のステップでは、次のコマンドを実行して、新しいパーティションから物理ボリュームを作成します。
pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created.
次に、新しいパーティションを含めるように rhel ボリューム グループを拡張しました。
rhel /dev/sdc1 の vgextend
Volume group "rhel" successfully extended
再度vgsを実行すると、10 GB の追加が確認されました。
VG #PV #LV #SN Attr VSize VFree appvg 1 1 0 wz--n- <850.00g 0 rhel 3 14 0 wz--n- <208.99g 45.00g
次に論理ボリュームを拡張します。
lvextend -l 100%FREE /dev/mapper/rhel-home
特定の論理ボリュームに全量を割り当てたくない場合は、lvextend -r -L +10G /dev/mapper/rootvg-rhel_homeを使用して 10 GB のスペースのみを追加することもできます。
私の例では、以下が返されました。
Size of logical volume rhel/home changed from 1.00 GiB (256 extents) to 11.00 GiB (2816 extents).
Logical volume rhel/home successfully resized.
最後のステップは、次のコマンドを使用してファイルシステムを拡張することです。
xfs_growfs /dev/mapper/rhel-home
meta-data=/dev/mapper/rhel-home isize=512 agcount=4, agsize=65536 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=262144, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 262144 to 2883584
lsblk を再度実行すると、/home ボリュームが 11 GB になっていることが確認されました。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 49G 0 part │ ├─rhel-root 253:0 0 20G 0 lvm / │ ├─rhel-swap 253:1 0 4G 0 lvm [SWAP] │ ├─rhel-home 253:3 0 11G 0 lvm /home │ ├─rhel-var 253:4 0 10G 0 lvm /var │ ├─rhel-var_log 253:5 0 20G 0 lvm /var/log │ ├─rhel-var_opt 253:6 0 3G 0 lvm /var/opt │ ├─rhel-var_tmp 253:7 0 3G 0 lvm /var/tmp │ ├─rhel-usr_local 253:8 0 10G 0 lvm /usr/local │ ├─rhel-var_log_audit 253:9 0 1012M 0 lvm /var/log/audit │ ├─rhel-opt 253:10 0 65G 0 lvm /opt │ ├─rhel-opt_fireeye 253:11 0 2G 0 lvm /opt/fireeye │ ├─rhel-besclient 253:12 0 8G 0 lvm /var/opt/BESClient │ ├─rhel-opt_encase 253:13 0 2G 0 lvm /opt/encase │ └─rhel-tmp 253:14 0 15G 0 lvm /tmp sdb 8:16 0 850G 0 disk └─appvg-vaplv 253:2 0 850G 0 lvm /opt/vap sdc 8:32 0 10G 0 disk └─sdc1 8:33 0 10G 0 part └─rhel-home 253:3 0 10G 0 lvm /home
LVMを使用してボリュームを縮小する
ボリュームの縮小はボリュームの拡張とは全く異なります。いくつか考慮すべき点があります。
XFS ファイル システムは縮小できません。唯一の解決策は、データをバックアップし、ボリュームを削除し、より小さなボリュームを作成して構成し、そこにデータを復元することです。
EXT2/EXT3/EXT4ファイルシステムは逆に縮小可能ですが、ディスクの縮小に関してはVMWare側の制約もあります。スナップショットがプロセスに干渉し、削除が必要になる場合があり、シックプロビジョニングされたディスクは縮小が難しい場合があります。VMWareは、VMware Converterやvmkfstoolsコマンドに関する優れたナレッジベース記事をこちらで提供しています。
この LVM の記事では、VMWare ディスクのサイズが正常に縮小されているか、VMWare ディスクのサイズをそのままにして、そのスペースを別の論理ボリュームに割り当てることを前提として、EXT2/3/4 ボリュームを縮小する方法に焦点を当てます。
ルートボリュームの縮小は最も難しい操作になるでしょう。これは / にマウントされている論理ボリュームですが、このプロセスではボリュームをアンマウントする必要があるため、縮小は不可能です。OSが実際に動作していないLive CDから起動する必要があります。Live CDが論理ボリュームを認識して処理を続行するには、vgchange -ayを実行する必要があるかもしれません。
非ルート ボリュームを縮小する方がはるかに簡単です。この場合、上記の例と一致させるには、umount /homeを実行して続行します。
次の手順は、ルート ボリュームと非ルート ボリュームの両方に適用されるはずです。
データ破損のリスクを軽減するために、LVM ボリューム上でファイル システム チェックを実行します。
e2fsck -fy /dev/mapper/rhel-home
-f フラグは、ファイル システムに問題がないように見えてもチェックを強制的に続行し、-y はすべての質問に「はい」と答えます。
以下のコマンドは、/home論理ボリュームのサイズを11GBから5GBに縮小します。この操作を実行するには、十分な空き容量が必要です。
resize2fs /dev/mapper/rhel-home 5G
これで、lvreduce コマンドを使用して論理ボリュームのサイズを縮小できるようになりました。
論理ボリュームを希望のサイズに縮小するには、-L フラグを使用して希望のサイズを指定します。
lvreduce -L 5G /dev/mapper/rhel-home
論理ボリュームを特定のサイズに縮小するには、-L フラグと、希望するサイズの前にダッシュを使用します。
lvreduce -L -5G /dev/mapper/rhel-home
このコマンドを実行すると、「y」と答えてEnterキーを押して確認を求めるプロンプトが表示されます。次に、ボリュームに対してresize2fsを実行します。
resize2fs /dev/mapper/rhel-home
次に、ボリュームをマウントする必要があります。ルートボリュームの場合は、システムを再起動してプライマリLinuxオペレーティングシステムをロードします。ルートボリューム以外のボリュームの場合は、/etc/fstabに構成が設定されていることを前提として、mount -aを実行します。そうでない場合は、次のように論理ボリュームとマウント先を指定します。
/dev/mapper/rhel-home /home をマウントします。
最後に、dfコマンドでボリュームの容量を確認し、想定通りに減少していることを確認します。また、次のコマンドでファイルシステムのヘルスチェックを実行することをお勧めします。
e2fsck -fy /dev/mapper/rhel-home
ディスクを構成するための便利なフレームワーク
LVMを使ったディスクおよびボリューム操作は、迅速、簡単、そして信頼性に優れています。私はオンザフライでディスク管理操作を実行しましたが、技術的な問題に遭遇したことは一度もなく、ましてやオペレーティングシステムのクラッシュやデータ損失に遭遇したこともありません。
LVMの詳細については、linuxhandbook.comの「LVM完全初心者ガイド」をご覧ください。TechRepublic Academyの以下のリソースを活用して、Linuxエキスパートを目指しましょう。
- マスターLinux開発バンドル
- Linux & Docker コーディングバンドル
- 2022年 Linux 認定トレーニング バンドル
- マスターLinuxとGit認定バンドル