LXDを使っていると非特権コンテナであってもホストとコンテナ間で気軽にファイルを共有したいことがよくあります。今回はその手順をまとめておきましょう。
LXDと非特権コンテナ
LXDはかんたんにシステムコンテナを構築できるツールです。
用途の違いからDockerとLXDは排他的ではなく、
LXDでは原則として
コンテナ上でのプロセス UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jun08 ? 00:00:12 /sbin/init root 47 1 0 Jun08 ? 00:00:02 /lib/systemd/systemd-udevd root 48 1 0 Jun08 ? 00:00:09 /lib/systemd/systemd-journald ubuntu 29285 1 0 17:52 ? 00:00:00 /lib/systemd/systemd --user ubuntu 29286 29285 0 17:52 ? 00:00:00 (sd-pam) ubuntu 29334 29283 0 17:52 ? 00:00:00 sshd: ubuntu@pts/0 ホスト上でのプロセス UID PID PPID C STIME TTY TIME CMD 165536 4288 4226 0 Jun08 ? 00:00:12 /sbin/init 165536 4496 4288 0 Jun08 ? 00:00:02 /lib/systemd/systemd-udevd 165536 4498 4288 0 Jun08 ? 00:00:09 /lib/systemd/systemd-journald 166536 12123 4288 0 17:52 ? 00:00:00 /lib/systemd/systemd --user 166536 12127 12123 0 17:52 ? 00:00:00 (sd-pam) 166536 12177 12120 0 17:52 ? 00:00:00 sshd: ubuntu@pts/0
ホスト上では、
実際にどの値にマッピングされるかは、
- デスクトップ版:コンテナ内部のUID/
GIDの0から65535は、 ホスト上では165536から231071にマッピングされる - サーバー版:コンテナ内部のUID/
GIDの0から65535は、 ホスト上では100000から165535にマッピングされる
本連載でも第475回や第416回などで、
LXDコンテナ環境の準備
まずはLXD環境を構築しましょう。LXDはUbuntu 16.
最初にLXDをインストールします。サーバー版のUbuntu 16.
$ sudo apt install lxd
インストールと同時にlxdグループが作成され、sudo
を実行できるユーザーは自動的にlxdグループに所属します。グループの変更を反映するために、sudo
なしにlxc
コマンドを実行できるようになります。
次にLXDの初期設定を行います。LXDはsudo lxd init
」
$ sudo lxd init
基本的に既定の設定をそのままOKしていくだけです。詳しいことはUbuntu Weekly Recipeの第459回の2ページ目を参照してください。
次にUbuntu 16.
$ lxc init ubuntu:16.04 sample sample を作成中 $ lxc start sample $ lxc exec sample -- sudo -iu ubuntu ssh-import-id lp:(Launchpadのアカウント) $ lxc list +---------+---------+--------------------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +---------+---------+--------------------------------+----------------------------------------------+------------+-----------+ | sample | RUNNING | 10.101.57.183 (eth0) | fd2f:cd:157d:2362:216:3eff:fe5e:6952 (eth0) | PERSISTENT | 0 | +---------+---------+--------------------------------+----------------------------------------------+------------+-----------+
これでコンテナは完成です。Ubuntuコンテナは最初からOpenSSHサーバーが動いています。ただしubuntuユーザーのパスワードがロックされているためそのままではログインできません。そこでssh-import-id
コマンドで、
lxc fileコマンドを使ったファイルの受け渡し
ホストから特定のコンテナとのファイルを受け渡ししたいのであれば、lxc file
コマンドが使えます。
コンテナからファイルを取得する $ lxc file pull コンテナ名/フルパス 保存先 コンテナにファイルを渡す $ lxc file push ファイル コンテナ名/フルパス
気をつけなければいけないのは、/etc/
ならsample/
」-r
」cp
コマンドなどと同じく送信元のファイル
lxc file push
の場合、-p
」--uid
」--gid
」--mode
」
非特権コンテナであってもlxc file
コマンドを使う限り、lxc file
だけで十分です。特に別ホストにいるコンテナ
ちなみにlxc file
にはファイルを削除するlxc file delete
やホスト上のテキストエディターでコンテナのファイルを編集できるlxc file edit
コマンドもあります。特に後者は、
ホストのディレクトリーツリーをbind mountする
名前空間による制限により、
$ lxc config device add sample share disk source=/srv/shared path=/srv/shared
上記のコマンドはホストの/srv/
source=
オプション)/srv/
path=
オプション)/srv/
を共有できるというわけです。
lxc config
による設定は永続的に反映されますので、
$ lxc config show sample (中略) devices: nfsdir: path: /srv/shared source: /srv/shared type: disk (後略)
この方法のメリットは、
ただしlxc file
と異なり、
ホストとコンテナでUID等を一致させる
bind mountによる共有ディレクトリを使う場合、
UID等のマッピングは/etc/
、/etc/
ファイルで管理しています。UID=1000、
$ echo "root:1000:1" | sudo tee -a /etc/subuid $ echo "root:1000:1" | sudo tee -a /etc/subgid
このうちroot
は今回設定したUID等のマッピングを許可するユーザーです。LXDの場合はrootがコンテナ起動時にマッピングを行うのでroot
にしています。書式はUSER:START:COUNT
」1
」100
」
コンテナ内部のマッピングに関する設定は、
$ lxc config set sample raw.idmap 'both 1000 1000'
「both
」both HOST_
」HOST_
にはホスト上のUID/CONTAINER_
にはHOST_
をコンテナの中にマップした時のIDを記述します。言い換えると
もしUID/both
のかわりにuid
やgid
を使います。
ホスト上のUID=1010をコンテナ上ではUID=1000として扱いたい場合 uid 1010 1000 ホスト上のGID=1011をコンテナ上ではGID=1000として扱いたい場合 gid 1011 1000
uid
とgid
を同時に設定したい場合は、
$ echo -e "uid 1010 1000\ngid 1011 1000" | lxc config set xenial raw.idmap -
ハイフンをつないで範囲を指定することも可能です。この場合、
変更した設定を反映するには、
これらを組み合わせれば、