CentOS 6.6 - LXCで仮想環境を構築してみた。

本投稿では、LXCのインストール方法を紹介します。

作業環境
- さくらのVPS/2G 
- CentOS 6.6

 

YUMリポジトリを追加

YUMリポジトリ「EPEL」「RPMforge」を追加する

# yum install -y epel-release
# rpm -Uvh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm


普段は、標準リポジトリを利用するため「enabled」の値を 1 → 0 へ変更する

# for i in `ls /etc/yum.repos.d/*.repo | grep -v -e "CentOS-"` ; do sed -i -e '/^enabled/d' $i ;done
# for i in `ls /etc/yum.repos.d/*.repo | grep -v -e "CentOS-"` ; do sed -i -e 's/\]$/\]\nenabled=0/g' $i ;done

ネットワークをセットアップ


LXCのコンテナには、ローカルIPアドレス(192.168.0.2)を設定する コンテナから外部へ通信できるよう、ホスト機でブリッジを行う

仮想インターフェイス(ブリッジ)を追加

ホスト機で、ブリッジに使う仮想インターフェイスを追加する

# vim /etc/sysconfig/network-scripts/ifcfg-lxcbr0
DEVICE="lxcbr0"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="192.168.0.1"
NETMASK="255.255.255.0"
ONBOOT="yes"

 

仮想インターフェイスを起動・確認

仮想インターフェイスをリンクアップさせる

# ifup lxcbr0


リンクアップさせた仮想インターフェイスを確認する

# ifconfig lxcbr0
lxcbr0 Link encap:Ethernet HWaddr 3E:A5:56:62:B4:15
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::3ca5:56ff:fe62:b415/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:1026 (1.0 KiB)

 

IPv4転送をセットアップ

現状設定を確認する(デフォルト 0,転送有効時 1)

# sysctl -a |grep -G -e "^net.ipv4.ip_forward"
net.ipv4.ip_forward = 0


IPv4転送を有効にするよう設定ファイル「sysctl.conf」を置換する

# sed -i -e 's/^net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf


設定ファイルの内容が正しく設定(0 -> 1)されているか確認する # grep -G -e "^net.ipv4.ip_forward" /etc/sysctl.conf net.ipv4.ip_forward = 1
IPv4転送を有効化する ※「sysctl -p」が設定を有効化するコマンド

# sysctl -p | grep -G "^net\.ipv4\.ip\_forward"
net.ipv4.ip_forward = 1

 

NATをセットアップ

NATのルールを追加する

# iptables -A POSTROUTING -s 192.168.0.0/24 -t nat -j MASQUERADE


追加したルールをセーブする(再起動してもiptablesの設定が残るように)

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]


追加したルールをiptablesコマンドで確認する

# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 11 packets, 471 bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 1 packets, 132 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * * 192.168.0.0/24 0.0.0.0/0

Chain OUTPUT (policy ACCEPT 1 packets, 132 bytes)
pkts bytes target prot opt in out source destination

 

dnsmasqをセットアップ


dnsmasqは、/etc/hostsを管理するとともにプライベートDNSサーバとしても使える

dnsmasqをインストール

dnsmasqをインストールする

# yum install -y dnsmasq

 

dnsmasqを設定

