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
仮想マシンにログインできれば成功!!