公開日:2026/9/10 0:00:00

Amazon Linux 2023 を vagrant で使うメモ

Section 1.3 packer で box 作成 packer で box 作成 2 - provisioners -

About

Section 2.2 で作成した amazonlinux2023.12.pkr.hcl 内で必要なファイルを作成していきます。

Cloud-init のための seed.iso

OSイメージはあるが、中身はある意味で空っぽなので Cloud-init を使って初期化するための情報を作成します。 公式ドキュメントとしては KVM および VMware での Amazon Linux 2023 の NoCloud (seed.iso) cloud-init 設定 を参考にすることになります。

まずは seed フォルダ 内に、meta-datauser-data を作成します。

meta-data

#cloud-config
local-hostname: localhost.example.com

host名くらい

user-data

#cloud-config
users:
  - name: ec2-user
    sudo: ALL=(ALL) NOPASSWD:ALL
    lock_passwd: false
    plain_text_passwd: vagrant
  - name: vagrant
    sudo: ALL=(ALL) NOPASSWD:ALL
    lock_passwd: false
    plain_text_passwd: vagrant
ssh_pwauth: true
timezone: Asia/Tokyo
locale: ja_JP.utf8

最後の二行はmeta-dataな気もするけれどいったんこの内容で、isoイメージを作成します。

seed.iso の作成

ここでは、cygwin をインストールして cdrkit というパッケージをインストールして作成しました。 ほかに簡単にisoイメージが作成できる環境があればそれを使ってください。

$ cd /cygdrive/c/vagrant/packer-amazonlinux2023/seed
$ genisoimage -output ../seed.iso -volid cidata -joliet -rock user-data meta-data

これで、seed.iso が作成できます。 user-data や meta-data の内容を変えるたびに、isoイメージを作る必要があります。

Vagrantfile.template の作成

作成された box に初期設定を埋め込むためのテンプレートファイルを作成します。 vagrant-config フォルダの中に、Vagrantfile.template ファイルを作成します。

Vagrantfile.template

Vagrant.configure("2") do |config|
  config.vm.provider "virtualbox" do |vb|
    # PAE/NX On
    vb.customize ["modifyvm", :id, "--pae", "on"]

    # Serial port setting
    vb.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
  end
end

フォルダ構造の確認

ここまでで、基礎となるファイルが一式そろったので、環境を整えるための provisioners の中身を作成していきます。

現時点での構成はこうなっています。

