LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術

第14回 LXCの構築・活用 [2] ― コンテナを作成・構築する

この記事を読むのに必要な時間:およそ 6 分

複数のユーザによるコンテナの作成とネットワーク構成

ここでは,複数のユーザがコンテナを作成することを考えてみます。

Plamo Linuxでは,lxcパッケージをインストールすると,cgroupサブシステムごとにcgroupファイルシステムをマウントするcgroup-mountというinitスクリプトと,LXC用ネットワークブリッジを作成するlxc-netというinitスクリプトは,デフォルトで起動しないようになっています。root権限で,以下の実行して有効にしてください。

~$ sudo chmod +x /etc/rc.d/init.d/cgroups-mount
~$ sudo chmod +x /etc/rc.d/init.d/lxc-net

なお,すでにlibcgroupパッケージをインストールしていて,cgconfigを起動させている場合は,cgroup-mountを起動させる必要はありません。

また,ユーザが書き込めるcgroupを作成するために,以下のinitスクリプトを追加しておきます。

~$ 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

新たなユーザでのコンテナの作成に先立ち,root権限でユーザに対する/etc/{subuid,subgid}の設定を行ってください。200000から65536個のUID/GIDを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/lxc/default.confを用意します。上記で設定した/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

次に,LXCでユーザが使えるネットワークインタフェースの数を設定するため,root権限で/etc/lxc/lxc-usernetを編集します。各ユーザがvethタイプのインタフェースをlxcbr0にアタッチする形で,それぞれ2個利用できるようにします。

~$ cat /etc/lxc/lxc-usernet
taro veth lxcbr0 2
hanako veth lxcbr0 2

これで,コンテナを起動する準備ができました。コンテナを起動するときは,現在実行中のシェルのPIDを,自身のcgroupのタスクに登録します。

~$ for c in /sys/fs/cgroup/* ; do echo $$ > $c/$USER/tasks ; done

いよいよコンテナを起動します。Plamo Linuxのデフォルト設定では,セキュリティ確保のため,inetd経由で起動するサービスについて,外部からのリクエストはすべて拒否されるようになっているので,コンテナ内の/etc/hosts.allowを適切に設定するのを忘れないでください。

iptablesのNAT(IPマスカレード)機能を利用する方法

Plamo LinuxのLXCパッケージで,デフォルトで用意されているネットワーク構成です。上記の手順に従ってコンテナを作成すれば,ネットワークの設定はすでに出来上がっています。

図1 NAT機能を介して物理NICに接続

図1 NAT機能を介して物理NICに接続

ホストOSの物理NICが有線/無線にかかわらず,ネットワークを利用することができます。

外部と通信する際は,図1のようにNAT機能を介して物理NICに接続します。複数のコンテナがホストOSのIPアドレスを共有するため,コンテナから外部のサーバに接続することはできますが,外部のサーバからコンテナに接続することはできません。

物理NIC(有線)を仮想ブリッジに接続する方法

外部のサーバからコンテナに接続する必要がある場合は,図2のようにホストOSの物理NIC(有線)に,仮想ブリッジを接続する構成にします。

図2 物理NIC(有線)を仮想ブリッジに接続

図2 物理NIC(有線)を仮想ブリッジに接続

ホストOSでのネットワークの設定は,あらかじめ以下のように設定しておきます。br0という仮想ブリッジを作成し,これに対してホストOS用のIPアドレスを与えています。ネットワーク設定用rcスクリプト/etc/rc.d/rc.inet1.tradnetの適切な場所に入れておくと良いでしょう。

~$ 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.network.hwaddrの"xx:xx:xx"の部分は,lxc-createコマンドを実行するとランダムな値に変換して,コンテナの設定ファイル~/.local/share/lxc/<コンテナ名>/configにコピーされます。なお,DHCPサーバにMACアドレスを登録する必要がある場合は,このMACアドレスを登録してください。同一セグメント内で重ならない好きな値に書き換えて,登録することもできます。

LXCでは,MACアドレスのベンダコードを"00:16:3e"として使うように,慣習的に決まっています。このベンダコードは,Xenで専用OUIとしてIEEEでリザーブされています。LXCでは,Xenの専用OUIを間借りしている形になっていますが,今のところは特に問題ないでしょう。ちなみに,QEMU/KVMでは,MACアドレスのベンダコードを"54:52:00"として使うように,慣習的に決まっているようです。こちらは,専用OUIとしてまだ登録されていません。

この接続方法は,外部のサーバからコンテナに接続することができるので,コンテナ内にサーバを設置する場合などに有効です。ただし,ホストOSの物理NICが無線の場合には使えないことに注意してください。

物理NIC(無線)を仮想ブリッジに接続する方法

仮想ブリッジは,ホストOS上に仮想的なレイヤ2スイッチを構成して,レイヤ2のフレーム交換を行う機能です。しかし,無線LANでつながっている場合,レイヤ2レベルの転送をサポートしていないため,簡単にブリッジ接続を構成することができません。

そこで,tunctluml_utilitiesパッケージ)⁠parproutedparproutedパッケージ)⁠bcrelaypptpdパッケージ)を使って,図3のようにホストOSの物理NIC(無線)に,仮想ブリッジを接続する構成にします。

図3 物理NIC(無線)を仮想ブリッジに接続

図3 物理NIC(無線)を仮想ブリッジに接続

ホストOSでのネットワークの設定は,あらかじめ以下のように設定しておきます。tap0というtapデバイスを作成,仮想ブリッジbr0tap0をブリッジし,br0にDHCPレンジ外のスタティックIPアドレスを付与して起動します。そして,parproutedwlan0に飛んできたARPリクエストをbr0にも転送,bcrelayでブロードキャスト(DHCP情報)をリレーするようにしていますparproutedは,マルチキャストトラフィックに対応していないためです)⁠ネットワーク設定用rcスクリプト/etc/rc.d/rc.inet1.tradnetの適切な場所に入れておくと良いでしょう。

~$ 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のネットワーク設定は,物理NIC(有線)を仮想ブリッジに接続するときと同じです。

まとめ

今回は,lxc-createコマンドを使ってコンテナを作成するときの,root権限と一般ユーザ権限での動作の違いや,複数ユーザによるコンテナの作成,状況に応じたネットワークのいろいろな構成などを紹介しました。これらは,特にPlamo Linuxに依存した内容ではありませんので,他のディストリビューション上でも応用できると思います。ぜひお試しください。

次回は,コンテナ内でサウンドを取り扱う方法について紹介します。お楽しみに。

著者プロフィール

田向正一(たむきしょういち)

本業では,Linuxベースのクラウドシステムを開発する傍ら,いろいろなOSSコミュニティに首を突っ込んでいます。昨年あたりから,LXCの開発に参加するようになりました。vi ()をこよなく愛し,プログラミングからMIDIデータの打ち込みまで,viを使った生活環境にどっぷり浸っています。Plamo Linuxメンテナ。これからの世代の人たちに,UNIX/Linux文化の楽しさを広く伝えることを目標としています。

※ nviです。vimではありません。

コメント

コメントの記入