Proxmoxの逼迫したpve-rootを、NFSストレージへのISOを退避して解消した話
以下の記事は、GPT-5.4-chatと会話しながら問題を解消したのを記事にしたものです。
1-1. はじめに
Proxmoxを使っていると、気づいたらlocalストレージにISOがたまっていて、pve-rootの空き容量がじわじわ減っていることがあります。
私の環境でもまさにそれが起きていて、/var/lib/vz/template/isoに大きめのISOイメージをいくつも置いていた結果、pve-rootが圧迫されていました。pve-rootはデフォルトで100GBぐらいしか用意されていないので、isoファイルを沢山いれると枯渇します。
pve-rootへLVMの空き領域を追加することも考えましたが、単純にroot領域にISOが溜まっていたがのが問題でした。
そこで今回は、別のRaspberry PiマシンをNFSサーバーとして使い、ProxmoxのISO保存先をNFSへ逃がすことにしました。
この記事では、以下の流れで対応した内容をまとめます。
-
pve-root逼迫の状況確認 - 原因の切り分け
- Raspberry PiをNFSサーバー化
- ProxmoxにNFSストレージを追加
- ISOをNFSへ移動
-
localからISOを外して運用を整理
同じように「pve-rootが足りないけど、別ディスクは増やせない」という状況の方には、参考になると思います。
1-2. 先に結論
今回のポイントを先に書くと、こんな感じです。
- ISOはファイルベースのデータなので、NFSへ逃がしやすいです
- Proxmoxでは、ISO専用のStorageを分けておくと運用がかなり楽になります
最終的には、ISOをNFSへ移したことでpve-rootの空き容量をかなり回復できました。
2. まず何が起きていたのか
2-1. LVM上は少し空きがあった
最初に確認したのは、Volume Groupの空き領域です。
vgdisplay
このとき、pveのVolume Groupには十数GiBほどの未使用領域がありました。
そのため、たとえば次のようなコマンドでpve-rootを拡張すること15GB程度を追加できそうでした。
lvextend -l +100%FREE /dev/pve/root
2-2. ISOが原因
次に、ISO保存ディレクトリの中身を確認しました。
ls -lahtrS /var/lib/vz/template/iso
すると、数百MBのcloud imageに加えて、数GB級のISOがいくつも置かれていました。中には10GBを超える大きなISOもあり、合計するとかなりの容量になっていました。
つまり、今回のpve-root逼迫は、
- ログ肥大化
- aptキャッシュ
- 一時ファイルの残骸
のようなものではなく、かなり素直にISOファイルの置き場がroot領域に乗っていたことが原因でした。
2-3. ファイルシステム構成も確認
あわせて、ブロックデバイスとファイルシステムも確認しました。
lsblk -f
この環境では、
-
pve-rootはxfs -
/var/lib/vzはrootファイルシステム上 -
local-lvmは別のLVM-thin領域
という構成でした。
つまり、/var/lib/vz/template/isoにISOを置き続ける限り、pve-rootはずっと消費され続ける状態でした。
3. なぜLVM拡張ではなく、ISO退避を選んだのか
3-1. 原因そのものを消したかった
LVM拡張は対症療法としては有効です。
ただ、今回は「たまたまrootが苦しい」のではなく、「ISOを置く場所がroot直下だった」ことが原因でした。
そのため、rootを大きくするよりも、ISOの置き場を分けたほうが構成として自然でした。
3-2. pve-rootがXFSだった
今回の/はXFSでした。XFSは拡張はしやすいですが、縮小は簡単ではありません。
そのため、何となくrootを広げてしまうより、まずは容量を使っている要因を切り分けて外に出すほうが、後々扱いやすいと考えました。
3-3. 別ディスクは追加できなかった
理想だけで言えば、別SSDや別HDDを追加して、ISO専用ストレージにするのが分かりやすいです。
ただ、今回はその方法が取れませんでした。
そこで、別で動かしているRaspberry Piを使い、NFSサーバーにしてISO保存先にする方針を取りました。
3-4. ISOはNFSへ逃がしやすい
VMディスク本体を低性能なストレージへ置くのは慎重に考えたほうがよいですが、ISOはそこまで高頻度に読み書きするものではありません。
そのため、
- 新規インストール時に読む
- たまに起動メディアとして使う
- 普段は置いてあるだけ
という使い方であれば、NFS上に置いても十分実用的です。
4. ProxmoxのStorage設定をざっくり整理
4-1. localとは
Proxmoxで最初からよく出てくるlocalは、だいたい/var/lib/vzを指すDirectory Storageです。
たとえば、設定ファイルではこんな形になっています。
dir: local
path /var/lib/vz
content backup,iso,vztmpl
つまりlocalは、ファイルベースの保存先です。
ここには、たとえば以下のようなものを置けます。
- ISOイメージ
- バックアップ
- コンテナテンプレート
- snippets
今回問題になっていたのは、このlocalが/var/lib/vzを見ていて、その中のtemplate/isoに大きなISOがたまっていたことでした。
4-2. local-lvmとは何か
一方でlocal-lvmは、LVM-thinを使うストレージです。
たとえば設定はこんな感じです。
lvmthin: local-lvm
thinpool data
vgname pve
content rootdir,images
こちらは主に、
- VMディスク
- コンテナのrootfs
のようなブロックストレージ向けです。
つまり、ざっくり言うと次のようなイメージです。
-
local:ISOやバックアップのようなファイル置き場 -
local-lvm:VMディスク本体の置き場
4-3. 今回やりたかったこと
今回はlocalの中に置いていたISOを、別のNFSストレージへ移して、ISO保存先を分離したかったわけです。
そのため、最終的には次のような形にしました。
-
local:バックアップ、テンプレート用 -
iso-nfs:ISO専用 -
local-lvm:VM/CTディスク用
このように役割を分けると、かなり分かりやすくなります。
5. Raspberry PiをNFSサーバーにする
5-1. OSを確認
最初に、Raspberry Pi側のOSを確認しました。
cat /etc/os-release
uname -a
この環境ではUbuntu 24.04 LTSが動いていました。
Ubuntu系であれば、標準的なNFSサーバーパッケージでそのまま構成できます。
5-2. NFSサーバーパッケージをインストール
次に、NFSサーバーをインストールしました。
sudo apt update
sudo apt install -y nfs-kernel-server
導入後、サービス状態も確認しました。
systemctl status nfs-server --no-pager
この時点では/etc/exportsがまだないためメッセージが出ても問題ありません。後でexport設定を入れれば大丈夫です。
5-3. ストレージの空き容量を確認
ISO置き場として十分な容量があるか確認しました。
lsblk -f
df -hT
今回はRaspberry Pi側に十分な空きがあったため、そのままローカルディスク上にNFS公開用のディレクトリを作ることにしました。
5-4. NFS公開用ディレクトリを作成
公開ディレクトリを作りました。
sudo mkdir -p /srv/nfs/proxmox-iso
sudo chown nobody:nogroup /srv/nfs/proxmox-iso
sudo chmod 0775 /srv/nfs/proxmox-iso
ls -ld /srv/nfs /srv/nfs/proxmox-iso
このあたりはNFSの公開先として使えればよいので、分かりやすいパスにしておくのがおすすめです。
5-5. /etc/exportsを設定
次に、NFS exportを設定しました。
echo '/srv/nfs/proxmox-iso *(rw,sync,no_subtree_check,no_root_squash)' | sudo tee /etc/exports
sudo exportfs -ra
sudo exportfs -v
これで、Raspberry Pi側はNFSサーバーとして公開できる状態になりました。
6. ProxmoxからNFSストレージを追加
6-1. まずはNFS exportが見えるか確認
Proxmox側から、NFS exportが見えるかを確認しました。
showmount -e <NFSサーバーのIPアドレス>
ここで公開ディレクトリが見えれば、ネットワーク上の疎通はひとまずOKです。
6-2. 一時マウントして読み書き
いきなりProxmoxのStorageとして登録する前に、まずは手動マウントして動作確認しました。
mkdir -p /mnt/test-nfs-iso
mount -t nfs <NFSサーバーのIPアドレス>:/srv/nfs/proxmox-iso /mnt/test-nfs-iso
df -hT /mnt/test-nfs-iso
touch /mnt/test-nfs-iso/test-from-proxmox.txt
ls -lah /mnt/test-nfs-iso
この確認をやっておくと、
- マウントできるか
- 書き込みできるか
- 変な権限問題がないか
を先に見られるので安心です。
6-3. ProxmoxにNFS Storageとして追加
問題なかったので、iso-nfsという名前でProxmoxに登録しました。
pvesm add nfs iso-nfs \
--server <NFSサーバーのIPアドレス> \
--export /srv/nfs/proxmox-iso \
--path /mnt/pve/iso-nfs \
--content iso
追加後は、状態を確認しました。
pvesm status
pvesm list iso-nfs
activeで見えていれば、ストレージとして使える状態です。
6-4. Proxmox向けのISOディレクトリを作成
NFSストレージの中に、ProxmoxがISOを認識するためのディレクトリを作成しました。
mkdir -p /mnt/pve/iso-nfs/template/iso
ls -lah /mnt/pve/iso-nfs
ls -lah /mnt/pve/iso-nfs/template
ls -lah /mnt/pve/iso-nfs/template/iso
7. 既存のISOをNFSへ移動
7-1. まずは小さいファイルから移動
最初から巨大ISOを動かすのはちょっと怖いので、まずは小さいファイルから移しました。
mv /var/lib/vz/template/iso/<小さめのイメージファイル> /mnt/pve/iso-nfs/template/iso/
pvesm list iso-nfs
移動後、元の場所から消えていて、NFS側に見えていることを確認しました。
ls -lh /var/lib/vz/template/iso/<移動したファイル>
ls -lh /mnt/pve/iso-nfs/template/iso/<移動したファイル>
7-2. 何本か移した時点で空き容量を確認
途中で、どのくらい効果が出ているかも確認しました。
df -h /
du -sh /var/lib/vz/template/iso
この時点でも、pve-rootの空きはかなり改善していました。
7-3. 残りのISOもまとめて移動
小さいファイルで問題がなかったので、残りのISOも順次移動しました。
mv /var/lib/vz/template/iso/<ファイル名> /mnt/pve/iso-nfs/template/iso/
最終的に、/var/lib/vz/template/isoは空になり、すべてiso-nfs側で見えるようになりました。
確認は次のコマンドで行いました。
ls -lh /var/lib/vz/template/iso
pvesm list iso-nfs
df -h /
du -sh /var/lib/vz/template/iso
その結果、pve-rootの空き容量はかなり戻りました。
8. localからISOを外して運用を整理
8-1. storage.cfgを確認
次に、ProxmoxのStorage設定を確認しました。
cat /etc/pve/storage.cfg
もともとのlocalには、ISOも含まれていました。
dir: local
path /var/lib/vz
content backup,iso,vztmpl
このままだと、またうっかりlocalへISOを置いてしまう可能性があります。
8-2. localからisoを削除
そこで、localからISOを外して、ISOはiso-nfs専用にしました。
まずバックアップを取ります。
cp /etc/pve/storage.cfg /etc/pve/storage.cfg.bak
そのうえで、localのcontentを変更しました。
sed -i 's/content backup,iso,vztmpl/content backup,vztmpl/' /etc/pve/storage.cfg
cat /etc/pve/storage.cfg
結果として、localは次のようになりました。
dir: local
path /var/lib/vz
content backup,vztmpl
これで、今後の運用がかなり分かりやすくなりました。
9. 最後の確認と後片付け
9-1. iso-nfsがactiveか確認
最後に、NFSストレージがちゃんとマウントされているか確認しました。
mount | grep iso-nfs
pvesm status
ここでiso-nfsがactiveで見えていればOKです。
9-2. 一時マウントを片付け
手動テスト用に作った一時マウントポイントは不要なので削除しました。
umount /mnt/test-nfs-iso
rmdir /mnt/test-nfs-iso
ls -ld /mnt/test-nfs-iso
これで後片付けも完了です。
10. まとめ
10-1. 今回やったこと
今回やったことをまとめると、以下の通りです。
-
pve-rootの逼迫状況を確認しました - 原因が
/var/lib/vz/template/iso配下のISO肥大化だと切り分けました - Raspberry PiをNFSサーバーにしました
- ProxmoxにISO専用のNFS Storageを追加しました
- 既存のISOをすべてNFSへ移しました
-
localからisoを外して、ISO保存先を整理しました
10-2. 得られた効果
今回の対応で、pve-rootの空き容量はかなり改善しました。
単純にrootを広げるのではなく、容量を食っている要因を別ストレージへ逃がしたことで、構成も分かりやすくなりました。
特に、
-
localはバックアップやテンプレート向け -
local-lvmはVMディスク向け -
iso-nfsはISO専用
という役割分担できました
10-3. 今後の注意点
この構成で気をつけたいのは、やはりNFSサーバー側です。
- Raspberry Piが落ちるとISOは見えなくなります
- ISOの読み込みはローカルより遅いことがあります
- NFSサーバー側の空き容量も見ておく必要があります
ただ、ISO置き場として割り切るなら、かなり実用的だと思います。
10-4. おわりに
同じような構成で困っている方の参考になれば嬉しいです。
固めていこうと思います。