共有ホストディレクトリをLXC / LXDコンテナに追加する


19

私はUbuntu 14.04でLXC / LXDを実験してきましたが、すべてうまく機能しています。ホストマシンとコンテナの間で共有ディレクトリを機能させる方法を理解するだけで、Virtualboxを完全に捨てることができます。

私はこのページを見ました:https : //wiki.gentoo.org/wiki/LXD

これは手順を提供しますが、エラーが発生し続けます。

誰もがこれを機能させるための簡単で明確な指示を知っていますか?助けていただければ幸いです。


2
を使用してホストディレクトリをマウントできましたlxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared。しかし、コンテナ上のディレクトリを見ると、そこにあるファイルの所有者とグループは「nobody」と「nogroup」に設定されており、マウントは読み取り専用です。
user47227

もう少し詳細を追加していただけますか?正確に何をしたのか、何を達成したいのか、何が起こったのか?警告またはエラーメッセージが表示されましたか?あなたの質問でそれらを完全に再現してください。Ubuntuでターミナルコンテンツとほとんどのダイアログメッセージを選択、コピー、貼り付けできます。(参照?どのように私は良い質問をしてください
デビッド・フェルスター

特権のないコンテナを使用しており、UID / GIDマッピングが問題であると仮定して、LXDでのusernsマッピングに関する記事のこのセクションをご覧ください。ただし、これはおそらく質問をした後にLXDの方法に追加されたものです。
0xC0000022L

私はこれを追加したバージョンを知らない(私は2.18によ)が、可能であれば、あなたも使用することができますlxc file使用して、ホストと容器との間でファイルを転送するpushpull
code_dredd

回答:


21

あなたが言及しているhttps://wiki.gentoo.org/wiki/LXDの指示は正しいですが、もう少し説明が必要な場合があります。

ホストでは、最初にコンテナデータが保存されているディレクトリの所有権を確認します。走る

sudo ls -l /var/lib/lxd/containers

ディレクトリを共有するコンテナの所有者を確認します。私の場合uidgidの両方が100000でした。

次に、これらを使用して、共有するディレクトリの所有権を変更します。

sudo chown 100000:100000 /tmp/share_on_host

コメントで指定した方法で、ディレクトリをコンテナと共有します。

lxc config device add mycontainer sharedtmp disk \
                  path=/tmp/share_on_guest source=/tmp/share_on_host

これで、コンテナ内で、ディレクトリがディレクトリ/tmp/share_on_guestによってマウント/tmpされていることがわかります(ディレクトリは他のシステムに使用され、特別な権限を持っているため、ディレクトリをマウントすることはお勧めしません)。ここから上で使用することができchown、適切なに所有権を変更するには、コンテナにuidし、gidコンテナ内のユーザーのために。

補足として、コンテナの所有権をたとえばuid33のユーザーに変更すると、ホスト上でuid100033 が表示されます。これはまったく理にかなっています。


それが自分のセットアップかどうかはわかりませんが、LXD v3.0.3 LTS(Ubuntu 18.04 LTS)では/var/lib/lxd/containers、その中に示されているシンボリックリンクしか見つかりませんでした/var/lib/lxd/storage-pools/lxd/containers(この場合、最後のlxdビットは私のZFSストレージプールの名前です)。そこにあるすべてのコンテナは、実行時に同じ165536 uid / gidを持ち、root:rootオフ時に所有されているように見えました。
deoren

1
これは古い質問と回答であることに気づきましたが、Ubuntu 18.04では、許可を台無しにする必要はまったくありませんでした。フォルダーを追加するだけでlxc config、魅力的に機能しました!
Apache

4

この質問に対する更新された回答を次に示します。

コンテナの/var/wwwよう/var/testにホストフォルダをマウントします。

lxc config device add mycontainer vartest disk source=/var/www path=/var/test

Ask Ubuntuへようこそ!この回答を編集して、これを行う方法に関する具体的な詳細を追加することをお勧めします。(AskUbuntuでどのような回答が最も価値があると考えられるについての一般的なアドバイスについては、「よい回答を書くにはどうすればよいですか?」も参照してください。)
David Foerster

3

追加を割り当てることができます デバイスをコンテナに、これらはホストがアクセス可能なフォルダーにすることができます。

$ lxc config ## display help
...
lxc config device add [<remote>:]<container> <device> <type> [key=value...]
    Add a device to a container.
...

<device>これは割り当てた任意の名前であり、以降のデバイス管理のIDとして使用されることに注意してください。

たとえば、ホストフォルダー「./host」を「/ mnt / host」としてコンテナーにマウントするには...

lxc config device add mycontainer vartest disk source=$(pwd)/host path=/mnt/host

問題が1つ残っています。このフォルダーをホストとコンテナーの両方で書き込み可能にする場合は、それに応じて所有権とアクセス許可を構成する必要があります。これは、ユーザーおよびグループのid値の数値範囲を仮想化するLXDのデフォルトモードでは複雑です。 ただし、簡単な解決策があります。ホストと同等の特権で実行するようにコンテナを構成することにより、この仮想化をバイパスします...

lxc config set <container> security.privileged true

現時点では、このアプローチのホストとセキュリティの完全な関係は不明ですが、仮想化には多少「含まれている」ように思われます。実際のリスクは、コンテナを使用する方法と理由によって異なります。テクニカルノートをご覧くださいhttps://insights.ubuntu.com/2017/06/15/custom-user-mappings-in-lxd-containersのください

さらに、この方法は、通常、コンテナでroot以外のユーザーとして操作する場合に最適です。

lxc exec zesty -- su --login ubuntu

非ルートログインに問題があります。env特にが異なりますhttp_proxy。回避策の例:sudo http_proxy=http://[fe80::1%eth0]:13128 apt-get update
nobar

について http_proxyここで議論するようにおそらくIPV4を有効にするのがより簡単な解決策だと思います
nobar

...続くsudo dhclientまたは変更-コンテナ内manualdhcp50-cloud-init.cfg。ここでいい手がかり:github.com/lxc/lxd/issues/1298
nobar

1
これは明らかに悪い考えです。特権コンテナに切り替えることを推奨すると、LXDがもたらした非常に進歩した機能の1つを覆します。LXC 1.xは特権のないコンテナを使用する可能性も提供しましたが(そしてもちろん、rootとしても)、詳細を整理するのは少し複雑でした。LXDでは、これは過去のものになりました。また、ホスト側UIDに必要なアクセスを許可したりここで説明した方法を使用たりするためにいくつかのフォルダーにACLを設定することについて何がそんなに複雑なのでしょうか?UID / GIDのマッピングが唯一の方法ではありません!
0xC0000022L

1

ph0t0nix優れた答えに基づいて、Ubuntu 18.04サーバーに次の段階的なアプローチを提案します。

  1. ホストでrootfsの所有者のUIDを決定します。

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. コンテナでubuntuのUID(つまり、コンテナ内のユーザー)を決定します。

    id -u ubuntu    1000
  3. ホストに共有フォルダーを作成し、コンテナーに追加します。

    lxc config device add webserver mydevicename disk path=/home/share_on_guest source=/home/share_on_host
  4. 共有フォルダーのホストUIDで調整します(UID = UIDホスト+ゲストUID):

    sudo chown 101000:101000 /home/share_on_host
  5. ゲスト(ユーザーUbuntu)は共有フォルダーにアクセスできるようになり、コンテナー内で共有フォルダーへのアクセスを調整できます chmod


0

LXDプロファイルを使用して、コンテナとホストのUIDとGID間のマッピングを処理する、この問題に対する有効で安全なソリューションができました。

非常に便利な要点はここにあります:

https://gist.github.com/bloodearnest/ebf044476e70c4baee59c5000a10f4c8


5
物事を誰でも書き込み可能にすることは、通常、セキュリティの観点からは悪い考えであることに注意してください。ホストパスでPOSIX ACLを使用し、そのuidに特定のACLを追加することでコンテナーのユーザーにアクセスを許可し、さらに書き込みアクセスが必要な他のホストユーザーにアクセスを許可する必要があります。
stgraber

1
@stgraberはあなたの言ったことに同意しますが、それを設定する方法がわかりません。いくつかのリンクが役立ちます。
s3v3n

0777明確な理由がない限り、別名「please-hack-my-system-and-destroy-my-data」権限を推奨しないでください!(グループ)所有権を変更するなど、より賢明な変更を加えることで回避できるため、その理由はほとんどありません。-1
デビッド・フェルスター

私はあなたの主張を引き合いに出しますが、それを機能させる他の方法がない場合に、それをシングルユーザー開発マシンの一時的な回避策としてのみ使用しました。それ以来、プロファイルを使用することがこれを処理する方法であることを発見しました。上記の編集済みの回答を参照してください!
user47227

1
ACLまたはここで説明し方法を使用するのが難しいのは何ですか?
0xC0000022L
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.