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(無線)を仮想ブリッジに接続する方法
仮想ブリッジは、
そこで、tunctluml_パッケージ)、parproutedparproutedパッケージ)、bcrelaypptpdパッケージ)
ホスト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コマンドを使ってコンテナを作成するときの、
次回は、