公開日:2025/8/10 0:00:00

AlmaLinux 9.6 セットアップメモ

Section 2.2 packer で box 作成 1 - OSインストール -

About

vagrant で使用するOSイメージのboxを作成します。
基本的にOSインストールで作業した内容をそのまま自動化して作成します。 それぞれのメモの内容と異なるのは、vagrantユーザーがあること、鍵認証方式のみに制限していない、公開するわけではないのでSSHやwheel関係はちゃんと設定していないという3点になります。

フォルダ構造

いろいろ作成することになりますが、下記のような構造で作業していきます。
特に説明がなければ、フォルダやファイルはあるということになります。

[-] C:\
 `--[-] vagrant
     |--[+] box
     |--[+] iso
     |--[-] packer-almalinux-9
     |   |--[+] builders
     |   `--[+] provisioners
     `-- packer.exe

構成など

packer のvirtualboxとvagrantのプラグインを使って構築するわけですが、ドキュメントが分かりにくい……一度構成を作成してしまえば、あとはOSのバージョンアップに合わせて微調整という感じになるので、最初だけは手間をかけてください。

基本的には、packer build 設定ファイル.pkr.hcl でHCLファイルの内容に沿ってセットアップをしていきます。 HCL(HashiCorp Configuration Language)はHashiCorp社が開発した、人間が読み書きしやすく、かつ機械による自動処理にも適した設定言語です。TerraformやPackerなど、同社の多くのツールで採用されています。 HCLファイルは、sourceブロックで仮想マシンの元となるイメージ(ISOファイルなど)を指定し、buildブロックでプロビジョニング(shellの実行など)や後処理(boxファイルの作成など)を定義します。

HCL2ファイル

まずは、packer-almalinux-9 フォルダに、almalinux9_6-SELinux-min.pkr.hclを作成します。

内容は下記の通り。 required_pluginssourcebuildブロックは必須です、localsはバージョンアップ毎に見直して書き直すのが手間だったので、OSバージョンとisoファイルのハッシュ値を指定できるように変数にしています。 また、virtualboxのバージョンを作成したBoxファイル名に適応するために、variableブロックを使ってコマンドラインから指定できるようにしています。

packer {
  required_plugins {
    vagrant = {
      source  = "github.com/hashicorp/vagrant"
      version = "~> 1"
    }
    virtualbox = {
      source  = "github.com/hashicorp/virtualbox"
      version = "~> 1"
    }
  }
}

variable "dropbox_version" {
  type        = string
  description = "Dropbox version"
  default     = "7.1.8"
  sensitive   = false
}

locals {
  alumalinux_version = "9.6"
  iso_checksum       = "27a346c74d8755516a4ad2057ea29c2450454f1a928628734f26e12b0b8120d7"
}

source "virtualbox-iso" "AlmaLinux" {
  vm_name                 = "AlumaLinux${local.alumalinux_version}-x86_64_minimal"
  iso_url                 = "..\\iso\\AlmaLinux-${local.alumalinux_version}-x86_64-minimal.iso"
  iso_checksum            = "${local.iso_checksum}"
  guest_os_type           = "RedHat_64"
  guest_additions_path    = "VBoxGuestAdditions.iso"
  ssh_username            = "vagrant"
  ssh_password            = "vagrant"
  ssh_port                = 22
  ssh_wait_timeout        = "10000s"
  hard_drive_interface    = "sata"
  disk_size               = 20000
  vboxmanage              = [
    ["modifyvm", "{{ .Name }}", "--memory", "2048"],
    ["modifyvm", "{{ .Name }}", "--cpus", "2"],
    ["modifyvm", "{{ .Name }}", "--nat-localhostreachable1", "on"]
  ]
  virtualbox_version_file = ".vbox_version"
  http_directory          = "./builders"
  boot_wait               = "10s"
  boot_command            = [
    "<up><tab> inst.text inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks-${local.alumalinux_version}-selinux.cfg<enter><wait>"
  ]
  shutdown_command        = "echo 'vagrant' | sudo -S poweroff"
}

build {
  sources = ["source.virtualbox-iso.AlmaLinux"]

  post-processor "vagrant" {
    keep_input_artifact = false
    output = "./AlmaLinux-${local.alumalinux_version}-x86_64-min-jp-selinux_VB${var.dropbox_version}.box"
  }
}

“iso_url” には、ダウンロードしておいたインストーラーのisoイメージのパス情報が入ります。ルールは決まっているので、alumalinux_versionのバージョンを指定すればよい状態にしてあります。 また、“iso_checksum” は、isoイメージと一緒にダウンロードした、CHECKSUMファイルに記載されている値かダウンロードしたサイトに記載されている値を使うことになりますが、変数化してあるのでlocals内の変数に入れることになります。

それ以外はほぼおまじないですが、仮想マシンのHDD、CPU、メモリを変えたい場合は “disk_size”“vboxmanage” あたりを変更してください。

Windows 11 で VirtualBox と WSL(Hyper-V) を共存させる場合の注意 (2025-08-05)

仮想マシンの CPU数と実行しているPCのCPUコア数が一致させるか、2以上にしないと AlmaLinux の起動時に Kernel Panic が発生します。
また、仮想マシンの CPU数と実行しているPCのCPUコア数が一致していないと、パフォーマンスが著しく悪くなりとても時間がかかってしまうことになるので、他者に配布しないのであれば一致させた状態にしておくとよいでしょう。

仮想マシンのCPU数は 2 にしておくことでいろいろ回避できていたので、この説明では ["modifyvm", "{{.Name}}", "--cpus", "2"] という感じで 2 にしています。今時であれば、4 でもいいと思いますが……

それ以外の細かいことは VirtualBox Builder (from an ISO)を見て下さい。

これだけ書いても、boot_commandにある ks-9.6-selinux.cfg がないので、VirtualBox上にイメージだけ作られて終わってしまうだけなので、OSインストールのための設定ファイルを作成します。

OS自動インストールの ks(キックスタートファイル)作成

vagrant\packer-almalinux-9\buildersks-9.6-selinux.cfgファイルを下記の内容で作成します。 Linux Kickstartファイルなどで検索するとどういうものか説明が出てくると思うのですが、同じ内容でインストールするのに毎回UIを操作するのもだるいよね……というときに使うもの。

基本的には、手動でインストールしたAlamaLinuxの /home/root ディレクトリ内にインストール時の条件や設定を記録した、anaconda-ks.cfg を参考にしつつ手を加えたものとなります。順序が異なるので比較しにくいのですが、OSのメジャーアップデート時以外はそうそう見ないと思います。

説明しているサイトも多いのでそれはそれで見てもらいつつ、packagesで、minimal…最小構成を選択したうえで、wifiのドライバ関係は入れないという設定を追加。

自動インストールで設定を変えることや選ぶこともないのにUIが表示されて眺めるのも無駄な感じがするので text ui install というところで、text install にしています。

ホスト名は network —hostname=localhost.example.com で指定。rootパスワードはvagrantを使う関係でvagrantに設定しています。また、vagrantユーザーを作成する必要があるのでそれも作成するようにしていますがこの辺りは、post つまり、パッケージをインストールした直後にコマンドを実行して作成しています。

# AlmaLinux 9.6
#version=RHEL9.6

# Use CDROM installation media
cdrom

%packages
@^minimal-environment
-iwl100-firmware
-iwl1000-firmware
-iwl105-firmware
-iwl135-firmware
-iwl2000-firmware
-iwl2030-firmware
-iwl3160-firmware
-iwl5000-firmware
-iwl5150-firmware
-iwl6000g2a-firmware
-iwl6050-firmware
-iwl7260-firmware

%end

# text ui install
text
skipx
firstboot --disabled

# System language
lang ja_JP.UTF-8

# Keyboard layouts
keyboard --xlayouts='jp'

# System timezone
timezone Asia/Tokyo --utc
timesource --ntp-pool=ntp.jst.mfeed.ad.jp

# Network information
network --device enp0s3 --bootproto dhcp --ipv6=auto --activate
network --hostname=localhost.example.com

# firewall
firewall --enabled --ssh
selinux --enforcing

# services
services --enabled=sshd

# Root password
rootpw --plaintext vagrant

# System bootloader configuration
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"

zerombr
# Partition clearing information
clearpart --none --initlabel
autopart --type=plain --nohome --noboot

reboot --eject

%addon com_redhat_kdump --enable --reserve-mb='auto'
%end

%post
# /usr/sbin/groupadd vagrant
/usr/sbin/useradd vagrant -G wheel
echo "vagrant" | passwd --stdin vagrant
echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant
echo "Defaults:vagrant !requiretty" >> /etc/sudoers.d/vagrant
chmod 0440 /etc/sudoers.d/vagrant
sed -i "s/^.*requiretty/# Defaults requiretty/" /etc/sudoers
dnf -y update
# Disable SELinux
#setenforce 0
#dnf -y install grubby
#grubby --update-kernel ALL --args selinux=0
##
%end

さて、%post 内にいろいろ書けそうに見えていると思いますが、細かいことは provisioners でやりたいので、ここはここまで。

この時点で、boxファイルが生成される状態になります。

この次は、provisionersについて……これはいろいろあるので別ページにまとめます。

SELinux の問題

Red Hat Enterprise Linux 9(RHEL 9)から、SELinux を設定ファイルで無効化しないようにということになりました。
それもあり、この手順では SELinux を有効にした手順となっています。

ではどうやって無効化するのか?

新しいKernelから、disableにしてもポリシーがロードされたり、裏に存在しているので間違ってSELinuxを有効にしてしまったとき(更新などで有効にされたとき)に、システムが起動しない可能性があるので、ブートローダーの時点で無効化するしかないそうです。

そのため、%post の最後でカーネルコマンドラインに selinux=0 を追加してブートローダーを変更するという処理を入れることになります。これは、RHEL 9 のマニュアルにある手順なのでこうするしかないのかなと。

SElinux を無効にした box を作る場合は、# Disable SELinux から ## の間の部分をアンコメントしてみてください。

# Disable SELinux
setenforce 0
dnf -y install grubby
grubby --update-kernel ALL --args selinux=0
##