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

AlmaLinux 8.10

AlmaLinux 8.10 セットアップメモ

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

About

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

フォルダ構造

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

[-] C:\
 `--[-] vagrant
     |--[+] box
     |--[+] iso
     |--[-] packer-almalinux-8
     |   |--[+] 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-8 フォルダに、almalinux8_10-min.pkr.hclを作成します。

内容は下記の通り。 required_pluginssourcebuildブロックは必須です、localsはバージョンアップ毎に見直して書き直すのが手間だったので、指定できるように変数にしています。 variableブロックを使う方法もあるのですが、別で定義して使うよりも、固定化して使うものを切り替えるほうが個人的に好みなのでこの方法を採用しています。

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

locals {
  dropbox_version         = "7.1.8"
  alumalinux_version      = "8.10"
}

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            = "e524329700abe47ce1f509bed7e2d3c68b336a54c712daa1b492b2429a64d419"
  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}.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_VB${local.dropbox_version}.box"
  }
}

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

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

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

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

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

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

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

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

vagrant\packer-almalinux-8\buildersks-8.10.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 8.10
#version=RHEL8

# Use CDROM installation media
cdrom

%packages
@^minimal-environment
kexec-tools
-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 --isUtc --ntpservers=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 --disabled

# services
services --enabled=sshd

# Root password
rootpw --plaintext vagrant

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

ignoredisk --only-use=sda
autopart --type=plain --nohome --noboot
# Partition clearing information
clearpart --none --initlabel

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
# see Vagrant documentation (https://docs.vagrantup.com/v2/boxes/base.html)
# for details about the requiretty.
sed -i "s/^.*requiretty/# Defaults requiretty/" /etc/sudoers
yum -y update
%end

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

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

このままだと、何もない巣の状態なので、事前設定を行うために provisioners を記載します。