はじめに
仮想環境でLinux VMを運用していると、気がつくとディスク容量が不足していることってよくありますよね。特にルートパーティション(/
)やログが溜まる /var
パーティションなんかは、思った以上に早く埋まってしまいます。
今回は、そんな時に役立つLVMパーティションの拡張方法について、実際にUbuntu 22.04 LTSのVMを作成して、一から手順を確認してみました。ルートパーティションも含めて、どのLVMパーティションでも対応可能な方法です。
実は明日業務でこの作業があるので、予習も兼ねて検証してみました。同じような状況の方の参考になれば嬉しいです!
検証環境
今回の検証で使用した環境はこちら:
項目 | 仕様 |
---|---|
仮想化基盤 | Proxmox VE 9.0 |
ゲストOS | Ubuntu 22.04 LTS Server |
初期ディスク容量 | 20GB |
拡張後容量 | 50GB |
ストレージ構成 | LVMデフォルト構成 |
Ubuntu ServerのインストーラーはデフォルトでLVM構成を選択してくれるので、今回の検証にはピッタリでした!
LVMの基本的な仕組み
LVMって最初は「なんでこんなに複雑なの?」って思ったんですが、理解すると結構理にかなってるんですよね。
LVM(Logical Volume Manager)は、物理的なディスクを抽象化して柔軟なストレージ管理を可能にします。階層構造になっているのがポイントです:
- 物理ボリューム(PV): 実際のディスクパーティション
- ボリュームグループ(VG): 複数のPVをまとめた論理的なグループ
- 論理ボリューム(LV): VG内に作成される実際に使用する領域
この階層構造があるおかげで、ディスクの動的な拡張・縮小ができるわけです。
拡張手順の全体像
LVMって階層構造になっているので、下から順番に拡張していく必要があります。最初は「なんでこんなに手順が多いの?」って思ったんですが、慣れてくると理にかなってることが分かります。
作業の流れはこんな感じです。各段階で状態確認をしながら進めていくのが安心ですね。
Step 1: Proxmoxで仮想ディスクを拡張する
まずはProxmox側で「器」を大きくします。
⚠️ 重要: ここは必ずVMをシャットダウンしてから作業してください
VMの作成(今回の検証用)
まずはサクッとVMを作成します。isoのアップロードから:
VM作成時はディスク容量20GB、その他は適当なスペックで設定:
ディスクサイズの変更
VMをシャットダウン
ハードウェア設定から拡張
- 対象のVMを選択
- [ハードウェア] タブを開く
- 拡張したいディスク(今回は
scsi0
)を選択 - [ディスク操作] > [サイズ変更] をクリック
追加容量を入力(今回は30GB追加で 30
と入力)
この作業自体は数秒で終わります。簡単ですね!
Step 2: OS側でパーティションを拡張
VMを起動して、いよいよOS側の作業です。SSHでログインして進めていきます。
現状確認してみる
lsblk
実行すると、Ubuntu LVMのデフォルト構成では大体こんな感じになります:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 87M 1 loop /snap/lxd/29351
loop1 7:1 0 63.9M 1 loop /snap/core20/2318
loop2 7:2 0 38.8M 1 loop /snap/snapd/21759
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
└─sda3 8:3 0 18.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 10G 0 lvm /
ここで注目すべきは、sda
自体はStep1で指定した50GBになっているけど、その中の sda3
パーティションはまだ古いサイズ(約18GB)のままということです。これが今回のポイントですね。
パーティション拡張の実行
パーティション拡張には parted
コマンドを使います。ほとんどのLinuxディストリビューションに標準で入っていて安心です。
まず現在のパーティション情報を確認:
sudo parted /dev/sda print
そして実際の拡張(パーティション3を最大サイズまで拡張):
sudo parted /dev/sda resizepart 3 100%
このコマンドは resizepart [パーティション番号] [新しいサイズ]
という書式で、100%
は「ディスクの最後まで使う」という意味です。
拡張できたか確認
再度 lsblk
で確認すると:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 87M 1 loop /snap/lxd/29351
loop1 7:1 0 63.9M 1 loop /snap/core20/2318
loop2 7:2 0 38.8M 1 loop /snap/snapd/21759
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
└─sda3 8:3 0 48.2G 0 part # ← 拡張された!
└─ubuntu--vg-ubuntu--lv 253:0 0 10G 0 lvm / # ← でもLVMはまだ小さい
パーティションは拡張されましたが、LVMの部分はまだ元のサイズのままですね。ここからがLVM特有の作業になります。
Step 3: LVMレイヤーの拡張
ここからがLVM特有の作業です。正直、最初は「なんで段階がこんなに多いの?」と思いましたが、各レイヤーの役割を理解すると納得できます。
物理ボリューム(PV)の拡張
まずは、拡張したパーティションの領域をLVMに認識させます:
sudo pvresize /dev/sda3
Physical volume "/dev/sda3" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
ボリュームグループの状態確認
念のため、ボリュームグループに空き領域ができたことを確認しておきます:
sudo vgdisplay
論理ボリューム(LV)の確認と拡張
次に、拡張したい論理ボリュームのパスを確認します:
sudo lvdisplay
出力の中に LV Path
という項目があるので、そこに書かれているパス(今回は /dev/ubuntu-vg/ubuntu-lv
)をメモしておきます。
そして論理ボリュームを拡張:
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
-l +100%FREE
オプションは「ボリュームグループ内の空き領域を全部使う」という指定です。細かく容量を計算しなくて済むので楽ですね。
Size of logical volume ubuntu-vg/ubuntu-lv changed from 10.00 GiB (2560 extents) to 48.22 GiB (12345 extents).
Logical volume ubuntu-vg/ubuntu-lv successfully resized.
Step 4: ファイルシステムの拡張
最後の仕上げです。ここまでの作業で論理ボリュームは大きくなりましたが、OS側から見るとまだファイルシステムのサイズは変わっていません。
拡張前の状態確認
df -hT
Filesystem Type Size Used Avail Use% Mounted on
tmpfs tmpfs 197M 1.0M 196M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 9.8G 4.9G 4.5G 53% /
tmpfs tmpfs 982M 0 982M 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 ext4 1.8G 130M 1.5G 8% /boot
tmpfs tmpfs 197M 4.0K 197M 1% /run/user/1000
ファイルシステム拡張の実行
UbuntuのデフォルトはEXT4なので、resize2fs
を使います:
sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 7
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 12641280 (4k) blocks long.
最終確認
df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 197M 1.0M 196M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 48G 4.9G 41G 11% / # ← 拡張完了!
tmpfs 982M 0 982M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 1.8G 130M 1.5G 8% /boot
tmpfs 197M 4.0K 197M 1% /run/user/1000
やりました!これで作業完了です。
よくハマるトラブルと対処法
実際にこの作業を何回もやっていると、たまにハマることがあります。僕が経験した代表的なものを書いておきますね。
パーティション拡張でエラーが出る場合
# こんなエラーが出ることがあります
Error: Partition 3 is being used. You must unmount it before you resize it.
これはパーティションがマウントされている場合のエラーです。LVMのルートパーティションの場合は、オンラインで拡張可能なので大丈夫なはずですが、こんな時は:
# まずはディスクサイズを確認
sudo fdisk -l /dev/sda
# パーティションテーブルを再読み込み
sudo partprobe /dev/sda
# もう一度parted で確認
sudo parted /dev/sda print
LVM拡張で空き領域不足エラー
# こんな時は現在の状況を確認
sudo pvdisplay
sudo vgdisplay
物理ボリュームの拡張(pvresize
)をし忘れていることが多いです。僕も最初やりました(笑)
ファイルシステム拡張が反映されない
EXT4の場合は resize2fs
、XFSの場合は xfs_growfs
を使います。コマンドを間違えると拡張されません。
# ファイルシステムの種類確認
df -hT
XFSの場合は:
sudo xfs_growfs / # マウントポイントを指定
作業前後の比較
今回の検証結果をまとめるとこんな感じになりました:
項目 | 作業前 | 作業後 |
---|---|---|
仮想ディスクサイズ | 20GB | 50GB |
パーティション(sda3) | 約18GB | 約48GB |
論理ボリューム | 10GB | 48GB |
利用可能領域 | 4.5GB | 41GB |
無事に容量が4倍以上になりました!
参考:よく使うコマンド一覧
作業中によく使うコマンドをまとめておきます。ブックマークしておくと便利だと思います:
# 現状確認系
lsblk # ブロックデバイス構成
df -hT # ディスク使用量とFS種別
sudo pvdisplay # 物理ボリューム情報
sudo vgdisplay # ボリュームグループ情報
sudo lvdisplay # 論理ボリューム情報
# 拡張系
sudo parted /dev/sda resizepart 3 100% # パーティション拡張
sudo pvresize /dev/sda3 # 物理ボリューム拡張
sudo lvextend -l +100%FREE [LV] # 論理ボリューム拡張
sudo resize2fs [device] # ext4拡張
sudo xfs_growfs [mountpoint] # xfs拡張
# トラブル対応系
sudo partprobe /dev/sda # パーティションテーブル再読み込み
sudo fdisk -l /dev/sda # ディスク情報詳細確認
注意点とか学んだこと
作業前の準備
- 絶対に必要: VMの完全バックアップまたはスナップショット取得
- できれば: 重要なデータの別途バックアップ
- 必須: メンテナンス時間の確保(思ったより時間かかることがある)
作業中の心がけ
- 各段階で状態確認を実施し、期待通りの結果であることを確認する
- エラーが発生した場合は、無理に進めず原因を特定してから継続する
- 本番環境では事前にテスト環境で手順を検証する(今回みたいに)
個人的な気づき
LVMって最初は複雑に見えるけど、各レイヤーの役割を理解すると「なるほど」って思えるようになりました。特に、物理→論理の抽象化によって、こういう柔軟な運用ができるんですね。
まだまだ勉強中の身なので、もし間違いがあったり、もっと良いやり方があれば教えてください!
まとめ
LVMパーティションの拡張は、手順こそ多いものの、各段階の意味を理解すれば決して難しい作業ではありません。
同じような状況で困っている方の参考になれば幸いです!