Plamoテンプレートを使ったコンテナの作成
前回、lxc-plamo
)lxc-create
コマンドを使ってコンテナを作成するときに使われます。以下のように実行するのでしたね。
~$ sudo lxc-create -n ct01 -t plamo
これで、ct01
という名前のPlamoコンテナ環境が作成されました。このコンテナは、
コンテナの作成に先立ち、/etc/{subuid,subgid}
の設定が必要です。ここでは、taro
というユーザに割り当てます。
~$ sudo usermod -v 100000-165535 -w 100000-165535 taro ~$ cat /etc/subuid taro:100000:65536 ~$ cat /etc/subgid taro:100000:65536
また、lxc-create
コマンド実行時に読み込まれるtaro
ユーザ用のデフォルトファイル~/.config/
)
~$ cat ~/.config/lxc/default.conf lxc.id_map = u 0 100000 65536 lxc.id_map = g 0 100000 65536 lxc.network.type = veth lxc.network.link = lxcbr0 lxc.network.flags = up
これらの非特権コンテナに関する詳細は、
~$ lxc-create -n ct01 -t plamo This template can't be used for unprivileged containers. You may want to try the "download" template instead. lxc_container: container creation template for ct01 failed lxc_container: Error creating container ct01
コンテナの作成に失敗してしまいました。そうです。一般ユーザ権限では、
~$ lxc-create -n ct01 -t download -- -d plamo -r 5.x -a amd64
アーキテクチャにamd64
と指定するあたりは、
LXCのダウンロード用サーバから、lxc.
で設定したユーザ名前空間内で)
一般ユーザ権限で作成したコンテナ環境
ダウンロードした作成済みコンテナイメージは、lxc-plamo
)
まず、
lxc-create
コマンドを実行すると、lxc-usernsexec
コマンドの引数として、lxc.
で設定したユーザ名前空間内で、root
としてタスクが実行されます。その結果、lxc.
で設定したユーザ名前空間内にマッピングしたUID/
なお、lxc.
で設定したユーザ名前空間において、mknod
は実行できません。そのため、mknod
の実行をともなう処理はスキップして展開されます。代わりに、/usr/
)
このように、
Plamoコンテナイメージのバリアント
現在、default
とmini
が用意されています。先に示した例では、default
バリアントのコンテナイメージが使われます。一般ユーザ権限で、mini
バリアントのコンテナ環境を作成する場合は、
~$ lxc-create -n ct01 -t download -- -d plamo -r 5.x -a amd64 --variant=mini
また、large
バリアントとfull
バリアントのコンテナイメージも用意されています。以下のように実行することで、
~$ lxc-create -n ct01 -t download -- -d plamo -r 5.x -a amd64 --variant=large \ > --server=repository.plamolinux.org --keyid=0xC0B578C84772EC0D
各バリアントのパッケージ構成は以下のようになっています。
バリアント | 作成済みコンテナイメージのパッケージ構成 | サイズ |
---|---|---|
default |
00_ と01_ カテゴリのパッケージを収録し、 |
約240MB |
mini |
00_ ~03_ カテゴリのパッケージを収録し、 |
約475MB |
large |
00_ ~05_ カテゴリのパッケージを収録した構成 |
約1. |
full |
00_ ~10_ すべてのカテゴリとcontrib の一部のカテゴリのパッケージを収録した構成 |
約3. |
large
バリアントやfull
バリアントはサイズが大きく、
コンテナの初期パスワード
前回のlxc-create
コマンドを使ってPlamoコンテナを作成すると、root
のパスワードが暫定的に"root
"に設定されます。この仕様は、
LXCの開発当初は、
この問題を受けて、
ただし、
筆者は、lxc-create
コマンドからテンプレートが呼び出されて、
一方、
- 作成済みコンテナイメージのパスワードを一律無効化にする
- ダウンロードテンプレートをメインのLXCソースツリーで管理しない
パスワードの一律無効化は、
メインのLXCソースツリーで、
いずれにしても、
複数のユーザによるコンテナの作成とネットワーク構成
ここでは、
Plamo Linuxでは、cgroup-mount
というinitスクリプトと、lxc-net
というinitスクリプトは、
~$ sudo chmod +x /etc/rc.d/init.d/cgroups-mount ~$ sudo chmod +x /etc/rc.d/init.d/lxc-net
なお、libcgroup
パッケージをインストールしていて、cgconfig
を起動させている場合は、cgroup-mount
を起動させる必要はありません。
また、
~$ cat /etc/rc.d/init.d/cgroups-mount-user #!/bin/sh # mount cgroup filesystems per subsystem for user name space USERNS="taro hanako" start() { echo 1 > /sys/fs/cgroup/memory/memory.use_hierarchy for c in /sys/fs/cgroup/* ; do echo 1 > $c/cgroup.clone_children for u in $USERNS ; do mkdir -p $c/$u chown -R $u $c/$u if [ ${c##*/} == cpuset ] ; then echo 0 > $c/$u/cpuset.cpus echo 0 > $c/$u/cpuset.mems fi done done } stop() { : } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0
新たなユーザでのコンテナの作成に先立ち、/etc/{subuid,subgid}
の設定を行ってください。200000から65536個のUID/hanako
というユーザに割り当てます。
~$ sudo usermod -v 200000-265535 -w 200000-265535 hanako ~$ cat /etc/subuid taro:100000:65536 hanako:200000:65536 ~$ cat /etc/subgid taro:100000:65536 hanako:200000:65536
また、lxc-create
コマンド実行時に読み込まれるhanako
ユーザ用のデフォルトファイル~/.config/
)/etc/{subuid,subgid}
の設定と合うように設定してください。
~$ cat ~/.config/lxc/default.conf lxc.id_map = u 0 200000 65536 lxc.id_map = g 0 200000 65536 lxc.network.type = veth lxc.network.link = lxcbr0 lxc.network.flags = up
hanako
ユーザのコンテナを作成します。
~$ lxc-create -n ct01 -t download -- -d plamo -r 5.x -a amd64
次に、/etc/
を編集します。各ユーザがveth
タイプのインタフェースをlxcbr0
にアタッチする形で、
~$ cat /etc/lxc/lxc-usernet taro veth lxcbr0 2 hanako veth lxcbr0 2
これで、
~$ for c in /sys/fs/cgroup/* ; do echo $$ > $c/$USER/tasks ; done
いよいよコンテナを起動します。Plamo Linuxのデフォルト設定では、/etc/
を適切に設定するのを忘れないでください。
iptablesのNAT(IPマスカレード)機能を利用する方法
Plamo LinuxのLXCパッケージで、

ホストOSの物理NICが有線/無線にかかわらず、
外部と通信する際は、
物理NIC(有線)を仮想ブリッジに接続する方法
外部のサーバからコンテナに接続する必要がある場合は、

ホストOSでのネットワークの設定は、br0
という仮想ブリッジを作成し、/etc/
)
~$ sudo ip link set dev eth0 up promisc on ~$ sudo brctl addbr br0 ~$ sudo brctl addif br0 eth0 ~$ sudo dhclient br0
各ユーザのLXCのネットワーク設定を以下のように変更します。
~$ cat ~/.config/lxc/default.conf | grep network lxc.network.type = veth lxc.network.link = br0 lxc.network.flags = up lxc.network.hwaddr = 00:16:3e:xx:xx:xx
lxc.
の"xx:xx:xx
"の部分は、lxc-create
コマンドを実行するとランダムな値に変換して、~/.local/
)
この接続方法は、
物理NIC(無線)を仮想ブリッジに接続する方法
仮想ブリッジは、
そこで、tunctl
uml_
パッケージ)、parprouted
parprouted
パッケージ)、bcrelay
pptpd
パッケージ)

ホストOSでのネットワークの設定は、tap0
というtapデバイスを作成、br0
とtap0
をブリッジし、br0
にDHCPレンジ外のスタティックIPアドレスを付与して起動します。そして、parprouted
でwlan0
に飛んできたARPリクエストをbr0
にも転送、bcrelay
でブロードキャストparprouted
は、/etc/
)
~$ sudo ip link set dev wlan0 up ~$ sudo brctl addbr br0 ~$ sudo tunctl -t tap0 ~$ sudo brctl addif br0 tap0 ~$ sudo ip addr add 192.168.1.100/24 dev br0 ~$ sudo ip link set dev br0 up ~$ sudo parprouted wlan0 br0 ~$ sudo bcrelay -d -i br0 -o wlan0 ~$ sudo wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlan0 ~$ sudo dhclient wlan0
各ユーザのLXCのネットワーク設定は、
まとめ
今回は、lxc-create
コマンドを使ってコンテナを作成するときの、
次回は、