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

イメージをダウンロード

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

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秘密鍵から公開鍵を生成しておく。

# 秘密鍵のパスを取得
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のパスワードも設定しておく。

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__

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

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の作成

公式ドキュメントに書いてあるとおりに実行。
genisoimageが必要なのでdebianのdockerイメージで作成する。

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でダウンロードしたイメージ
SATA2: seed.iso
IDE1: VBoxGuestAdditions.iso
ネットワーク NAT: 2222 -> 22

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

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でログインする。

ssh vagrant@localhost -p 2222 -i ${PKEY}
# vagrantをごまかすためにシンボリックリンクをはる
sudo ln -s /etc/system-release /etc/redhat-release

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

# 依存パッケージのインストール
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の作成と登録

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

Vagrantで起動してみる

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

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

参考サイト