このエントリーをはてなブックマークに追加

lxc

概要

lxcは、コンテナ型の仮想環境を構築するツールです。

インストール

yumとcurlはCentOSのテンプレート作成時に必要なパッケージです。
$ sudo -i
# apt-get update
# apt-get upgrade
# apt-get install lxc yum curl -y

コンテナの作成

Ubuntu12.04のコンテナを作成

# lxc-create -t ubuntu -n precise_001  -- -r precise --arch amd64

Ubuntu12.04のコンテナを32bit版で作成

# lxc-create -t ubuntu -n precise_001  -- -r precise --arch i386

Fedora17のコンテナを作成

# lxc-create -t fedora -n fedora17_001  --release 17

作成したコンテナの確認

# lxc-list

コンテナを起動

バックグラウンドで起動したい場合は-dオプションを利用します。
ユーザ名、パスワード共にubuntuでログイン
Fedora、CentOSはユーザ名、パスワード共にrootです。

Ubuntu12.04を起動

# lxc-start -n precise_001

Fedora17を起動

# lxc-start -n fedora17_001

コンソールに接続

バックグラウンドで起動した場合に後からコンソールで接続したい場合に利用します。
抜ける場合はCtrl-a qで抜けれます。
# lxc-ls
# lxc-console -n precise_001

コンテナを停止

# lxc-stop -n precise_001
# lxc-stop -n precise

コンテナを削除

# lxc-destroy -n precise_001

一時的な実行環境でコンテナを起動

# lxc-start-ephemeral -n precise

コンテナのクローン

# lxc-clone -o precise_001 -n precise_002

コンテナのバックアップ

# lxc-backup precise_001

コンテナのリストア

# lxc-restore precise_001

ホストOSの起動時のコンテナ自動起動

既定の場所にシンボリックリンクを貼ればOS起動時にコンテナも起動してきます。

# ln -s /var/lib/lxc/precise_001/config /etc/lxc/auto/precise_001.conf

外部からコンテナへのNATによる接続

VPSなどグローバルアドレスを付与されない場合は利用するサービスのポートをiptablesを利用しNATの設定を行いコンテナを起動する。
以下の場合は80番ポートはそのままコンテナの80番ポート、2222番ポートをコンテナの22番ポートへ転送する。
# vi /etc/init/lxc-net.conf
iptablesの設定を iptables -A POSTROUTING の次の行に追加
# iptables -A PREROUTING -t nat -p tcp --dport 80 -i eth0 -j DNAT --to 10.0.3.2:80
# iptables -A PREROUTING -t nat -p tcp --dport 2222 -i eth0 -j DNAT --to 10.0.3.2:22

外部からコンテナへの直接接続

グローバルアドレスや家庭内のLAN内アドレスを直接割り当てることが出来る場合はブリッジを設定するほうがNATより通信設定が楽です。

# vi /etc/network/interfaces
iface eth0 inet static
       address 192.168.10.50
       netmask 255.255.255.0
       network 192.168.10.0
       broadcast 192.168.10.255
       gateway 192.168.10.1
       dns-nameservers 192.168.10.1

以下のように変更

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
  address 192.168.10.50
  netmask 255.255.255.0
  network 192.168.10.0
  broadcast 192.168.10.255
  gateway 192.168.10.1
  dns-nameservers 192.168.10.1
  bridge_ports eth0
  bridge_stp off

設定を反映

# service networking restart
次回から作成されるコンテナのブリッジインターフェースを変更
# vi /etc/lxc/lxc.conf
lxc.network.link=lxcbr0
#以下のように変更
lxc.network.link=br0
既存コンテナのインターフェースを変更
# sudo sed -i /var/lib/lxc/[コンテナ名]/config -e 's/^lxc.network.link=lxcbr0/lxc.network.link=br0/'
ブリッジインターフェースとアドレスを指定してコンテナを起動
いちいちオプションが面倒な場合はコンフィグ(/var/lib/lxc/precise_001/config)を直接変更します。
# lxc-start -n precise_001 -s lxc.network.ipv4=192.168.10.80/24 -s lxc.network.link=br0

CentOS6.3のテンプレート1

テンプレートにCentOSが含まれていませんので手動で作成する必要があります。
以下の作成手順では6.3が出来上がりますので他バージョンが必要であれば多少変更が必要です。
スクリプトを作成したいのでプロンプトは入ってませんのでそのままコピペすればテンプレートが出来上がります。
但し名前は centos63_001 となっていますので適宜変更してください。
ユーザ名root、パスワードはpasswordでログインできます。
###prerequisite
mkdir /t

