CentOS7でLXC

# インストール

LXC関連のrpmやdebootstrapのrpmはEpelリポジトリに登録されているらしいのでEpelを追加してからLXC関連パッケージをインストールします。

```
$ sudo yum install -y epel-release
$ sudo yum update
$ sudo yum install lxc lxc-templates lxc-doc lxc-libs rsync debootstrap
```

LXCコンテナでDebianやUbuntuを使う予定がない場合は、debootstrapのインストールは不要です。
rsyncはコンテナインストールする時に使用するみたいです。


## 仮想ネットワーク

LXC単体で仮想ネットワークを提供できるかどうかは後々調べるとして、bridge-utilsを利用して仮想ネットワークを構築します。

```
$ sudo yum install bridge-utils
```

## 仮想ブリッジインタフェース

下記の内容で``/etc/sysconfig/network-scripts/ifcfg-lxcbr0``を作成し、NetworkManagerを再起動すれば有効になる．．．はずなのですが、なぜかOSを再起動しないと有効にならなかった。

```shell-session:/etc/sysconfig/network-scripts/ifcfg-lxcbr0
NAME=lxcbr0
DEVICE=lxcbr0
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
IPADDR=172.16.1.1
PREFIX=24
DEFROUTE=no
NM_CONTROLLED=no
#DNS1=192.168.xxx.x
#SEARCH=example.com
```


# LXCコンテナのインストール

## CentOS

```
$ sudo lxc-create -n centos7 -t centos -- --release 7
```

コンテナの作成が完了すると、デフォルトパスワードが``/var/lib/lxc/centos7/tmp_root_pass``に出力されます。

作成するコンテナのCentOSのバージョンは``--release``で指定します。環境依存かもしれませんが、CentOS7は安定稼働させられていませんので、ちょっと古いですが、LXCコンテナでCentOSを動かす場合、今のところ（2016年4月現在）CentOS6がお勧めかもしれないです。


## Debian Linux

```
$ sudo lxc-create -n debian_jessie -t debian -- --release jessie
```

``--release``でDebian Linuxのバージョンが指定できます。Debian Linux8をインストールする場合は``jessie``、Debian Linux7の場合は``wheezy``を指定します。

デフォルト設定でほぼ最小構成のインストールですが、さらに最小を目指す場合は``/usr/share/lxc/templates/lxc-debian``の下記の行で$packagesで指定するパッケージを削除したり、``--exclude``でインストール対象から外したいパッケージを指定していてください。

```shell-session:/usr/share/lxc/templates/lxc-debian
    echo "Downloading debian minimal ..."
    debootstrap --verbose --variant=minbase --arch=$arch \
        --include=$packages \
        "$release" "$cache/partial-$release-$arch" $MIRROR
```

## ネットワークインタフェース設定

各コンテナのコンフィグファイルに下記の記述を追加します。
ほとんどの設定はコンテナをインストールした段階で設定されているはずなので、``lxc.network.link``で指定するインタフェース名だけを設定するだけだと思います。

```shell-session:/var/lib/lxc/debian_jessie/config
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.rootfs = /var/lib/lxc/intranet/rootfs
```



## コンテナの起動

```
$ lxc-start -n debian_jessie
```

または、

```
$ lxc-start -n debian_jessie -d
$ lxc-console -n debian_jessie
```

で起動します。debianコンテナのデフォルトのrootパスワードは``root``みたいです。
前者のコマンド（-dなし）でコンテナを起動した場合、コンテナ起動後、コンテナのコンソールに自動で接続し、コンテナ終了までコンテナのコンソールを抜けられません。
後者のコマンド（-dあり）でコンテナを起動した場合、``lxc-console``コマンドを入力するまでコンテナのコンソールに接続しません。また、コンソール接続後、``Ctrl+a q``でコンテナのコンソールを抜けることができます。


### コンテナの自動起動

/var/lib/lxc/<lxcコンテナディレクトリ>/configに

```
lxc.start.auto = 1
```

を追加し、

```
$ sudo systemctl enable lxc.service
```

のようにして、``lxc.service``がOS起動時に自動起動するよう設定すれば``lxc.start.auto=1``を設定したコンテナが自動起動するはずです。



# よくある問題

## コンテナからインターネットにつながらない

LXCコンテナからLXCホストを踏み台にしてインターネットに接続する場合、LXCホストのファイアウォール周り設定を変更する必要があります。
下記のようにiptablesの設定を一度クリアして、最低限の設定だけを追加した方がトラブルシューティングしやすいと思います。

```
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
sudo iptables -F
sudo iptables -F -t nat
sudo iptables -t nat -A POSTROUTING -o eno16777736 -j MASQUERADE
```

（eno16777736がインターネット方向のインタフェースと思って読んでください。）



## WindowsからLXCホストにログインせずにコンテナにログインしたい

NAT（NAPT）の設定を行い、Windows PCに仮想ネットワークへのルートを追加すると、LXCホストにログインせずにコンテナにログインできます。

コマンドプロンプトで、

```
> route add 172.16.1.0 mask 255.255.255.0 LXCホストのIPアドレス
```

または、

```
> route add 172.16.1.0 mask 255.255.255.0 LXCホストのIPアドレス -p
```

のような感じでルートを追加します。前者はWindowsを再起動するたびにルートを追加する必要があります。後者のように「-p」をつけると、Windowsを再起動してもルートを保持します。


## コンテナのrootパスワード忘れた

LXCでは、LXCホストからコンテナのルートファイルシステムを直接参照できるので、``chroot``コマンドを実行することで、rootに限らずその他アカウントのパスワード変更ができます。パッケージのインストールもできたりします。


## Debianコンテナからpingが実行できない

別に問題というわけではありませんが、Debianコンテナではデフォルトでpingコマンドはインストールされないみたいです。なので、必要な場合は手動でインストールする必要があります。

```shell-session:コンテナの中からインストールする場合
$ sudo apt-get install iputils-ping
```

または、

```shell-session:コンテナの外からインストールする場合
$ sudo chroot /var/lib/lxc/debian_jessie/rootfs/ apt-get install iputils-ping
```


## lxc-start: lxc_start.c: main: 295 Executing '/sbin/init' with no configuration file may crash the host

コンテナを起動しようとしたとき、

```shell-session
# lxc-start -n debian -d
lxc-start: lxc_start.c: main: 295 Executing '/sbin/init' with no configuration file may crash the host
```

のエラーメッセージが出力された場合、

```shell-session
# lxc-start -f /var/lib/lxc/debian8/config -n debian -d
```

のようにして、コンフィグファイルを指定すると直るようです。1回正常に起動できれば、それ以降はコンフィグファイルを指定しなくてもよいようです。
理由は不明ですが．．．