kWatanabe 記事一覧へ

kWatanabe の 技術帖

某企業でOSや仮想化の研究をやっているインフラ系エンジニア。オンプレとクラウドのコラボレーションなど、興味ある技術を綴る。

Proxmox VEのLXCでホストにあるISOをマウントする

  • Proxmox VEのLXCゲストは、ホストに保存されているISOファイルをマウントできない
  • メディアからaptやyumをしたい場合など、ニッチだけど地味に困る
  • ホストに保存されているISOの中身を、LXCゲストに見せる方法を整理する

検証環境

  • Proxmox VE 6.3

Proxmox VEでは、LXCゲストでISOをマウントできない

Proxmox VEは、KVMゲストにISOファイルをマウントさせることはできるが、LXCゲストではWebインタフェースに項目が無く、マウントさせることはできない。

LXCでは、ISOからOSをインストールする必要が無いため、割り切った仕様にしているのだとは思うが、DVDメディアやISOファイルをリポジトリとして yum や apt を使いたい場合に困る*1

ダメな例1

Webインタフェースで設定する代わりに、以下のように/etc/pve/lxc/<VMID>.confに設定を書き込んでも、エラーになりゲストが起動しなくなる。

mp0: /path/to/isofile,mp=/path/to/mountpoint,ro=1 ★ダメな例1★

ダメな例2

Porxmox VE のLXCゲストの設定ファイルには、通常のLXCのオプションをそのまま書くこともできるので、以下のようにloopマウントをやりたくなるが、これもうまくいかない。なお、bindマウントはできる。

lxc.mount.entry = /path/to/isofile path/to/mountpoint iso9660 loop,nofail,ro 0 0 ★ダメな例2★

ISOファイルをLXCゲストに送り込んで、ゲストの中からloopマウントする方法も考えられるが、これは Permission Denied になる。回避するためには、apparmorの設定を緩めたうえで、特権コンテナにし、さらにケーパビリティを調整しないといけない(ケーパビリティに関しては過去記事参照)。

kwatanabe.hatenablog.jp

素のLXCならともかく、Proxmox VE のようなプラットフォームでホストの設定を変えると、不具合の原因になりかねないので避けたい。

解決策

「ダメな例2」でしれっと書いたが、bindマウントはできる。そこで、力業だけどもホストでloopマウントして、そのディレクトリをbindマウントして投影すればよい。

なお、loopマウントのマウントポイントをbindマウントのマウント元に指定しないと、ISOファイルの中身は見えない。横着して、複数のマウントポイントを集めた親ディレクトリをbindマウントしてもISOの中は見えない。

最終的にはホストで以下のようにする。

  • ISOファイルをloopマウント
$ sudo vim /etc/fstab
/path/to/isofile /path/to/mountpoint-host iso9660 ro,loop,nofail 0 0
$ sudo vim /etc/pve/lxc/<VMID>.conf
lxc.mount.entry = /path/to/mountpoint-host path/to/mountpoint-guest none ro,bind,nofail 0 0

これで、ISOファイルの中身がゲストでも中身が見えるようになる。なお、Readonlyとはいえど、ホストとゲストの間で穴を開けることになるので、セキュリティ面では大変よろしくない。使い終わったら、さっさと元に戻すのが吉。

おわりに

  • Proxmox VEでは、LXCゲストにISOファイルをマウントする手段を提供していない
  • ゲストの中からマウントするには、セキュリティ設定をかなり調整しないとダメ
  • ホストでloopマウントしてから、bindマウントすれば間接的にISOファイルをマウントできる
  • セキュリティ面では大変宜しくないため、使い終わったら元に戻すこと

*1:CentOS 7のEverything ISOを使う時とか、ISOの中身をHTTPで公開してPXEサーバを作りたい時とか、ニッチだけど地味に困る