###prepare yum config file
cd /t
wget -c http://mirrors.kernel.org/centos/6.3/os/x86_64/Packages/centos-release-6-3.el6.centos.9.x86_64.rpm
rpm2cpio centos-release-6-3.el6.centos.9.x86_64.rpm | cpio -idm
sed -i 's/$releasever/6/g' ./etc/yum.repos.d/*
echo LANG="ja_JP.UTF-8" > /etc/sysconfig/i18n
yum --installroot=/t groupinstall base --nogpgcheck -y
#yum --installroot=/t install dhclient vim telnet ftp man-pages-ja --nogpgcheck -y
yum --installroot=/t install dhclient vi man-pages-ja --nogpgcheck -y
rm -rf centos-release-6-3.el6.centos.9.x86_64.rpm

###post-install configuration
###echo "root:root" | chroot /t chpasswd
chroot /t
echo password | passwd --stdin root

sed -i 's/^#baseurl/baseurl/g' /etc/yum.repos.d/CentOS-Base.repo
sed -i 's/$releasever/6.3/g' /etc/yum.repos.d/CentOS-Base.repo
sed -i '115,126s/^/#/' /etc/rc.d/init.d/halt

rm -f /dev/null

mknod -m 666 /dev/null c 1 3
mknod -m 666 /dev/zero c 1 5
mknod -m 666 /dev/random c 1 8
mknod -m 666 /dev/urandom c 1 9
mkdir -m 755 /dev/pts
mkdir -m 1777 /dev/shm
mknod -m 666 /dev/tty c 5 0
mknod -m 666 /dev/tty0 c 4 0
mknod -m 666 /dev/tty1 c 4 1
mknod -m 666 /dev/tty2 c 4 2
mknod -m 666 /dev/tty3 c 4 3
mknod -m 666 /dev/tty4 c 4 4
mknod -m 600 /dev/console c 5 1
mknod -m 666 /dev/full c 1 7
mknod -m 600 /dev/initctl p
mknod -m 666 /dev/ptmx c 5 2
chown root:tty /dev/tty*
chmod 1777 /dev/shm
chmod 755 /dev/pts

cp -a /etc/skel/. /root/.

cat > /etc/resolv.conf << END
# Google public DNS
nameserver 8.8.8.8
nameserver 8.8.4.4
END

cat > /etc/hosts << END
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
END

cat > /etc/sysconfig/network << END
NETWORKING=yes
HOSTNAME=localhost
END

cat > /etc/sysconfig/network-scripts/ifcfg-eth0  << END
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no
END

cat > /etc/fstab << END
/dev/root               /                       rootfs   defaults        0 0
none                    /dev/shm                tmpfs    nosuid,nodev    0 0
END

cat > /etc/init/lxc-sysinit.conf << END
start on startup
env container

pre-start script
        if [ "x$container" != "xlxc" -a "x$container" != "xlibvirt" ]; then
                stop;
        fi
        telinit 3
        initctl start tty TTY=console
        exit 0;
end script
END

exit

tar zcvf /usr/local/src/centos6-lxc-root.tgz .

mkdir /var/lib/lxc/centos63_001
cd /var/lib/lxc/centos63_001
mkdir rootfs
cd rootfs
tar zxvf /usr/local/src/centos6-lxc-root.tgz --numeric-owner

cd /var/lib/lxc/centos63_001

cat >/var/lib/lxc/centos63_001/config << END
lxc.network.type=veth
lxc.network.link=lxcbr0
lxc.network.flags=up
lxc.utsname = centos63_001

lxc.tty = 1
lxc.pts = 1024
lxc.rootfs = /var/lib/lxc/centos63_001/rootfs
lxc.mount  = /var/lib/lxc/centos63_001/fstab
lxc.arch = x86_64
lxc.cap.drop = sys_module mac_admin

lxc.cgroup.devices.deny = a
# Allow any mknod (but not using the node)
lxc.cgroup.devices.allow = c *:* m
lxc.cgroup.devices.allow = b *:* m
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm
#fuse
lxc.cgroup.devices.allow = c 10:229 rwm
#tun
lxc.cgroup.devices.allow = c 10:200 rwm
#full
lxc.cgroup.devices.allow = c 1:7 rwm
#hpet
lxc.cgroup.devices.allow = c 10:228 rwm
#kvm
lxc.cgroup.devices.allow = c 10:232 rwm
END
cat > fstab  << END
proc            /var/lib/lxc/centos63_001/rootfs/proc         proc    nodev,noexec,nosuid 0 0
sysfs           /var/lib/lxc/centos63_001/rootfs/sys          sysfs defaults  0 0
END
rm -rf /t

作成したテンプレートを起動

# lxc-start -n centos63_001

CentOS6.3のテンプレート2

Gistにちょっとだけ変更すれば動くものがあったためフォークして修正して置いておきました。
デフォルトでは、ユーザ名root、パスワードはpasswordでログインできます。
# git clone git://gist.github.com/3514296.git
# cp -a 3514296/lxc-centos /usr/lib/lxc/templates/
# lxc-create -t centos -n centos63_001
# lxc-start -n centos63_001

こちらのほうが1の方法より手間かからないです。