ブログ

ryuzeeによるブログ記事。不定期更新

vagrant-lxc用のCentOS Boxを自作する方法

前回の内容(vagrant-lxcで軽量仮想環境を手に入れる)の続きです。 VagrantではあらかじめBoxと呼ばれる仮想マシンの雛形を用意しておいて、起動時にそれを複製して環境を用意します。したがってLXCとVagrantを組み合わせた場合でも当然のことながらBoxが必要となります。前回の記事ではBoxは公開されているものを使いましたが、今回はBoxを自分で作成する方法を説明します。なお、Boxの作成方法はvagrant-lxcの配布物に含まれているubuntuなどのBox作成のスクリプトをかなり参考にしています。

事前準備:LXCでCentOSを利用できるようにする

vagrant-lxcで利用するBoxの作成では、LXCで先に元となるOSの環境を作成できるようにする必要があります(なのでLXCを母艦にインストールしてください。必然的に環境はUbuntu系のディストリビューションに限られます。ただしVirtualBoxを使ってUbuntuの環境を作っても問題ありません。Amazon EC2上にUbuntu環境を作成しても大丈夫です)。今回はCentOSの環境を作ります。が、標準ではLXCの配布物の中に含まれているのは、Ubuntu、Fedora、OpenSuseなどで、CentOSは含まれていません(標準で何が用意されているかは/usr/lib/lxc/templatesをみてください)ので、LXC用のテンプレートを入手します。
sudo wget -O /usr/lib/lxc/templates/lxc-centos \
https://gist.github.com/hagix9/3514296/raw/7f6bb4e291fad1dad59a49a5c02f78642bb99a45/lxc-centos

またこのファイルには実行権限を付与しておきます。

sudo chmod 755 /usr/lib/lxc/templates/lxc-centos

次に、母艦(Ubuntu系OS)からyumコマンドなど複数のコマンドを実行するため、以下のようにインストールします。

sudo apt-get install yum curl wget

作成

ここから先はスクリプトを用意しておきました。こちらから入手してください。 やっていることの概要は以下のとおりです。
  1. lxc-createコマンドを使ってCentOS環境を作成する
  2. vagrantユーザーを作成して公開鍵の設定やsudoの設定などを行う
  3. 追加で最低限必要なパッケージを入れる
  4. Chefをインストールする
  5. LXCのファイルシステム領域をtarで固めてその他の必要なmetadataとともにアーカイブしてBox化する
  6. 後片付け
基本的にタダのスクリプトなので、自分用に他のパッケージをインストールしたりアカウントを作ったりなんでもできます。
#!/bin/bash

set -e
NOW=$(date -u -R)
RELEASE=${1:-"6"}
RELEASE_MINOR=${2:-"4"}
ARCH=${3:-"x86_64"}
LXC_NAME=CentOS-${RELEASE}.${RELEASE_MINOR}
PKG=vagrant-lxc-${LXC_NAME}-${ARCH}-ja.box
WORKING_DIR=/tmp/vagrant-lxc-${LXC_NAME}
ROOTFS=/var/lib/lxc/${LXC_NAME}/rootfs

# Path to files bundled with the box
CWD=`readlink -f .`
LXC_TEMPLATE=${CWD}/common/lxc-template
LXC_CONF=${CWD}/common/lxc.conf
METATADA_JSON=${CWD}/common/metadata.json

# Set up a working dir
mkdir -p $WORKING_DIR

if [ -f "${WORKING_DIR}/${PKG}" ]; then
  echo "Found a box on ${WORKING_DIR}/${PKG} already!"
  exit 1
fi

## Create container
if $(lxc-ls | grep -q "${LXC_NAME}"); then
  echo "Base container already exists, please remove it with \`lxc-destroy -n ${LXC_NAME}\`!"
  exit 1
else
  lxc-create -n ${LXC_NAME} -t centos -- --release ${RELEASE}
fi

# Fixes some networking issues
# See https://github.com/fgrehm/vagrant-lxc/issues/91 for more info
echo 'ff02::3 ip6-allhosts' >> ${ROOTFS}/etc/hosts

## Create vagrant user
chroot ${ROOTFS} /usr/sbin/groupadd vagrant
chroot ${ROOTFS} /usr/sbin/useradd vagrant -g vagrant -G wheel
echo -n 'vagrant:vagrant' | chroot ${ROOTFS} chpasswd
mkdir -p ${ROOTFS}/home/vagrant/.ssh
wget --no-check-certificate 'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub' \
     -O ${ROOTFS}/home/vagrant/.ssh/authorized_keys
chroot ${ROOTFS} chown -R vagrant: /home/vagrant/.ssh
sed -i "s/#UseDNS yes/UseDNS no/" ${ROOTFS}/etc/ssh/sshd_config

echo "vagrant        ALL=(ALL)       NOPASSWD: ALL" >> ${ROOTFS}/etc/sudoers.d/vagrant
chmod 0440 ${ROOTFS}/etc/sudoers.d/vagrant
sed -i "s/^.*requiretty/#Defaults requiretty/" ${ROOTFS}/etc/sudoers

## Additional packages and update
chroot ${ROOTFS} yum install -y vim curl wget tar
chroot ${ROOTFS} yum upgrade -y

## Installing Chef
chroot ${ROOTFS} curl -L http://www.opscode.com/chef/install.sh | chroot ${ROOTFS} bash

## Clean up on instance
rm -rf ${ROOTFS}/tmp/*
chroot ${ROOTFS} yum clean all

## Building box
# Compress container's rootfs
cd $(dirname $ROOTFS)
tar --numeric-owner -czf $WORKING_DIR/rootfs.tar.gz ./rootfs/*

# Prepare package contents
cd $WORKING_DIR
cp $LXC_TEMPLATE .
cp $LXC_CONF .
cp $METATADA_JSON .
chmod +x lxc-template
sed -i "s/<today>/${NOW}/" metadata.json

# Vagrant box
tar -czf $PKG ./*
chmod +rw ${WORKING_DIR}/${PKG}
mkdir -p ${CWD}/output
mv ${WORKING_DIR}/${PKG} ${CWD}/output

# Cleanup working directory and working instance
cd ${CWD}
rm -rf ${WORKING_DIR}
lxc-destroy -n ${LXC_NAME}

## Ending
echo "The ${PKG} box was built successfully to ${CWD}/output/"

これを

sudo sh ./build-centos-box.sh

として実行すれば数分でBoxが出力されます。あとはvagrant box add コマンドを使ってBoxを追加すればOKです。

まとめ

今回作成したBoxはこちらからダウンロード可能です。 前回紹介したようにLXCを使う方がVirtualBoxを使うよりも高速かつ軽量です。次回はこれを使ってChefのCookbookを素早くテストする方法とかについて紹介しようと思います。

アジャイルコーチングやトレーニングを提供しています

株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。

詳細はこちら