モチベーション

OpenStackやらDockerやらLinux Container技術を使うサービスが増えて来たので根幹となる技術を理解したい.

LXCとは

LXCには広義ではLinux Kernelの標準機能を使って実現するコンテナを指すが,狭義にはlinuxcontainers.org で開発されているコンテナを扱うためのソフトウェアを指し,以降では,LXCと書いたらコンテナツールを指していると理解して頂きたい.

コンテナを実現する根幹技術

Linux Containerを実現している技術で代表的なのがcroupとnamespaceである.ここに簡潔に書かれていた.簡単に言うとこういう事らしい.

  • Cgroup:コンピュータに備わる物理的なリソース(cpu, memory, etc)を隔離/制限するための機能
  • Namespace(名前空間):カーネル/OSが扱うリソース(ホスト名、ネットワークスタック、PID、etc)を隔離するための機能

cgroupとlinux namespace

ここに簡潔に書かれていた.簡単に言うとこういう事らしい.

  • Cgroup:コンピュータに備わる物理的なリソース(cpu, memory, etc)を隔離/制限するための機能
  • Namespace(名前空間):カーネル/OSが扱うリソース(ホスト名、ネットワークスタック、PID、etc)を隔離するための機能

cgroupが物理的なリソースを,namespaceが論理的なリソースを管理するという理解でOKだろう.

LXCでコンテナを作成してもip netns listでNetwork Namespaceが表示されない理由

LXCもNetwork Namespaceを使ってネットワーク分離を行っていると色々な記事でみたので,ip netns listを実行してみたが何も表示されなかった.これは,ip netns listが表示するのは/var/run/netns配下のファイルで,LXCは別のディレクトリでファイルの管理をしているから.どうやらlxc-createとip netns addではnetwork namespaceの作られ方が異なるようなので簡単に違いを残しておく.

ip netnsを使う場合

まずは1つnetwork namespaceを作成する.

> ip netns add nstest
> ip netns list
nstest

続いて,作成したnstestの中に入り,yesコマンドを実行する

> ip netns exec nstest bash
> yes

次に,ホストでnstest内で実行されているbashとyesコマンドのPIDを確認する

> ip netns pid nstest
1820
1832

ホストでpstree -p を実行したところ,1820がbash,1832がyesのPIDだった./proc/PID/ns/配下にそのプロセスが属しているnamespace群が格納されているので確認する.

ls -li /proc/1820/ns/net
12355 lrwxrwxrwx 1 root root 0 Dec 27 11:36 /proc/1820/ns/net -> net:[4026532224]

ls -li /proc/1832/ns/net
12357 lrwxrwxrwx 1 root root 0 Dec 27 11:36 /proc/1832/ns/net -> net:[4026532224]

ここでinode番号に着目すると同じ4026532224を指している.このinode番号はip netns addで作成した/var/run/netns/nstestのinode番号と一致している.

ls -li /var/run/netns/nstest
4026532224 -r--r--r-- 1 root root 0 Dec 27 11:32 /var/run/netns/nstest

Linuxのnamespaceはin odeの番号でどのnamespaceに属しているか判断していることがなんとなくわかる.Linux Kernel Networkingによると以下の手順でnetwork namespaceが作られるようだ.

  • ip netns add XXX を実行すると /var/run/netns/XXXが生成される
  • unshareマンドでnetwork namespaceを作成する
  • mountコマンドで/run/netns/XXX がnetwork namespace(/proc/PID/ns/net)にアタッチされる
  • network namespaceは /proc/PID/ns/netが指しているinode番号で判別される

LXCを使う上でのTips

  • LXC経由でコンテナを作るとip netns コマンドと違い/var/run/netns配下にファイルはできない
  • lxc-lsが表示するのは/var/lib/lxc配下のディレクトリ群

LXCとDockerと何が違うの?

LXCとDockerの違いはDockerとLXCに綺麗にまとめられている.LXCはLinux Kernel標準機能のcgroupやnamespaceを利用してコンテナを管理するツールであり,Dockerはそれに加えてバージョン管理,自動ビルド,ポータブルデプロイなど様々な機能を提供するエコシステムである,また,コンテナ管理の面では,Dockerはデフォルトでlibcontainerを使う(LXC経由でコンテナ管理をする場合はオプションで指定可能)

参考

cgroupについて

namespaceについて

書籍

Linux KernelによるNetworkingの説明をかなり詳細に説明している本だったので参考に挙げておく.ip netns使い方などもまとまっている. * Linux Kernel Networking