AlmaLinux を KickStart とか CentOS からのインプレースとかで入れてみる

CentOS 8 の代替になるかもしれない AlmaLinux が GA リリースとのことなので、とりあえずインストールしてみました。

KiskStart でインストール

KVM with libvirt へ virt-install で KiskStart でインストールしてみます。 手順は CentOS 8 とまったく同じで、ISO やリポジトリの URL が異なるのみです。

イメージのための論理ボリュームを作成します。

lvcreate vg0 -L 5G  -n vm.almalinux-8

イメージをダウンロードしておきます。 ここでは AlmaLinux-8.3-x86_64-boot.iso をダウンロードしていますが AlmaLinux-8.3-x86_64-minimal.iso とかのほうがインストールは早くなります。

cd /iso
wget http://ftp.iij.ad.jp/pub/linux/almalinux/8.3/isos/x86_64/AlmaLinux-8.3-x86_64-boot.iso

キックスタートファイル ks.cfg を作成します。AlmaLinux-8.3-x86_64-boot.iso なので cdrom ではなく url を指定する必要があります。

#version=RHEL8

cmdline
url --url=http://ftp.iij.ad.jp/pub/linux/almalinux/8.3/BaseOS/x86_64/os/

lang en_US.UTF-8
keyboard --vckeymap=jp --xlayouts=jp
timezone Asia/Tokyo --isUtc

network --activate --device=link --noipv6 --bootproto=dhcp

zerombr
clearpart --all --initlabel
bootloader --location=mbr --boot-drive=vda
part / --label=root --grow --asprimary --ondisk=vda

rootpw --plaintext password
skipx
selinux --disabled
firewall --disabled
firstboot --disabled

services --enabled=chronyd --disabled=kdump,auditd

poweroff

%packages
@^minimal-environment
%end

%post --log=/root/ks-post.log
set -eux

# authorized_keys
mkdir -p /root/.ssh
curl -fsSL https://github.com/ngyuki.keys > /root/.ssh/authorized_keys
chown -R root: /root/.ssh
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys

%end

virt-install で OS をインストールします。

virt-install \
  --name almalinux-8 \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel8.2 \
  --boot hd \
  --disk /dev/vg0/vm.almalinux-8 \
  --network network=default \
  --graphics none \
  --serial pty \
  --console pty \
  --location /iso/AlmaLinux-8.3-x86_64-boot.iso,kernel=isolinux/vmlinuz,initrd=isolinux/initrd.img \
  --initrd-inject ks.cfg \
  --extra-args "inst.ks=file:/ks.cfg inst.stage2=cdrom: console=ttyS0 net.ifnames=0 biosdevname=0" \
  --noreboot

ゲストを起動してコンソールに接続します。

virsh start almalinux-8
virsh console almalinux-8

root でログインして /etc/*-release を見てみます。

ll /etc/*-release
#=> -rw-r--r--. 1 root root 37 Mar 25 02:36 /etc/almalinux-release
#=> lrwxrwxrwx. 1 root root 17 Mar 25 02:36 /etc/centos-release -> almalinux-release
#=> lrwxrwxrwx. 1 root root 21 Mar 25 02:36 /etc/os-release -> ../usr/lib/os-release
#=> lrwxrwxrwx. 1 root root 17 Mar 25 02:36 /etc/redhat-release -> almalinux-release
#=> lrwxrwxrwx. 1 root root 17 Mar 25 02:36 /etc/system-release -> almalinux-release

cat /etc/almalinux-release
#=> AlmaLinux release 8.3 (Purple Manul)

AlmaLinux 8.3 がインストールできました。

CentOS からインプレースでマイグレーション

AlmaLinux のサイトに CentOS からインプレースでマイグレーションする方法が載っていたので試してみます。

とりあえずマイグレーション元の CentOS を作ります。

virt-builder centos-8.2 \
  --output /var/lib/libvirt/images/almalinux-from-centos.img \
  --arch x86_64 \
  --hostname almalinux-from-centos \
  --root-password password:password \
  --timezone Asia/Tokyo \
  --selinux-relabel

virt-install \
  --name almalinux-from-centos \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant centos8 \
  --boot hd \
  --disk path=/var/lib/libvirt/images/almalinux-from-centos.img \
  --network network=default \
  --graphics none \
  --serial pty \
  --console pty \
  --import

今の時点の virt-builder だと CentOS 8.2 までしか入れられなかったので root でログインして dnf update します。

dnf update -y
cat /etc/centos-release
#=> CentOS Linux release 8.3.2011

reboot

再起動後、再びログインして下記の手順の通りスクリプトをダウンロードして実行します。

curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh
sudo bash almalinux-deploy.sh

次のようなメッセージがダラーっと流れてきます(端折っているところは dnf の出力)

Check root privileges                                                 OK
Check Secure Boot disabled                                            OK
Check centos-8.x86_64 is supported                                    OK
Download RPM-GPG-KEY-AlmaLinux                                        OK
Import RPM-GPG-KEY-AlmaLinux to RPM DB                                OK
Download almalinux-release package                                    OK
Verify almalinux-release package                                      OK
Remove centos-linux-release package                                   OK
Remove centos-gpg-keys package                                        OK
Remove centos-linux-repos package                                     OK
...snip...
Install almalinux-release package                                     OK
...snip...
Run dnf distro-sync -y                                                OK

うーん? almalinux-deploy.sh を見た感じ、distro-sync の後で grub2-mkconfig を実行して Migration to AlmaLinux is completed と表示して終わるはずなんですけど、なぜかここで終了しています。

sudo bash -x almalinux-deploy.sh で実行してみたところ、どうやら下記でコケていたようです。

restore_issue() {
    for file in /etc/issue /etc/issue.net; do
        [ -f "${file}.bak" ] && mv ${file}.bak ${file}
    done
}

issue も登録されていました(issue の issue ですね)。

この書き方だと [ -f "${file}.bak" ] && mv ${file}.bak ${file} が関数の最後の実行になるので /etc/issue.net.bak が存在しなければ関数の終了コードが非0になります。そしてスクリプトの先頭で set -euo pipefail と書かれているのでスクリプトは終了します。

distro-sync の前に対になる backup_issue が実行されていますが・・

backup_issue() {
    for file in $(rpm -Vf /etc/issue | cut -d' ' -f4); do
        if [[ ${file} =~ "/etc/issue" ]]; then
            cp "${file}" "${file}.bak"
        fi
    done
}

要するに /etc/issue を含むパッケージ(centos-release)に含まれるファイルのうち /etc/issue というパターンを含むファイルがもし変更されていれば distro-sync の前後で退避→復元する、という処理のようなのですが、そもそも /etc/issue/etc/issue.net が変更されていなければ /etc/issue.bak などが作成されることもないのでコケそうです。

あらかじめ /etc/issue/etc/issue.net を適当な内容に変更しておけば OK? です。

echo . >> /etc/issue
echo . >> /etc/issue.net
sudo bash -v almalinux-deploy.sh

または、この後の処理は grub2-mkconfig だけなので、これだけ手動でやっておけば大丈夫だと思います。

grub2-mkconfig -o /boot/grub2/grub.cfg
#=> Generating grub configuration file ...
#=> done

cat /etc/redhat-release
#=> AlmaLinux release 8.3 (Purple Manul)

sudo grubby --info DEFAULT | grep AlmaLinux
#=> title="AlmaLinux (4.18.0-240.22.1.el8_3.x86_64) 8.3 (Purple Manul)"