「dnsmasq.conf」で下記項目のコメントアウト(#)を外し、自分の環境に合うように編集する

# vim /etc/dnsmasq.conf
#ドメインの付加されていない名前解決は上位DNSに転送しないようにする
domain-needed

#プライベートIPの逆引きは上位DNSに転送しないようにする
bogus-priv

#作成したインターフェイスを指定する(LNA-NIC)
interface=lxcbr0

#ローカルホストの IP アドレスを追記してください
listen-address=127.0.0.1

#ネットワーク上の他のコンピュータのために LAN の IP アドレスも受信するようにする
listen-address=192.168.0.1

#domain= で指定されたドメインで補完する
expand-hosts

#ローカル限り、使用するドメインを指定する
local=/lxc.local/

#補完するドメインを指定する
domain=lxc.local

#DHCPで192.168.0.100~120を動的に割り当てる
dhcp-range=192.168.0.100,192.168.0.120,1d

 

dnsmasqを登録

「/etc/resolv.conf」へローカルホストのIPアドレスを追加する

# echo "nameserver 127.0.0.1" >> /etc/resolv.conf

 

dnsmasqを起動

起動させる

# service dnsmasq start

自動起動設定に追加

# chkconfig dnsmasq on
# chkconfig --list dnsmasq
dnsmasq 0:off 1:off 2:on 3:on 4:on 5:on 6:off

 

LXCをセットアップ

 

LXCをインストール

LXCをYUMリポジトリ「RPMforge」を指定してインストールする

# yum --enablerepo=rpmforge install -y lxc lxc-templates lxc-doc lxc-libs
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* rpmforge: ftp.kddilabs.jp
* updates: ftp.tsukuba.wide.ad.jp
rpmforge | 1.9 kB 00:00
rpmforge/primary_db | 2.7 MB 00:08
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package lxc.x86_64 0:0.8.0-1.el6.rf will be installed
---> Package lxc-doc.x86_64 0:0.8.0-1.el6.rf will be installed
---> Package lxc-libs.x86_64 0:0.8.0-1.el6.rf will be installed
---> Package lxc-templates.x86_64 0:0.8.0-1.el6.rf will be installed
--> Processing Dependency: debootstrap for package: lxc-templates-0.8.0-1.el6.rf.x86_64
--> Finished Dependency Resolution
Error: Package: lxc-templates-0.8.0-1.el6.rf.x86_64 (rpmforge)
Requires: debootstrap
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest

エラーメッセージには、「lxc-templates」のインストールに「debootstrap」が必要だと表示される
上記エラーを回避するため、「debootstrap」をYUMリポジトリ「EPEL」を指定してインストールする

# yum --enablerepo=epel install -y debootstrap


改めて、LXCをインストールする

# yum --enablerepo=rpmforge install -y lxc lxc-templates lxc-doc lxc-libs
Cgroupをセットアップする

Cgroupに使うディレクトを作成する

# mkdir /cgroup


「/etc/fstab」へ作成したディレクトリ「/cgroup」を追加する

# echo "none /cgroup cgroup defaults 0 0" >> /etc/fstab


「/etc/fstab」を追加内容を確認する

# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Thu Dec 5 17:09:41 2013
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=04c60cca-f3e7-41bb-8306-e13272a51583 / ext4 defaults 1 1
UUID=47ee5dbf-af36-4cb1-ba6e-22aa5da6efda /boot ext4 defaults 1 2
UUID= swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
none /cgroup cgroup defaults 0 0 <-新規追加行!!


「/cgroup」をマウントする 「-a」オプションは、/etc/fstabに記述されているものを全てマウント

# mount -a


マウントを確認する

# mount
/dev/vda3 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/vda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
none on /cgroup type cgroup (rw) <-追加分

 

コンテナテンプレートをセットアップ


LXCで管理するコンテナテンプレート(コンテナイメージ)を作成していく

コンテナのディレクトリを作成

コンテナテンプレートの構築に使うディレクトリを作成する

# mkdir -p /lxc/centos

 

OSイメージをダウンロード

コンテナへは、CentOS 6.6をインストールするのでCentOS 6.6のRPMパッケージをコンテナディレクトリへダウンロードする

# wget -P /lxc/centos http://mirrors.kernel.org/centos/6/os/x86_64/Packages/centos-release-6-6.el6.centos.12.2.x86_64.rpm

 

 

RPMパッケージをセットアップ

コンテナディレクトリへ移動して、rpm2cpioコマンドでRPMパッケージに含まれるファイルを確認する

# cd /lxc/centos
# rpm2cpio centos-release-6-6.el6.centos.12.2.x86_64.rpm | cpio --list
./etc/centos-release
./etc/issue
./etc/issue.net
./etc/pki/rpm-gpg
./etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
./etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-6
./etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Security-6
./etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-6
./etc/redhat-release
./etc/rpm/macros.dist
./etc/system-release
./etc/system-release-cpe
./etc/yum.repos.d/CentOS-Base.repo
./etc/yum.repos.d/CentOS-Debuginfo.repo
./etc/yum.repos.d/CentOS-Media.repo
./etc/yum.repos.d/CentOS-Vault.repo
./etc/yum.repos.d/CentOS-fasttrack.repo
./etc/yum/vars/infra
./usr/share/doc/centos-release-6
./usr/share/doc/centos-release-6/EULA
./usr/share/doc/centos-release-6/GPL
./usr/share/doc/redhat-release
75 blocks


rpm2cpioコマンドでダウンロードしたRPMパッケージからファイルを取り出し、cpipコマンドで取り出したファイルを階層付きで展開する

# rpm2cpio centos-release-6-6.el6.centos.12.2.x86_64.rpm | cpio -idm
75 blocks


treeコマンドで展開されたディレクトを確認する

# tree
.
tqq centos-release-6-6.el6.centos.12.2.x86_64.rpm
tqq etc
x?? tqq centos-release
x?? tqq issue
x?? tqq issue.net
x?? tqq pki
x?? x?? mqq rpm-gpg
x?? x?? tqq RPM-GPG-KEY-CentOS-6
x?? x?? tqq RPM-GPG-KEY-CentOS-Debug-6
x?? x?? tqq RPM-GPG-KEY-CentOS-Security-6
x?? x?? mqq RPM-GPG-KEY-CentOS-Testing-6
x?? tqq redhat-release -> centos-release
x?? tqq rpm
x?? x?? mqq macros.dist
x?? tqq system-release -> centos-release
x?? tqq system-release-cpe
x?? tqq yum
x?? x?? mqq vars
x?? x?? mqq infra
x?? mqq yum.repos.d
x?? tqq CentOS-Base.repo
x?? tqq CentOS-Debuginfo.repo
x?? tqq CentOS-Media.repo
x?? tqq CentOS-Vault.repo
x?? mqq CentOS-fasttrack.repo
mqq usr
mqq share
mqq doc
tqq centos-release-6
x?? tqq EULA
x?? mqq GPL
mqq redhat-release -> /usr/share/doc/centos-release-6

12 directories, 20 files

「tree」コマンドがない場合は、「# yum install -y tree」でインストールできるきっと

コンテナテンプレートの環境構築

コンテナテンプレートのYUMリポジトリを修正する

# sed -i -e 's/$releasever/6/g' /lxc/centos/etc/yum.repos.d/CentOS-*


修正したYUMリポジトリを使って、コンテナディレクトリへ 「base」「vi」「dhclient」「man-pages-ja」のRPMパッケージをインストールする

# yum --installroot=/lxc/centos groupinstall -y base --nogpgcheck
# yum --installroot=/lxc/centos install -y vi dhclient man-pages-ja --nogpgcheck


作業ディレクトリへchrootする

# chroot /lxc/centos


chroot環境下で下記コマンドを実行する

bash-4.1# rm -fr /dev/null
bash-4.1# mknod -m 666 /dev/null c 1 3
bash-4.1# mknod -m 666 /dev/zero c 1 5
bash-4.1# mknod -m 666 /dev/random c 1 8
bash-4.1# mknod -m 666 /dev/urandom c 1 9
bash-4.1# mknod -m 666 /dev/tty c 5 0
bash-4.1# mknod -m 666 /dev/tty0 c 4 0
bash-4.1# mknod -m 666 /dev/tty1 c 4 1
bash-4.1# mknod -m 666 /dev/tty2 c 4 2
bash-4.1# mknod -m 666 /dev/tty3 c 4 3
bash-4.1# mknod -m 666 /dev/tty4 c 4 4
bash-4.1# mknod -m 600 /dev/console c 5 1
bash-4.1# mknod -m 666 /dev/full c 1 7
bash-4.1# mknod -m 600 /dev/initctl p
bash-4.1# mknod -m 666 /dev/ptmx c 5 2
bash-4.1# mkdir -m 755 /dev/pts
bash-4.1# mkdir -m 1777 /dev/shm
bash-4.1# chown root:tty /dev/tty*
bash-4.1# cp -a /etc/skel/. /root/.


rootユーザのパスワードを設定する(パスワードは toor とする)

bash-4.1# echo "root:toor" | chpasswd


ネームサーバを指定する

bash-4.1# vim /etc/resolv.conf
domain lxc.local
nameserver 192.168.0.1 #仮想インターフェイスのIPアドレス 
nameserver 8.8.8.8 
nameserver 8.8.4.4


ネットワークを設定する

bash-4.1# vim /etc/sysconfig/network
NETWORKING="yes"
HOSTNAME="vm0.lxc.local"
NETWORKING_IPV6="no"


ネットワークインターフェイスを設定する

bash-4.1# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
ONBOOT="yes"
TYPE="Ethernet"
USERCTL="yes"
PEERDNS="yes"
IPV6INIT="no"


「/etc/fstab」を作成する

bash-4.1# vim /etc/fstab
bash-4.1# cat /etc/fstab
/dev/root / rootfs defaults 0 0
none /dev/shm tmpfs nosuid,nodev 0 0


lxc-sysinit.confを作成する

bash-4.1# vim /etc/init/lxc-sysinit.conf
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


chrootからログアウトする

bash-4.1# exit


コンテナテンプレートをわかりやすい名前で圧縮する

# cd /lxc/centos
# tar cvfz ../lxc-centos66.tgz .

 

LXCコンテナをセットアップ


作成したコンテナテンプレートを使って、LXCコンテナをセットアップしていく

LXCコンテナの準備

LXCコンテナを収納するディレクトリを作成する 作成するLXCコンテナ名は、「vm0」にする

# mkdir -p /var/lib/lxc/vm0/rootfs


LXCコンテナのconfigファイルを作成する

# vim /var/lib/lxc/vm0/config
lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.veth.pair = veth-vm0
lxc.utsname = vm0

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

lxc.cgroup.devices.deny = a
lxc.cgroup.devices.allow = c *:* m
lxc.cgroup.devices.allow = b *:* m
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
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
lxc.cgroup.devices.allow = c 254:0 rwm
lxc.cgroup.devices.allow = c 10:229 rwm
lxc.cgroup.devices.allow = c 10:200 rwm
lxc.cgroup.devices.allow = c 1:7 rwm
lxc.cgroup.devices.allow = c 10:228 rwm
lxc.cgroup.devices.allow = c 10:232 rwm


configファイルのアクセス権を変更する

# chmod 666 /var/lib/lxc/vm0/config


作成したコンテナテンプレート(CentOS 6.6)を「vm0」のディレクトリへ展開する

# tar zxvf /lxc/lxc-centos66.tgz -C /var/lib/lxc/vm0/rootfs/ --numeric-owner


/var/lib/lxc/vm0/fstabを作成する

# vim /var/lib/lxc/vm0/fstab
proc /var/lib/lxc/vm0/rootfs/proc proc nodev,noexec,nosuid 0 0
sysfs /var/lib/lxc/vm0/rootfs/sys sysfs defaults 0 0


ここまでで、LXCコンテナの準備は完了です

LXCコンテナを操作方法


ここからは、LXCコンテナの操作方法・使い方について紹介します

起動

コンテナをバックグランドで起動する

# lxc-start -n vm0 -d

 

接続

バックグランドで起動したコンテナへ接続する

# lxc-console -n vm0

ログアウトは、<Ctrl+a q>

停止

コンテナを停止する

# lxc-stop -n vm0

 

ステータス確認
# lxc-info -n vm0
state: RUNNING
pid: 11913

 

LXCコンテナ確認
# lxc-ls
vm0 vm1
vm1

※起動中コンテナは2行に表示される

バックアップ

バックアップを作成する(ファイルシステムをコピーするだけ)

# lxc-backup -n vm0

 

LXCコンテナのクローン作成


LXCコンテナのクローン作成方法について紹介する

LXCコンテナのクローンを作成する

コンテナ「vm0」を複製する(複製先:vm1)

# lxc-clone -o vm0 -n vm1
Tweaking configuration
Copying rootfs...
/usr/bin/lxc-clone: line 251: rsync: コマンドが見つかりません

エラーメッセージは、rsyncがインストールされていないと表示されています
上記エラーを回避するため、「rsync」をインストールする

# yum install -y rsync


失敗した複製ファイルを削除する

# rm -fr /var/lib/lxc/vm1


改めて、複製コマンドを実行する

# lxc-clone -o vm0 -n vm1
Tweaking configuration
Copying rootfs...
Updating rootfs...
'vm1' created

 

複製を確認

複製したLXCコンテナ「vm1」を確認する

# lxc-ls
vm0 vm1
vm0

 

LXCコンテナのconfigファイル修正

複製したLXCコンテナのconfigファイルを修正する必要がある configファイルには、複製前のホスト名が残っているので置換する

# sed -i -e 's/vm0/vm1/g' /var/lib/lxc/vm1/config

 

LXCコンテナを起動
コンテナを起動させる
# lxc-start -n vm1 -d

コンソール接続する

# lxc-console -n vm1

ホスト名など複製元情報が残っているので修正する必要がある または、DHCPでIPアドレスが取得出来ていない場合が稀にあるその場合は下記コマンドを実行してください

# dhclient