Atomic HostをオレオレVagrant BaseBoxにする

Docker専用OSとしてメジャーになってきたAtomicHostを使おうと思ったら、Projectが公開しているboxを利用するのが簡単。

http://www.projectatomic.io/download/
ここからお好きなBox取得すると簡単にvagrant up出来ます。

しかし、Defaultで10GBの容量はもう少し増やしたいし、キーボードも日本語キーボードを利用したい、
とか、とかとか


と言う事で、Installable ISOでVirtualBoxへインストール、そしてBaseBoxを作成してみたいと思います。

今回はCentOS Atomic Hostで。

CentOS Atomic Host Installable ISO
http://cloud.centos.org/centos/7/atomic/images/CentOS-Atomic-Host-7-Installer.iso


上のISOをダウンロードしてVirtualBoxでインストールを実施します。
ポイントとしては、

* Disk容量を30GB (標準は10GB）
* rootパーティションを10GB（標準は3GB）
* キーボード、タイムゾーンを日本語対応

但し、下記は実施しない。

* Guest Additions のインストール
* yumアップデート等　（_そもそもyum入ってないし_）



因みに、Atomic Hostといっても、実際にはVirtualBoxのBaseBox作成の備忘と言う事で、AtomicHostに特化した内容はほとんど無いです。。。


さて、ではサクッと行きます。


## 前提環境

* ホストマシン：MacBookAir OSX Yosemite(10.10.4）
* VirtualBox：5.0.0r101573
* Vagrant：1.7.4
* CentOS AtomicHost：7.1.2

## インストール前の準備（VirtualBoxでの作業）
<dl>
  <dt>新規仮想マシンの作成</dt>
  <dd>名前：atomichost-base</dd>
  <dt>メモリーサイズ</dt>
  <dd>512MB</dd>
  <dt>ハードディスク</dt>
  <dd>仮想ハードディスクを作成する</dd>
  <dd>タイプ：VDI</dd>
  <dd>可変サイズ</dd>
  <dd>ファイルサイズ：<strong>30GB</strong></dd>
  <dt>CDドライブ（コントローラIDE）</dt>
  <dd>ダウンロードしたISOファイルを指定</dd>
  <dt>ネットワーク</dt>
  <dd>NAT</dd>
  <dd>
<dl>
<dt>ポートフォワーディング</dt>
<dd>名前: SSH</dd>
<dd>プロトコル：TCP</dd>
<dd>ホストIP：127.0.0.1</dd>
<dd>ホストポート：2222</dd>
<dd>ゲストIP：10.0.2.15</dd>
<dd>ゲストポート：22</dd>
</dl>
</dd>
  <dt>その他</dt>
  <dd>USB無効</dd>
  <dd>オーディオ無効</dd>
</dl>
## インストール開始
* ディスク選択
![スクリーンショット 2015-09-16 0.06.04.png](https://qiita-image-store.s3.amazonaws.com/0/93508/53cfef54-eac0-5b2b-e30f-a293eeb53c93.png)
　※ここでパーティションをマニュアル設定してrootの容量を変更してもOK（今回は勉強を兼ねてインストール後に変更します）
<br/>
<br/>
* ネットワーク
![スクリーンショット 2015-09-16 0.06.29.png](https://qiita-image-store.s3.amazonaws.com/0/93508/38718629-1416-d9f4-d712-f67cd84cc85d.png)
 ※デフォルトで表示される以外のNICは追加しない事　
※ボタンを「ON」にして起動時に利用可能なようにする
<br/>


<dl>
<dt>日本語キーボード、タイムゾーンja_JPを選択</dt><dd><br/></dd>
  <dt>アカウント：パスワード</dt>
<dd>root:vagrant</dd>
<dd>vagrant:vagrant</dd>
<dd><br/></dd>
<dt>インストール開始</dt><dd><br/></dd>
</dl>

インストールが完了したら、ISOイメージを仮想CDドライブから抜き、再起動します。

## インストール後の設定

### ネットワーク設定
AtomicHostでは標準状態で以下のNICが設定されています。


```
[vagrant@localhost ~]$ sudo nmcli d
DEVICE   TYPE      STATE      CONNECTION 
docker0  bridge    connected  docker0    
enp0s3   ethernet  connected  enp0s3     
lo       loopback  unmanaged  --   
```
ネットワークの設定はBox化した後にVagrantfileで指定出来るので、BaseBoxは汎用性を持たせるためにこのままにします。
<br/><br/>
#### MACアドレスとUUIDを無効化
Vagrantfileでネットワークを設定する際に悪さをすることがあるので、以下を実行。

```
sed -i -e "s:HWADDR=.*::g" /etc/sysconfig/network-scripts/ifcfg-enp0s3
sed -i -e "s:UUID=.*::g" /etc/sysconfig/network-scripts/ifcfg-enp0s3
```

#### SSHの設定

* UseDNSを無効化

`sed -i -e "s:^#UseDNS yes:UseDNS no:" /etc/ssh/sshd_config`
<br/>
* vagrantユーザ用の公開鍵を配置

下記からvagrant公開鍵とプライベート鍵を取得
https://github.com/mitchellh/vagrant/tree/master/keys/

```
su - vagrant
mkdir ~/.ssh
chmod 0700 ~/.ssh
curl -L -o ~/.ssh/authorized_keys  https://github.com/mitchellh/vagrant/blob/master/keys/vagrant.pub
chmod 0600 ~/.ssh/authorized_keys
```
プライベート鍵はホストに設置
<br/>
#### vagrantユーザーの権限
sudoをパスワード無しで実行出来るように変更
`echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers`
requiretty を無効化
`sed -i -e "s:^.*requiretty:#Defaults requiretty:" /etc/sudoers`

<br/>
#### rootパーティションの容量変更
<em>参考：https://access.redhat.com/ja/node/1275093#storage_default</e,>

AtomicHostではdockerのイメージなどはdocker-pool と呼ばれるコンテナーイメージパーティションに保存されます。インストール時にパーティションを自動設定にした場合、rootパーティションに3GBが割り当てられ、残りが全てdocker-poolに割り当てられます。

（AtomicHostのファイル周りはとても面白いので、上記の参考ページやProject本家のページなどは一度読まれると良いかと思います。）<br/>
今回は30GBのDiskを生成したので、下記のようになっています。

```
bash-4.2# lvs
  LV          VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  docker-pool cah  twi-a-tz-- 25.12g             0.04   0.43                            
  root        cah  -wi-ao----  3.00g                                                    
  swap        cah  -wi-ao----  1.03g 
```
※VG（ボリュームグループ）はホスト名から自動で設定されます。ホスト名を指定していない場合は「cah」となります。
<br/>
コンテナのビルドなどは別なマシンで行うか、docker hubからpullするだけであればこれでも問題は無いのですが、この仮想マシンでコンテナのビルドを行う場合などに、大きなファイルを解凍したり何か作業をした場合、以外と3GBは直ぐに一杯になってしまいます。
そこで、rootパーティションを拡張します。
<br/>
インストール後にrootパーティションのサイズを変更する場合には以下の方法があります。

* ストレージを追加
* rootパーティションを拡張（docker-poolを縮小）

今回は2番目の方法でやってみます。
※但し、この方法の場合はdocker-poolの中身が削除されますので、既にコンテナイメージなどがある場合は、docker hubなどに退避して下さい。

```
# systemctl stop docker docker-storage-setup
# rm -rf /var/lib/docker/*
# lvm lvremove cah/docker-pool
# lvextend -L +7GB /dev/mapper/cah-root
# systemctl start docker-storage-setup
# systemctl start docker
```

**最後のファイルシステムの拡張を忘れていました。。。**

```
# xfs_growfs /dev/mapper/cah-root
```

※今回使用したのは7系のため、`resize2fs` ではだめで、`xfs_growfs` を利用します。


これで、rootパーティションが10GBになり、docker-poolがその分少なくなりました。

```
bash-4.2# lvs
  LV          VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  docker-pool cah  twi-aotz-- 18.27g             0.06   0.34                            
  root        cah  -wi-ao---- 10.00g                                                    
  swap        cah  -wi-ao----  1.03g
```

<br/>
ここまででVirtualBoxでの作業は終了
<br/>

## BaseBoxの作成
上記で作成した仮想マシンからBaseBoxに変更します。
仮想マシンのvdiがあるディレクトリへ移動しパッケージ化

```
# cd ~/VirtualBox VMs/atomichost-base
# vagrant package --base atomichost-base --output atomichost-base.box
```
atomichost-base.boxと言うBaseBoxが出来上がりました。

後はいつもどおり、

```
# vagrant box add AtomicHost atomichost-base.box
# vagrant init AtomicHost
# vagrant up
```

として、ネットワーク、ホスト名、共有フォルダなどをVagrantfileで指定すれば出来上がりです。


<br/><br/>
※作成したBoxは圧縮とかしてもう少し整理したらどこかにアップしようと思います。
<br/>
****
参考
 http://d.hatena.ne.jp/banrui/20140702/1404311383
http://momijiame.tumblr.com/post/77460699382/vagrant-%E3%81%AE-virtualbox-%E7%94%A8-base-box-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%89%8B%E5%8B%95%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B