CentOS 5.6のVagrant boxを自前で作成する

# CentOS 5.6のVagrant boxを自前で作成する

veeweeやpackerは使わずVirtualBoxとVagrantだけで作ってみます

参考：
  http://docs-v1.vagrantup.com/v1/docs/base_boxes.html

環境：
　VirtualBox 4.2.16
　Vagrant 1.2.7

## インストールディスクダウンロード

  http://ftp.riken.jp/Linux/centos/5.6/isos/i386/CentOS-5.6-i386-bin-DVD.iso
  
  http://download.filesystems.org/linux/centos/CentOS-5.6-x86_64-bin-DVD-1of2.iso

  http://download.filesystems.org/linux/centos/CentOS-5.6-x86_64-bin-DVD-2of2.iso

## VirtualBox起動

* 新規で"CentOS56_32"を作成
* 種類：Linux,RedHat
* ビデオメモリ：8MB
* ストレージ：VMDK 32GB（可変）
* オーディオ：無効
* USB：無効

## インストール

1. CD/DVDで"CentOS-5.6-i386-bin-DVD.iso"を選択
2. VM起動

あとは通常のインストールの流れ。

（最小構成にしたいため、packageはBase、Text-based Internetのみcustomize）

## GuestOS設定

### rootのパスワード変更

    $ passwd

でvagrantに変更。
（インストール時にvagrantと設定しておくと不要）

### vagrantユーザ作成

    $ useradd vagrant
    $ passwd vagrant
    $ groupadd admin
    $ usermod -G admin -a vagrant

### Permission設定

    $ /usr/sbin/visudo

追加

```

Defaults env_keep += "SSH_AUTH_SOCK"
vagrant ALL=(ALL) ALL
%admin ALL=(ALL) NOPASSWD:ALL
```

変更

```
"Defaults requiretty" -> "Defaults !requiretty"
```

### VirtualBox Gest Additionsインストール

カーネルソースとヘッダを取得する。

古いバージョンはyumのリストに含まれていないので、直接ダウンロードして展開する。

    $ cd /usr/src/kernels
    $ wget http://vault.centos.org/5.6/os/i386/CentOS/kernel-devel-2.6.18-238.el5.i686.rpm
    $ wget http://vault.centos.org/5.6/os/i386/CentOS/kernel-headers-2.6.18-238.el5.i386.rpm
    $ rpm -ivh kernel-devel-2.6.18-238.el5.i686.rpm
    $ rpm -ivh kernel-headers-2.6.18-238.el5.i386.rpm
    $ rm kernel-devel-2.6.18-238.el5.i686.rpm
    $ rm kernel-headers-2.6.18-238.el5.i386.rpm
    $ export KERN_DIR=/usr/src/kernels/2.6.18-238.el5-i686
    
    $ yum -y install gcc
    
    $ mkdir /mnt/cdrom
    $ mount -r /dev/cdrom /mnt/cdrom
    $ cd /mnt/cdrom/
    
    $ sh VBoxLinuxAdditions.run
    
    $ VBoxControl --version
    $ VBoxService --version
    
    $ cd ~/
    $ umount /mnt/cdrom

### ssh設定

    $ sudo su vagrant
    $ cd ~/
    $ mkdir .ssh
    $ curl https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub > .ssh/authorized_keys

  proxy認証ではねられるときは --insecureオプションをつける。

    $ chmod 0755 .ssh
    $ chmod 0644 .ssh/authorized_keys

### 不要なファイルを削除

    $ du -sh *

で大きいファイルを探して不要なら削除していく。

例：
  * /usr/share/locale/ の使わないもの
  * /usr/share/i18n/locales/ の使わないもの
  * /usr/src/kernel/2.6.18-238.el5.i68
  * /var/cache/fontconfig
  * /var/cache/man
  * /var/cache/yum

yumで使った不要ファイル削除

    $ yum install yum-utils
    $ package-cleanup --dupes
    $ package-cleanup --cleandupes
    $ package-cleanup --oldkernels
    $ package-cleanup --problems
    
    $ yum clean all

### GuestOSシャットダウン

vagrantパッケージを作るためGuestOSをシャットダウン。

## vagrantのパッケージ作成

cmd.exe起動。

仮想環境を起動したいフォルダに移動。（例：vagrant_home\centos56）

    > vagrant package --base "C:\Users\user\VirtualBox VMs\CentOS56_32\CentOS56_32.vbox" --output centos56.box
    > vagrant init
    > vagrant box add centos56 centos56.box
    > vagrant up
    
MacではVM名に拡張子（vbox）をつけるとうまく出力されなかったので、vboxをつけずに実行
    
    $ vagrant package --base /Users/user/VirtualBox\ VMs/CentOS56/CentOS56_32 --output centos56.box

※共有フォルダ/vagrantがマウントされない場合GuestOS側で次を実行。

    $ mkdir /vagrant
    $ mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` v-root /vagrant

もし

    /sbin/mount.vboxsf: mounting failed with the error: Protocol error
    
となれば、VirtualBox側の共有フォルダ設定を削除してGuestOSを再起動させるとうまく設定された。

## vmdk圧縮（必要なら実行）

不要ファイル削除。

    $ du -sh *

で大きいファイルを探して不要なら削除していく。

localeの下の使っていない言語のものは削除。

GuestOS側で未使用領域を0埋め。（仮想HDDのMAXまで埋め尽くす）

    $ dd if=/dev/zero of=zero bs=4k
    $ rm zero

### vmdk->vdi変換

    > VBoxManage clonehd 変換前.vmdk 変換前.vdi --format vdi

### 圧縮

    > VBoxManage.exe modifyhd 変換前.vdi compact

### vdi->vmdk変換

    > VBoxManage clonehd 変換前.vdi 変換後.vmdk --format vmdk

## Chefインストール

### SELinuxを無効化（要再起動）

    $ sudo vi /etc/selinux/config

  "SELINUX=enforcing" -> "SELINUX=disabled"

### opensslインストール（Ruby2.0.0で必要）

    $ sudo yum install openssl-devel

### readlineインストール（Ruby2.0.0で必要）

    $ sudo yum install readline-devel

### zlibインストール（Ruby2.0.0で必要）

    $ sudo yum install zlib-devel

### RubyとRubyGemsをインストール

    $ cd /usr/src
    $ sudo wget http://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz
    $ sudo tar zxvf ruby-2.0.0-p247.tar.gz
    $ cd ruby-2.0.0-p247
    
    $ sudo ./configure --disable-install-doc --disable-install-rdoc --disable-install-capi
    $ sudo make
    $ sudo make install
    $ sudo make clean
    $ ruby -v
    $ cd ../
    $ sudo rm -rf ruby-2.0.0-p247*

### Chefインストール

    $ sudo gem install chef --no-ri --no-rdoc
    $ knife -v