AmazonLinux2のVagrant boxを作成してみた

Amazon Linux 2 が公開されたのでVirtualBox用のboxファイルを生成してみた。

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

AmazonLinuxのOSイメージは https://cdn.amazonlinux.com/os-images/latest/ で公開されている。
VirtualBox用のvdiファイルをダウンロードする。


```bash
wget -O amznlinux2.vdi https://cdn.amazonlinux.com/os-images/2017.12.0.20171212.2/virtualbox/amzn2-virtualbox-2017.12.0.20171212.2-x86_64.xfs.gpt.vdi
```

# Vagrantの公開鍵を生成

`vagrant ssh`でSSHログインできるようにローカルのvagrant秘密鍵から公開鍵を生成しておく。

```bash
# 秘密鍵のパスを取得
PKEY=$(vagrant ssh-config | grep IdentityFile | awk '{print $2}')
# 公開鍵をシェル変数に突っ込む(user-dataで使う)
PUBKEY=$(ssh-keygen -yf ${PKEY})
```

# user-dataの作成

AmazonLinuxのVMイメージはそのままではログインできないので、user-dataをseed.isoを使って実行する必要があるらしい。
`vagrant`ユーザの作成と、念のためrootのパスワードも設定しておく。

```bash
cat <<__EOT__ > user-data
#cloud-config
users:
  - name: vagrant
    sudo: [ "ALL=(ALL) NOPASSWD:ALL" ]
    ssh_pwauth: True
    ssh_authorized_keys:
      - ${PUBKEY}
chpasswd:
  list: |
    root: amazonlinux2
    vagrant: vagrant
  expire: False
__EOT__
```

こんな感じのファイルができる。

```yaml:user-data
#cloud-config
users:
  - name: vagrant
    sudo: [ "ALL=(ALL) NOPASSWD:ALL" ]
    ssh_pwauth: True
    ssh_authorized_keys:
      - ssh-rsa XXXXXXXX.....
chpasswd:
  list: |
    root: amazonlinux2
    vagrant: vagrant
  expire: False
```



# seed.isoの作成

[公式ドキュメント](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-2-virtual-machine.html)に書いてあるとおりに実行。
`genisoimage`が必要なのでdebianのdockerイメージで作成する。

```bash
echo "local-hostname: amznlinux2" > meta-data
# ローカルディレクトリをマウントして起動
docker run -it --rm -v $(pwd):/data debian sh
# 以降はdockerコンテナ内でのコマンド
apt-get update && apt-get install -y genisoimage
cd /data; genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data
exit
```

カレントディレクトリに`seed.iso`が生成されている。

```
$ ls
amznlinux2.vdi  meta-data  seed.iso  user-data
```

# VirtualBoxでAmazonLinux2を起動

|設定項目|値|
|---|---|
|仮想マシン名|任意|
|タイプ|Linux|
|バージョン|Red Hat (64-bit)|
|メモリ|1024MB|
|ストレージ| SATA1: 1でダウンロードしたイメージ<br>SATA2: seed.iso<br>IDE1: VBoxGuestAdditions.iso|
|ネットワーク| NAT: 2222 -> 22 |

コマンドラインで作成する場合は以下。

```bash
VM=amznlinux2
# 仮想マシンを作成
VBoxManage createvm --name "$VM" --ostype "RedHat_64" --register
# 仮想ストレージアレイを追加
VBoxManage storagectl "$VM" --name "SATA Controller" --add "sata" --controller "IntelAHCI"
VBoxManage storagectl "$VM" --name "IDE Controller" --add "ide"
# 仮想ディスクとISOをアタッチ
VBoxManage storageattach "$VM" --storagectl "SATA Controller" \
  --port 0 --device 0 --type hdd --medium amznlinux2.vdi
VBoxManage storageattach "$VM" --storagectl "SATA Controller" \
  --port 1 --device 0 --type dvddrive --medium seed.iso
VBoxManage storageattach "$VM" --storagectl "IDE Controller" \
  --port 0 --device 0 --type dvddrive --medium /path/to/VBoxGuestAddtions.iso
# ポートフォワードとメモリを調整
VBoxManage modifyvm "$VM" --natpf1 "ssh,tcp,127.0.0.1,2222,,22" --memory 1024 --vram 8
# 仮想マシンを起動
VBoxManage startvm "$VM" --type headless
```

# VBoxGuestAdditionsをインストール

作成した仮想マシンにSSHでログインする。

```bash
ssh vagrant@localhost -p 2222 -i ${PKEY}
```

```bash
# vagrantをごまかすためにシンボリックリンクをはる
sudo ln -s /etc/system-release /etc/redhat-release
```

仮想マシンにVBoxGuestAdditionsをインストールする。

```bash
# 依存パッケージのインストール
sudo yum install -y kernel-devel perl gcc
# VBoxGuestAdditions.isoをマウントしてインストール
sudo mount -r /dev/cdrom /mnt
sudo /mnt/VBoxLinuxAdditions.run --nox11
sudo umount /mnt
# Box化したときに圧縮効率を良くするため空ファイルを作成して削除
sudo rm -rf /var/cache/yum
sudo dd if=/dev/zero of=/EMPTY bs=1M
sudo rm -f /EMPTY
# シャットダウン
sudo poweroff
```

# boxの作成と登録

```bash
vagrant package --base "$VM"
vagrant box add --name "amzn2-2017.12.0.20171212.2-x86_64" package.box
```

# Vagrantで起動してみる

```bash
vagrant init amzn2-2017.12.0.20171212.2-x86_64
# そのままvagrant upを実行するとSSHのhost_keyでエラーになるので
# イメージ生成時に利用したhost_keyを削除しておく(いらないかも)
sed -i '/localhost/d' ~/.ssh/known_hosts
# 起動！
vagrant up
vagrant ssh
```

仮想マシンにログインできれば成功！！

# 参考サイト

- [Create VirtualBox VM from the command line](https://www.perkin.org.uk/posts/create-virtualbox-vm-from-the-command-line.html)
- [cloud-init に関する FAQ](https://access.redhat.com/ja/node/1460743)
- [VagrantでオリジナルBoxを作成する](https://qiita.com/sims0728/items/306cf0434046296459b5)