[-] C:\
 `--[-] vagrant
     |--[+] box
     |--[+] iso
     |--[-] packer-amazonlinux2023
     |   |--[+] provisioners
     |   |--[-] seed
     |   |   |-- meta-data
     |   |   `-- user-data
     |   |--[-] vagrant-config
     |   |   `-- Vagrantfile.template
     |   |-- amazonlinux2023.12.pkr.hcl
     |   `-- seed.iso
     `-- packer.exe

ここから provisioners にファイルを追加していくのでこうなっていきます。

[-] C:\
 `--[-] vagrant
     |--[+] box
     |--[+] iso
     |--[-] packer-amazonlinux2023
     |   |--[-] provisioners
     |   |   |-- vagrant.sh
     |   |   |-- kernel-update-6.18.sh
     |   |   |-- kernel-update-clean.sh
     |   |   |-- virtualbox.sh
     |   |   `-- cleanup.sh
     |   |--[-] seed
     |   |   |-- meta-data
     |   |   `-- user-data
     |   |--[-] vagrant-config
     |   |   `-- Vagrantfile.template
     |   |-- amazonlinux2023.12.pkr.hcl
     |   `-- seed.iso
     `-- packer.exe

ファイル名から何となく察することができるかと思いますがサクサク作っていきます。

provisioners/vagrant.sh

vagrant ユーザーの認証方法の追加設定。

echo 'Setup vagrant account'
mkdir -pm 700 /home/vagrant/.ssh
curl -L https://raw.githubusercontent.com/hashicorp/vagrant/refs/heads/main/keys/vagrant.pub -o /home/vagrant/.ssh/authorized_keys
chmod 0600 /home/vagrant/.ssh/authorized_keys
chown -R vagrant:vagrant /home/vagrant/.ssh

Cloud-init で vagrant ユーザーは作成されているので vagrant ssh ではいれるようにカギを入れておきます。 rootになる suoder の設定も Cloud-init で処理されているのでここでは対応しません。

provisioners/kernel-update-6.18.sh

EC2のAMIで選べるkernelバージョンが 6.18 らしいので、6.1 から upgrade します。

echo "Upgrade kernel from 6.1 to 6.18"
dnf -y install kernel6.18
echo "Set default boot kernel"
version=$(rpm -q --qf '%{version}-%{release}.%{arch}\n' kernel6.18 | sort -V | tail -1)
grubby --set-default "/boot/vmlinuz-$version"
reboot

dnf で新しい kernel をインストールして、grubby でboot時のkernelを指定しています。

provisioners/kernel-update-clean.sh

古い kernelを削除します。

echo 'Remove old kernel'
dnf remove -y kernel

provisioners/virtualbox.sh

VirtualBox Guest Addition をインストールします。 必要なものを dnf でインストール。kernelバージョンに合わせたものも必要なのでごにょごにょしています。 インストーラーの入った iso イメージは、VirutalBoxの公式サイトからダウンロードしてそれを使っています。

echo 'Install VBoxLinuxAdditions'
dnf -y install gcc gcc-c++ make perl

KERNEL_VERSION=$(uname -r | sed -E "s/(^6...).*/\1/g")
dnf -y install kernel${KERNEL_VERSION}-devel kernel${KERNEL_VERSION}-headers

VBOX_VERSION=$(cat /home/vagrant/.vbox_version)
wget https://download.virtualbox.org/virtualbox/${VBOX_VERSION}/VBoxGuestAdditions_${VBOX_VERSION}.iso -O /tmp/VBoxGuestAdditions.iso
mount -o loop /tmp/VBoxGuestAdditions.iso /mnt
sh /mnt/VBoxLinuxAdditions.run
# /sbin/rcvboxadd quicksetup all
umount /mnt
rm -rf /tmp/VBoxGuestAdditions.iso
echo 'VBoxLinuxAdditions installed.'

provisioners/cleanup.sh

最後に容量を圧縮するためにいろいろ削除していきます。

echo 'Clenup'
dnf -y clean all
rm -f /tmp/*
dd if=/dev/zero of=/EMPTY bs=1M
rm -f /EMPTY

これで box ファイルの圧縮率を上げています。

HCL2ファイルの修正

shellファイルが準備できたので、実行するようにHCL2ファイル、amazonlinux2023.12.pkr.hclを書き換えます。

build {
  sources = ["sources.virtualbox-ovf.AmazonLinux2023"]

  provisioner "shell" {
    execute_command = "echo 'vagrant' | sudo -S sh '{{ .Path }}'"
    scripts = [
      "./provisioners/vagrant.sh"
    ]
  }

  provisioner "shell" {
    execute_command = "echo 'vagrant' | sudo -S sh '{{ .Path }}'"
    scripts = [
      "./provisioners/kernel-update-6.18.sh"
    ]
    expect_disconnect = true
    pause_after = "30s"
  }

  provisioner "shell" {
    execute_command = "echo 'vagrant' | sudo -S sh '{{ .Path }}'"
    scripts = [
      "./provisioners/kernel-update-clean.sh",
      "./provisioners/virtualbox.sh",
      "./provisioners/cleanup.sh",
    ]
  }

  post-processor "vagrant" {
    keep_input_artifact = false
    vagrantfile_template = "./vagrant-config/Vagrantfile.template"
    output = "./AmazonLinux-${var.al_version}_VB${var.virtualbox_version}.box"
  }
}

という感じに書き換わります。

packer build

すべて整ったらpowershellからpackerを実行します。

PS> cd c:\vagrant\packer-amazonlinux2023
PS> ..\packer.exe build amazonlinux2023.12.pkr.hcl

必ずHCLファイルがある場所に移動してから実行してください。相対パスに影響するのでその場所で実行という感じになります。

実行後は、勝手にvirtualbox のウィンドウが開いてインストールが始まり、再起動後に、今度はpowershellのコンソールからコマンドが実行される様子が見られ、勝手に終了してboxファイルの作成まで進みます。

完成すれば、HCL内のoutputに書いたファイル名で出力されているので、あとはvagrantから使ってみましょう。