Vagrantで自前のboxを作成する

公式でboxを配布していますが、一度最初からやってみたいなと思い、やってみました。
ちなみにWindows環境でやっています。

手順というよりは、作業ログみたいな感じで記録します。

##用意するもの
・Linuxのインストールメディア（ISO）
Docker公式が推している軽量のLinux「Alpine Linux」とか、「Ubuntu」とかやりやすそうですね。
ここでは手元にあった「RedHat Enterprise Linux」を使用します。「CentOS」でも同じだと思います。

・Vagrant
・VirtualBox

上記2つはインストール前提で話を進めます。

##VirtualBoxの設定
まずはLinuxをインストールしていきます。

「新規」をクリックして下記のように設定しました。
・仮想マシン名は「rhel7」
・Typeは「Linux」、バージョンは「Red Hat(64bit)」
・メモリ512MB、ファイルタイプVDI、可変サイズ、容量8GB

起動する前に「設定」をしました。
・NICはアダプタ1のみでNAT割り当てにする（デフォルト設定）
・オーディオを無効化する
・USBを無効化する

##OSインストール
・デバイスの光学ドライブにインストールメディアを指定する
・言語は「日本語」を指定
・ソフトウェアの選択は、適宜設定する
・イーサーネットはこの段階では設定しない
・rootパスワードは、本家ドキュメントに合わせて「vagrant」
・ユーザーの作成で「vagrant」、パスワードも「vagrant」
・ライセンス同意

インストール完了後、再起動してrootでログインする

###NIC有効化
このままだとssh等で繋げられないのでNICを設定します。
私の環境では「ifcfg-enp0s3」を利用します。

```text:ssh
ls -l /etc/sysconfig/network-scripts/ifcfg-enp0s3
sed -i -e "s/ONBOOT=no/ONBOOT=yes/" /etc/sysconfig/network-scripts/ifcfg-enp0s3
ls -l /etc/sysconfig/network-scripts/ifcfg-enp0s3
```

###Guest Additions
VirtualBox上で
[デバイス]→[光学ドライブ]→[Guest Additions CD イメージの挿入]

```text:ssh
mkdir /mnt/cdrom
ls -ld /mnt/cdrom

mount /dev/cdrom /mnt/cdrom/
cd /mnt/cdrom/
pwd
ls -l VBoxLinuxAdditions.run
sh VBoxLinuxAdditions.run
```

###その他
この辺は環境に合わせて自由に設定してみてください。
・デフォルトランレベル
・不要なサービスの停止
・ホストオンリーアダプタの利用

###sudoの設定

```text:ssh
visudo
```

下記を記載する
```vagrant ALL=(ALL)	NOPASSWD: ALL```

```text:ssh
su - vagrant
sudo ls /root
```

###SELinuxの設定

```text:ssh
ls -l /etc/sysconfig/selinux
vi /etc/sysconfig/selinux
```

下記を記載する
```SELINUX=disabled```

###ファイアウォールの設定

```text:ssh
systemctl status firewalld
systemctl stop firewalld
systemctl status firewalld
```

###鍵の登録

```text:ssh
ls -ld /home/vagrant/.ssh
mkdir -m 700 -p /home/vagrant/.ssh
ls -ld /home/vagrant/.ssh

ls -l /home/vagrant/.ssh/authorized_keys
touch /home/vagrant/.ssh/authorized_keys
chmod 600 /home/vagrant/.ssh/authorized_keys
chown -R vagrant:vagrant /home/vagrant
ls -l /home/vagrant/.ssh/authorized_keys

vi /home/vagrant/.ssh/authorized_keys
```

下記を記載する
```text:ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key```

```text:ssh
cat /home/vagrant/.ssh/authorized_keys
```

※やらないと、boxの起動時に「default: Warning: Authentication failure. Retrying...」とメッセージが出続ける

##ボックスの作成、登録

```text:ssh
shutdown -h now
```


コマンドプロンプトで操作

```text:コマンドプロンプト
vagrant --version
```

###ボックス化

```text:コマンドプロンプト
vagrant package --base [名前.box]
```

###登録

```text:コマンドプロンプト
vagrant box add [VM名] [名前.box]
vagrant box list
```

###初期化

```text:コマンドプロンプト
vagrant init [ユーザ名]/[VM名]
```


カレントに「Vagrantfile」が生成される
テキストエディタで開き、下記を追記する
config.vm.box = "[名前]"
config.ssh.guest_port = 22
config.ssh.username = "vagrant"
config.ssh.host = "127.0.0.1"
config.ssh.private_key_path = "C:/Users/[ユーザ名]/.vagrant.d/insecure_private_key"
config.ssh.insert_key = false

##ボックスの起動
###起動

```text:コマンドプロンプト
vagrant up
```

###ステータス確認

```text:コマンドプロンプト
vagrant status
```

###接続

```text:コマンドプロンプト
vagrant ssh
```

###停止

```text:コマンドプロンプト
vagrant halt
```

###設定確認

```text:コマンドプロンプト
vagrant ssh-config
```

###再起動

```text:コマンドプロンプト
vagrant reload
```

##boxのコピー
配布する際など、boxをコピーする場合はこちら

```text:コマンドプロンプト
vagrant package [VM名] --output [名前.box]
```