LXCコンテナとホスト間でディレクトリを共有するにはどうすればよいですか?


14

ホストシステム(ubuntu 14.04)とubuntu lxcコンテナー間でフォルダーを共有するにはどうすればよいですか?

ホストにフォルダーをマウントしてみました:

sudo mount --bind /media/data/share /media/data/container/name/rootfs/share

しかし、ファイルが表示されません。

同じことが次の場合にも当てはまります。

sudo ln -s /media/data/share /media/data/container/name/rootfs/share

共有フォルダーのアクセス許可を変更する必要がありますか?

回答:


12

openSUSE wikiで記事を見つけました:https ://en.opensuse.org/User:Tsu2/ LXC_mount_shared_directory

私は手順に従いましたが、現在は機能しています。

ホストディレクトリを作成します。

mkdir /media/data/share && chmod 7777 /media/data/share

lxcコンテナーにディレクトリを作成します。

mkdir /share

ホスト上のlxc設定ファイルを編集します。

nano /var/lib/lxc/containername/config
lxc.mount.entry = /media/data/share share none ro,bind 0.0

そのマウントエントリを読み取り専用として定義する理由はありますか?コンテナが共有ファイルシステムにデータを書き戻すことを避けるのは、それはセキュリティ上の良い習慣ですか?
jgomo3

1
私のために働いた。で使用される相対パスが重要shareであることに注意してくださいlxc.mount.entry
HRJ 16

1
'bind'の後に '、create = dir'を追加する場合、マウントポイントを作成する必要はありません。「ro」部分も削除しましたが、うまく機能しているようです。
サム・ブル

12

LXCドキュメントによると、これは特権コンテナを介して実行できます。

lxc launch ubuntu priv -c security.privileged=true
lxc config device add priv homedir disk source=/home/$USER path=/home/ubuntu

LXCではなく、LXDのドキュメントです。LXDをインストールしていない場合、lxcコマンドは機能しません。
サム・ブル

@SamBullよく、これはLXC / LXDチームによって自己負担されます。LXCはlxd、この回答で使用されているliblxc(基盤となるライブラリ)またはLXDクライアント(名前付き)、またはLXC(ソフトウェアおよび「lxc-*名前付き」ツールを備えた「古い」ツールセット)またはプロジェクト(LXC LinuX Containersの略です)。それが、Unix.SEメタでこの質問をした理由です。
0xC0000022L

4

以下は、ホストディレクトリの1つをコンテナにマウントするために行ったことです。達成したいので、これは思ったよりもトリッキーです

  • コンテナ内で、ディレクトリに書き込むことができるはずです。
  • コンテナの外側で、コンテナ内に作成されたファイルとディレクトリに書き込むことができるはずです。

さまざまな記事をオンラインで読んだ後(最も役立つのはこのgithubの問題です)、これをどのように解決するかを以下に示します。トリックは、ホストユーザーのuidとgidをコンテナー内のユーザーのuidとgidにマップすることです。

/home/breakds/projectsコンテナ内のまったく同じ場所にマウントするとします。外部ディレクトリはbreakds、uidとgidがのユーザーが所有しています1000

次に、という名前のコンテナにユーザーを作成しました。そのユーザーのdebianuidとgidも偶然です1000(最初の非rootユーザーであるため)。次に、ホスト上で(lxc)プロファイルを作成します。

lxc profile edit breakds

以下はプロファイルの内容です(yaml形式であると思います)。

name: breakds
config:
    raw.lxc: |
        lxc.id_map =
        lxc.id_map = u 0 165536 999
        lxc.id_map = g 0 165536 999
        lxc.id_map = u 1000 1000 1
        lxc.id_map = g 1000 1000 1
        lxc.id_map = u 1001 166537 64535
        lxc.id_map = g 1001 166537 64535
    user.vendor-data: |
        packages:
            - bash
description: allow home dir mounting for breakds
devices:
eth0:
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
projects:
    path: /home/breakds/projects
    source: /home/debian/projects
    type: disk

次に、このプロファイルをそのコンテナに永続的に適用します。

$ lxc profile apply <my container> breakds

これでうまくいくはずです。

:このプロファイルに切り替える前に、所有者/グループがdebianであるすべてのディレクトリまたはファイルを削除する必要があることに注意してください(おそらく切り替え後に再作成されます)。これは、uidおよびgidマッピングの後、それらの所有権が無効になるためです。私はもともと私は1000から1000にすべてをマッピングしているのでうまくいくと思っていましたが、ここで何かを見逃したと思います。ハックなしでこれを解決する方法について誰かがアドバイスできれば素晴らしいと思います。


ただしchown、ホストからいつでもできます。
iBug

1

LXC設定ファイルを直接編集することにより、LXDなしでこれを行うこともできます。

# Container specific configuration
lxc.idmap = u 0 165536 1000
lxc.idmap = g 0 165536 1000
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
lxc.idmap = u 1001 166536 64535
lxc.idmap = g 1001 166536 64535

また、/ etc / subuidと/ etc / subgidを編集して、コンテナのユーザーのアカウントに、ホスト上のuid / gid 1000にマップする許可が与えられていることを確認する必要があります。

containeruser:165536:65536
containeruser:1000:1

どのシステムが/ etc / subuidを処理/作成しましたか?Openwrtにはありません。
mcr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.