CentOS7でLXC

  • 11
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

インストール

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を再起動しないと有効にならなかった。

/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でインストール対象から外したいパッケージを指定していてください。

/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で指定するインタフェース名だけを設定するだけだと思います。

/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//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コマンドはインストールされないみたいです。なので、必要な場合は手動でインストールする必要があります。

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

または、

コンテナの外からインストールする場合
$ 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

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

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

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

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

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