AlmaLinux 10.1 セットアップメモ
Section 1.2 packer で box 作成 1 - OSインストール -
About
vagrant で使用するOSイメージのboxを作成します。
基本的にOSインストールで作業した内容をそのまま自動化して作成します。
開発用の vagrant box なので、公開用としてセットアップするものとしては適切ではありませんのでご注意ください。
なお、vagrantを使う上でトラブらないように、vagrantユーザーがあること、鍵認証方式のみに制限していない、SSHやwheel関係はvagrant用となっています。
また、SELinux を有効にする前提の手順となっています。 通常は無効化しているのですが、
フォルダ構造
いろいろ作成することになりますが、下記のような構造で作業していきます。
特に説明がなければ、フォルダやファイルはあるということになります。
[-] C:\
`--[-] vagrant
|--[+] box
|--[+] iso
|--[-] packer-almalinux-10
| |--[+] 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ファイルの作成など)を定義します。
HCLファイル
まずは、packer-almalinux-10 フォルダに、almalinux10_1-min-SELinux.pkr.hclを作成します。
内容は下記の通り。
required_plugins、source、buildブロックは必須です、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 "virtualbox_version" {
type = string
description = "VirtualBox version"
default = "7.2.2"
sensitive = false
}
locals {
alumalinux_version = "10.1"
iso_checksum = "049efd183a5a841dd432b3427eb6faa7deb3bf6c6bf2c63cbffa024b9c651725"
}
source "virtualbox-iso" "AlmaLinux" {
vm_name = "AlumaLinux${local.alumalinux_version}-x86_64_minimal_SELinux"
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>",
"e<wait>",
"<down><down><end>",
" inst.text inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks-${local.alumalinux_version}-SELinux.cfg",
"<leftCtrlOn>x<leftCtrlOff>"
]
shutdown_command = "echo 'vagrant' | sudo -S poweroff"
}
build {
sources = ["source.virtualbox-iso.AlmaLinux"]
provisioner "shell" {
execute_command = "echo 'vagrant' | sudo -S sh '{{ .Path }}'"
inline = [
"dnf -y update",
"reboot"
]
expect_disconnect = true
pause_after = "30s"
}
post-processor "vagrant" {
keep_input_artifact = false
output = "./AlmaLinux-${local.alumalinux_version}-x86_64-min-jp-SELinux_VB${var.virtualbox_version}.box"
}
}
“iso_url” には、ダウンロードしておいたインストーラーのisoイメージのパス情報が入ります。
ルールは決まっているので、alumalinux_versionのバージョンを指定すればよい状態にしてあります。
また、“iso_checksum” は、isoイメージと一緒にダウンロードした、CHECKSUMファイルに記載されている値かダウンロードしたサイトに記載されている値を使うことになります。
Checksumの値は変数化してあるのでlocals内の変数に入れることになります。
それ以外はほぼおまじないですが、仮想マシンのHDD、CPU、メモリを変えたい場合は “disk_size”、 “vboxmanage” あたりを変更してください。
Windows 11 で VirtualBox と WSL(Hyper-V) を共存させる場合の注意
仮想マシンの CPU数と実行しているPCのCPUコア数が一致させるか、2以上にしないと AlmaLinux の起動時に Kernel Panic が発生します。
また、仮想マシンの CPU数と実行しているPCのCPUコア数が一致していないと、パフォーマンスが著しく悪くなりとても時間がかかってしまうことになるので、他者に配布しないのであれば一致させた状態にしておくとよいでしょう。
仮想マシンのCPU数は 2 にしておくことでいろいろ回避できていたので、この説明では ["modifyvm", "{{.Name}}", "--cpus", "2"] という感じで 2 にしています。今時であれば、4 でもいいと思いますが……
build 内の最初の provisioner で dnf update を実行して再起動しています。
これは、この後の工程でインストールする VirtualBox Guest Additions で起動中のカーネルに影響するなどの関係から安全策として、このタイミングで更新して再起動するという工程を挟んでいます。
それ以外の細かいことは VirtualBox Builder (from an ISO)を見て下さい。
これだけ書いても、boot_commandにある ks-10.1-SELinux.cfg がないので、VirtualBox上にイメージだけ作られて終わってしまうだけなので、OSインストールのための設定ファイルを作成していきます。
OS自動インストールの ks(キックスタートファイル)作成
vagrant\packer-almalinux-10\buildersにks-10.1-SELinux.cfgファイルを下記の内容で作成します。 Linux Kickstartファイルなどで検索するとどういうものか説明が結果でヒットすると思うので、詳しくはそちらを読んでください。 ざっくり、UI操作をせずに同じ設定内容でインストールする……というときに使うものと認識しておけばよいでしょう。
基本的には、手動でインストールしたAlamaLinuxの /home/root ディレクトリ内に生成される、インストール時の条件や設定を記録した anaconda-ks.cfg を参考にしつつ手を加えたものとなります。 vagrant用に追記したり、記載順を変更しているので、手動インストール時との比較は少し面倒かもしれません。
説明しているサイトも多いのでそれはそれで見てもらいつつ、packagesで、minimal…最小構成を選択しています。 さらに、tar や zip は使うのでこの時点でインストールするように指示。Wifiのドライバ関係は入れないという設定を追加。SELinuxを無効にする場合に必要になる grubbyをインストールするようにしています。インストール後に無効にするケースもあるので、この時点で入れるようにしています。
自動インストールで設定を変えることや選ぶこともないのにUIが表示されて眺めるのも無駄な感じがするので text ui install というところで、text install にしています。
ホスト名は network —hostname=localhost.example.com で指定。
rootパスワードはvagrantを使うのとセットアップで使うため vagrant に設定しています。 また、vagrantユーザーを作成する必要があるので user で追加。細かい設定は %post でコマンドで変更しています。
# AlmaLinux 10.1 SELinux
#version=RHEL10.1
# Use CDROM installation media
cdrom
%packages --ignoremissing
@^minimal-environment
# add packages
tar
bzip2
# remove packages
-iwlwifi-dvm-firmware
-iwlwifi-mvm-firmware
# This package is used to disable SELinux.
grubby
##
%end
# text ui install
text
skipx
firstboot --disabled
# System language
lang ja_JP.UTF-8
# Keyboard layouts
keyboard --xlayouts='jp'
# Network information
network --bootproto=dhcp --device=enp0s3 --ipv6=auto --onboot=yes --activate
network --hostname=localhost.example.com
# System timezone
timezone Asia/Tokyo --utc
timesource --ntp-pool=ntp.jst.mfeed.ad.jp
# firewall
firewall --enabled --ssh
# services
services --enabled=sshd
# Root password
rootpw --plaintext vagrant
# Add vagrant user account
user --name=vagrant --groups=wheel --password=vagrant --plaintext
# System bootloader configuration
bootloader --location=mbr --driveorder=sda --append="rhgb quiet"
# Partition clearing information
ignoredisk --only-use=sda
autopart
clearpart --all --initlabel
zerombr
# Disable kdump
%addon com_redhat_kdump --disable
%end
# After installation, eject CD-ROM and reboot
reboot --eject
%post
# Allow SSH password login
sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
echo "UseDNS no" >> /etc/ssh/sshd_config
# Add vagrant to sudoers
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
# add packages(appStremas)
dnf -y install wget
dnf -y install epel-release
# remove packages
dnf -y remove samba-common samba-common-libs samba-client-libs
# Disable SELinux
# setenforce 0
# 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を有効にしてしまったとき(更新などで有効にされたとき)に、システムが起動しない可能性があるので、ブートローダーの時点で無効化するしかないそうです。 公式の手順に従うならば、カーネルコマンドラインに selinux=0 を追加してブートローダーを変更するという処理を入れることになります。 このカーネルコマンドラインの修正に grubby が必要なので最初のほうでインストールしています。
SElinux を無効にした box を作る場合は、# Disable SELinux から ## の間の部分をアンコメントしてみてください。
# Disable SELinux
setenforce 0
grubby --update-kernel ALL --args selinux=0
##
この場合、ksのファイル名を変えたりラベルも変えるとよいでしょう。