CentOS 8 を CentOS Stream 8 に切り替えてみた

CentOS 8 が2021年末に終了し、それ以降も使うなら CentOS Stream に切り替える必要があるとのことなので、適当なサーバを CentOS 8 から CentOS Stream に切り替えてみました。

まずは元の CentOS 8 を最新に更新しておきます。セットアップ後にしばらく放置していたのと、丁度 8.2 から 8.3 へのアップデートも入っていたので、結構な量の更新がありました。

cat /etc/centos-release
#=> CentOS Linux release 8.2.2004 (Core)

dnf check-update
dnf update -y
#=> :
#=> Install   15 Packages
#=> Upgrade  223 Packages
#=> :

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

reboot

次に、このへんに書かれている手順の通りに作業します。

dnf install centos-release-stream
dnf swap centos-{linux,stream}-repos
dnf distro-sync
#=> :
#=> Install    12 Packages
#=> Upgrade    88 Packages
#=> Downgrade   3 Packages
#=> :

更新されるパッケージの数は 8.2 から 8.3 の数よりも少ないようですが・・Downgrade が 3 つあるのが気になる・・以下のパッケージでした。

kernel-tools       4.18.0-240.el8
kernel-tools-libs  4.18.0-240.el8
python3-perf       4.18.0-240.el8

dnf distro-sync する前は次の通りだったので確かにダウングレードのようですけど、

kernel-tools       4.18.0-240.1.1.el8_3
kernel-tools-libs  4.18.0-240.1.1.el8_3
python3-perf       4.18.0-240.1.1.el8_3

よく見ると Install で以下のカーネルが入っていました。

kernel          4.18.0-240.el8
kernel-core     4.18.0-240.el8
kernel-modules  4.18.0-240.el8

これも dnf distro-sync の前は 4.18.0.240.1.1.el8_3 だったので実質ダウングレード?

CentOS 8.3 のと CentOS Stream 8 のとでカーネルのバージョン自体は同じですけど・・うーん、どういうことなの。

何が違うのかを調べてみます。

wget https://vault.centos.org/8.3.2011/BaseOS/Source/SPackages/kernel-4.18.0-240.el8.src.rpm
wget https://vault.centos.org/8.3.2011/BaseOS/Source/SPackages/kernel-4.18.0-240.1.1.el8_3.src.rpm

rpm -ivh kernel-4.18.0-240.el8.src.rpm
mv rpmbuild kernel-4.18.0-240.el8

rpm -ivh kernel-4.18.0-240.1.1.el8_3.src.rpm
mv rpmbuild kernel-4.18.0-240.1.1.el8_3

diff -ru kernel-4.18.0-240.el8 kernel-4.18.0-240.1.1.el8_3

下記のパッチの有無の差があるようです。

  • debrand-rh-i686-cpu.patch
  • debrand-rh_taint.patch
  • debrand-single-cpu.patch

パッチの内容を見てみると・・RHEL や Red Hat という文言を CentOS Linux に書き換えてるだけのパッチでした。例えば debrand-rh-i686-cpu.patch は次のような内容でした。

--- a/arch/x86/boot/main.c      2019-03-13 04:04:53.000000000 -0700
+++ b/arch/x86/boot/main.c      2019-05-25 14:31:21.043272496 -0700
@@ -147,7 +147,7 @@ void main(void)

        /* Make sure we have all the proper CPU support */
        if (validate_cpu()) {
-               puts("This processor is not supported in this version of RHEL.\n");
+               puts("This processor is not supported in this version of CentOS Linux.\n");
                die();
        }

CentOS では RHEL 用に作られた kernel のソースから Red Hat の痕跡を消す必要があるのに対して、CentOS Stream ではその必要はない、ということでしょうかね。

CentOS 8 を virt-builder や cloud.centos.org のイメージを使って KVM に手っ取り早く入れる

CentOS 8 を virt-install でサクッと入れる - ngyukiの日記 のような Kickstart を使う方法はカスタマイズが柔軟ですが、その代わりやたら時間がかかります。

あり物のイメージを使って構築する方が手っ取り早いので、以下の2つのイメージで構築してその手順とかを比べてみました。

virt-builder (builder.libguestfs.org)

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

virt-install \
  --name centos-8.2-builder \
  --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/centos-8.2-builder.img \
  --network network=default \
  --graphics none \
  --serial pty \
  --console pty \
  --import
parted -l
# Model: Virtio Block Device (virtblk)
# Disk /dev/vda: 6442MB
# Sector size (logical/physical): 512B/512B
# Partition Table: gpt
# Disk Flags: pmbr_boot
#
# Number  Start   End     Size    File system     Name  Flags
#  1      1049kB  2097kB  1049kB                        bios_grub
#  2      2097kB  1076MB  1074MB  ext4
#  3      1076MB  1721MB  645MB   linux-swap(v1)        swap
#  4      1721MB  6441MB  4721MB  xfs

df -h
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/vda4       4.4G  1.3G  3.2G  29% /
# /dev/vda2       976M  134M  776M  15% /boot

getenforce
# Enforcing

cat /proc/cmdline | tr ' ' '\n'
# BOOT_IMAGE=(hd0,gpt2)/vmlinuz-4.18.0-193.6.3.el8_2.x86_64
# root=UUID=5e65e2b1-bd66-4404-9403-b2a5825a2c14
# ro
# console=tty0
# rd_NO_PLYMOUTH
# crashkernel=auto
# resume=UUID=abefcabc-5e1d-41cb-92f6-cc0230dad69d
# console=ttyS0,115200

cloud.centos.org

cd /var/lib/libvirt/images/
curl https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-GenericCloud-8.2.2004-20200611.2.x86_64.qcow2 -O

virt-install \
  --name centos-8.2-generic \
  --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/CentOS-8-GenericCloud-8.2.2004-20200611.2.x86_64.qcow2 \
  --network network=default \
  --graphics none \
  --serial pty \
  --console pty \
  --import \
  --noreboot

virt-customize -d centos-8.2-generic \
  --hostname centos-8-2-generic \
  --root-password password:password \
  --timezone Asia/Tokyo \
  --selinux-relabel

virsh start centos-8.2-generic
virsh console centos-8.2-generic

parted -l
# Model: Virtio Block Device (virtblk)
# Disk /dev/vda: 10.7GB
# Sector size (logical/physical): 512B/512B
# Partition Table: msdos
# Disk Flags:
#
# Number  Start   End     Size    Type     File system  Flags
#  1      1049kB  8390MB  8389MB  primary  xfs          boot

df -h
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/vda1       7.9G  1.3G  6.6G  16% /

getenforce
# Enforcing

cat /proc/cmdline | tr ' ' '\n'
# BOOT_IMAGE=(hd0,msdos1)/boot/vmlinuz-4.18.0-193.6.3.el8_2.x86_64
# root=UUID=7295907d-61c6-49b5-8687-5a6ae8855f6b
# ro
# console=ttyS0,115200n8
# no_timer_check
# net.ifnames=0
# crashkernel=auto

さいごに

cloud.centos.org なら cloud-init が有効なので meta-data と user-data の ISO を用意できるのならカスタマイズは柔軟です。ただ KVM なら virt-builder や virt-customize でカスタマイズするほうが手っ取り早いので cloud-init は別になくても良いかもしれません。

cloud.centos.org のイメージのほうがパーティション 1 つだけで男前ですが、サイズが 10GB もあって大きすぎ感あります。小さいものを大きくするのは簡単でもその逆は難しいので、イメージのサイズはもっと小さく作成されているほうが嬉しいです。

virt-builder の方はパーティションがいくつか分かれています。ベアメタルサーバならともかく仮想サーバならスワップ用にパーティションを切らなくてもスワップ用のボリュームをアタッチすれば良いと思うし、LVM するわけでもないので /boot 分けなくても良いと思うし、ルートボリュームがそんなでかいサイズになることはまず無いので GPT じゃなくせば bios_grub も必要ないと思うし(でかいディスクがほしければ別途でかいデータボリュームをアタッチする)、個人的には 1 パーティションだけになっている方が好みです。

オフィシャルのネームバリューもあるので当面は cloud.centos.org のイメージを使っておこうと思います。

CentOS 8 を virt-install でサクッと入れる

こんな感じに centos8.ks.cfg を作成して、

#version=RHEL8

cmdline
url --url=http://ftp.riken.jp/Linux/centos/8.1.1911/BaseOS/x86_64/os/

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

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

CentOS-8.1.1911-x86_64-boot.iso を適当なディレクトリにダウンロードした後、次のようにサクッと作成できます。

# ダウンロード
wget http://ftp.riken.jp/Linux/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-boot.iso -O /iso/CentOS-8.1.1911-x86_64-boot.iso

# 論理ボリューム作成
lvcreate vg99 -L 8G -n vm.centos8

# セットアップ
virt-install \
  --name centos8 \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel8.1 \
  --boot hd \
  --disk path=/dev/vg99/vm.centos8,bus=virtio \
  --network network=default,model=virtio \
  --graphics none \
  --serial pty \
  --console pty \
  --location /iso/CentOS-8.1.1911-x86_64-boot.iso \
  --initrd-inject /tmp/centos8.ks.cfg \
  --extra-args "inst.ks=file:/centos8.ks.cfg inst.stage2=cdrom: console=ttyS0 net.ifnames=0 biosdevname=0" \
  --noreboot

# 起動してコンソールに接続
virsh start centos8
virsh console centos8

RPM パッケージが含まれない CentOS-8.1.1911-x86_64-boot.iso を使っているので、パッケージのダウンロードのためにやや時間かかります。

CentOS-8.1.1911-x86_64-dvd1.iso を使う場合は ks.cfgurl の行を cdrom とかに変更すればたぶん大丈夫です。

ダメだった

CentOS 7.7 の virt-install だと↑でサクッと入れられたのですが、CentOS 8.1 の virt-install だとダメでした。

ERROR    Error validating install location: Could not find an installable distribution at '/iso/CentOS-8.1.1911-x86_64-boot.iso'

The location must be the root directory of an install tree.
See virt-install man page for various distro examples.

virt-install --debug とかで見てみたところ、CentOS-8.1.1911-x86_64-boot.iso のメディアに .treeinfo が無いことが原因のようです。

--location ではなく --cdrom ならこのエラーは出ませんが、それだと --initrd-inject--extra-args が効かないのでキックスタートさせるのが面倒になります。

試していませんが CentOS-8.1.1911-x86_64-dvd1.iso なら .treeinfo が含まれているので大丈夫です。

解決方法

.treeinfo から initrd.imgvmlinuz の位置を読んでいるだけなので、--location でそれらの位置も一緒に指定すれば OK です。

virt-install \
  --name centos8 \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel8.1 \
  --boot hd \
  --disk path=/dev/vg99/vm.centos8,bus=virtio \
  --network network=default,model=virtio \
  --graphics none \
  --serial pty \
  --console pty \
  --location /iso/CentOS-8.1.1911-x86_64-boot.iso,kernel=isolinux/vmlinuz,initrd=isolinux/initrd.img \
  --initrd-inject /tmp/centos8.ks.cfg \
  --extra-args "inst.ks=file:/centos8.ks.cfg inst.stage2=cdrom: console=ttyS0 net.ifnames=0 biosdevname=0" \
  --noreboot

別の解決方法

man virt-install したら↑の --locationkernelinitrd を指定する方法が書いていたのでこれでええやんと思ったんですが、それに気づく前に試行錯誤したメモ。

CentOS-8.1.1911-x86_64-boot.iso.treeinfo を追加したメディアを作れば大丈夫です。

mount /iso/CentOS-8.1.1911-x86_64-boot.iso /mnt -o loop
rsync -av /mnt/ /tmp/CentOS-8.1.1911-x86_64-boot/
curl http://ftp.riken.jp/Linux/centos/8.1.1911/BaseOS/x86_64/os/.treeinfo > /tmp/CentOS-8.1.1911-x86_64-boot/.treeinfo
mkisofs \
  -o /iso/CentOS-8.1.1911-x86_64-boot-x.iso \
  -b isolinux/isolinux.bin \
  -c isolinux/boot.cat \
  -no-emul-boot \
  -boot-load-size 4 \
  -boot-info-table \
  -r -J -v \
  /tmp/CentOS-8.1.1911-x86_64-boot/

rm -fr /tmp/CentOS-8.1.1911-x86_64-boot/
umount /mnt

virt-install \
  --name centos8 \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel8.1 \
  --boot hd \
  --disk path=/dev/vg99/vm.centos8,bus=virtio \
  --network network=default,model=virtio \
  --graphics none \
  --serial pty \
  --console pty \
  --location /iso/CentOS-8.1.1911-x86_64-boot-x.iso \
  --initrd-inject /tmp/centos8.ks.cfg \
  --extra-args "inst.ks=file:/centos8.ks.cfg inst.stage2=cdrom: console=ttyS0 net.ifnames=0 biosdevname=0" \
  --noreboot

あるいは ISO は使わずに --location も URL を指定すれば大丈夫です。ただこの方法だと images/install.img のようなでかいファイル(509M)までダウンロードされるのでめちゃくちゃ時間かかります。

virt-install \
  --name centos8 \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel8.1 \
  --boot hd \
  --disk path=/dev/vg99/vm.centos8,bus=virtio \
  --network network=default,model=virtio \
  --graphics none \
  --serial pty \
  --console pty \
  --location http://ftp.riken.jp/Linux/centos/8.1.1911/BaseOS/x86_64/os/ \
  --initrd-inject /tmp/centos8.ks.cfg \
  --extra-args "inst.ks=file:/centos8.ks.cfg console=ttyS0 net.ifnames=0 biosdevname=0" \
  --noreboot

virt-builder でサクッと作ったゲストが好みじゃなかった件

だいぶ前に Qiita で virt-builder でゲストを作って virt-resize でリサイズして virt-customize でカスタマイズ という記事を書いていて。

virt-builder ふむふむ便利そう、だがしかしなんか気に入らないので普通にゲスト作るときはやっぱ Kickstart だわ

と思ったはずなのだけど、なにが気に入らなかったのか忘れてしまったのでそのメモ。

virt-builder でサクッとゲストを作る

virt-builder という libvirt 管理下の KVM などの仮想環境にサクッとゲストを作るコマンドがあります。libguestfs-tools-c パッケージに含まれているのでインストールします。

yum -y install libguestfs-tools-c

まずはゲスト用のボリュームを作成します。

lvcreate vg1 -n vm.ore-no-virt -L 6G

ゲストのイメージの中身を弄るためのスクリプトを作ります。

cat <<'__RUN__'> run.sh
set -eux

# selinux
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

# ngyuki
useradd ngyuki -m -g wheel

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

# sudoers wheel
tee /etc/sudoers.d/wheel <<EOS
%wheel ALL=(ALL) NOPASSWD: ALL
Defaults:%wheel env_keep += SSH_AUTH_SOCK
Defaults:%wheel !requiretty
Defaults:%root  !requiretty
EOS

# sudoers chmod
chmod 0440 /etc/sudoers.d/wheel

# ipv6
tee /etc/sysctl.d/ipv6-disable.conf <<EOS
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOS

# sshd
sed -i '/UseDNS /c UseDNS no' /etc/ssh/sshd_config
sed -i '/PermitRootLogin /c PermitRootLogin yes' /etc/ssh/sshd_config
sed -i '/AddressFamily /c AddressFamily inet' /etc/ssh/sshd_config

# postfix
postconf -e inet_protocols=ipv4
__RUN__

virt-builder でゲストのイメージを作ります。1回目はイメージのテンプレートがダウンロードされるので結構時間がかかります。2回目以降はキャッシュされているので早いです。

virt-builder centos-7.4 \
  --output /dev/vg1/vm.ore-no-virt \
  --arch x86_64 \
  --hostname ore-no-virt \
  --root-password disable \
  --timezone Asia/Tokyo \
  --run run.sh \
  --firstboot-command '
      nmcli con modify eth0 \
        connection.autoconnect yes \
        ipv4.method manual \
        ipv4.addresses 10.12.16.99/23 \
        ipv4.gateway 10.12.16.1 \
        ipv4.dns 10.12.16.2 \
        ipv6.method ignore
      nmcli con up eth0
    '

イメージを元に libvirt にインポートします。

virt-install \
  --name ore-no-virt \
  --hvm \
  --virt-type kvm \
  --ram 1024 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel7 \
  --boot hd \
  --disk path=/dev/vg1/vm.ore-no-virt \
  --network network=back \
  --graphics none \
  --serial pty \
  --console pty \
  --import \
  --noreboot

ゲストを開始して SSH でログインできます。

virsh start ore-no-virt
ssh ngyuki@10.12.16.99

気に入らなかった理由

イメージのテンプレートのパーティション構成がなんか好きではなかったので使ってなかったんでした。

sudo parted -l /dev/vda
#=> Model: Virtio Block Device (virtblk)
#=> Disk /dev/vda: 6442MB
#=> Sector size (logical/physical): 512B/512B
#=> Partition Table: msdos
#=> Disk Flags:
#=>
#=> Number  Start   End     Size    Type     File system     Flags
#=>  1      1049kB  1075MB  1074MB  primary  xfs             boot
#=>  2      1075MB  1720MB  645MB   primary  linux-swap(v1)
#=>  3      1720MB  6442MB  4723MB  primary  xfs

今日日仮想サーバなら /boot とか無くていいしスワップも必要なら別ディスクとしてアタッチするし、1つのディスクで複数パーティション切るぐらいなら複数のディスクをアタッチすればいいんじゃね?と思うので、仮想サーバでは基本的に1ディスク=1パーティションとしてます。

ので、この方法での環境構築はたぶんやりません。


この記事、元は 2018/03 ごろに書いてたものです。

MD や LVM 使っている CentOS 6 に Kickstart で CentOS 7 を上書き

例えば CentOS 6 で下記のようなディスク構成だった場合、

zerombr
bootloader --location=mbr --driveorder=vda,vdb
clearpart --all --initlabel

part raid.11 --ondrive=sda --asprimary --size 500
part raid.12 --ondrive=sdb --asprimary --size 500

part raid.21 --ondrive=sda --asprimary --size 1 --grow
part raid.22 --ondrive=sdb --asprimary --size 1 --grow

raid /boot --fstype=ext4 --device=md0 --level=1 raid.11 raid.12
raid pv.01 --fstype=ext4 --device=md1 --level=1 raid.21 raid.22

volgroup vg0 pv.01

logvol /     --vgname=vg0 --size=4096 --name=lv_centos6 --fstype=ext4
logvol swap  --vgname=vg0 --size=1024 --name=lv_swap
logvol /data --vgname=vg0 --size=1024 --name=lv_data --fstype=ext4

下記のように Kickstart すれば、既存のボリュームグループに CentOS 7 のルートボリュームを作成してセットアップできる。

bootloader --location=mbr --driveorder=vda,vdb
clearpart --none

# 作成済のパーティションを RAID で使う
part raid.11 --onpart=sda1
part raid.12 --onpart=sdb1

# /boot を RAID1 で作る
raid /boot --fstype=xfs --device=md0 --level=1 raid.11 raid.12

# 作成済のボリュームグループに論理ボリュームを作成
logvol /     --vgname=vg0 --size=4096 --name=lv_centos7 --fstype=xfs

# 作成済の論理ボリュームを使う
logvol swap  --vgname=vg0 --name=lv_swap --useexisting
logvol /data --vgname=vg0 --name=lv_data --useexisting --noformat

ただしこれだと /boot は上書きされるので CentOS 6 のルートボリュームは残っているものの CentOS 6 を起動することはできない。


1年ちょいぐらい前にこのようなことを行ったメモを発掘したのだけど、一体なんのためにこんなことしたのだろう・・/data を維持したまま CentOS 6 -> 7 にリプレースしたかったのだと思うけど。

CentOS を Kickstart の liveimg で rootfs の tgz からインストールする

最近は CentOS のインストールは Kickstart でなるべく自動化して GUI でぽちぽちしなくて良いようにしていますが、Kickstart で liveimg というものを使えばインストール自動化だけでなく、あらかじめ作成しておいた rootfs のディレクトリツリーをそのまま展開してインストールすることができることを知ったので、やってみました。

ざっくり説明すると下記のような流れでインストールします。

  • あらかじめ rootfs のディレクトリを作成して tar.gz(tgz) にまとめる
  • Kickstart の ks.cfg で liveimg で http 経由の tgz を指定する
  • 通常ならパッケージからインストールされるところが tgz をダンロードして展開するだけになる
  • ディスクの構成とかネットワークの構成とかは通常のインストールと同じように Kickstart で構成される

rootfs の tgz を作成

適当な CentOS 7 のサーバで tgz を下記のように作成します。

# chroot するディレクトリを作成
mkdir -p rootfs/

# yum リポジトリの設定ファイルをコピー
rsync /etc/yum.repos.d/CentOS* rootfs/ -Rav

# resolv.conf をコピー
cp /etc/resolv.conf rootfs/etc/resolv.conf

# 主要なパッケージをインストール
yum -y --installroot="$PWD/rootfs/" --releasever=7 install @core kernel grub2 authconfig mdadm lvm2

# chroot で中に入っていろいろ弄る
chroot rootfs/

# sudoers wheel
tee /etc/sudoers.d/wheel <<'EOS'
%wheel ALL=(ALL) NOPASSWD: ALL
Defaults:%wheel env_keep += SSH_AUTH_SOCK
Defaults:%wheel !requiretty
Defaults:%root  !requiretty
EOS
chmod 0440 /etc/sudoers.d/wheel

# ipv6 disable
tee /etc/sysctl.d/ipv6-disable.conf <<'EOS'
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOS

# sshd_config
sed -i '/UseDNS /c UseDNS no' /etc/ssh/sshd_config
sed -i '/PermitRootLogin /c PermitRootLogin without-password' /etc/ssh/sshd_config
sed -i '/AddressFamily /c AddressFamily inet' /etc/ssh/sshd_config

# postfix
postconf -e inet_protocols=ipv4

# authorized_keys
mkdir -p /root/.ssh/pub
curl -fsSL https://github.com/ngyuki.keys | awk 1 > /root/.ssh/pub/ngyuki
cat /root/.ssh/pub/* > /root/.ssh/authorized_keys
chown -R root: /root/.ssh
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys

# chroot から抜ける
exit

# tgz にまとめて HTTP で見れる場所に置く
tar czvf /var/www/html/rootfs.tgz --directory rootfs/ .

Kickstart

次のように Kickstart ファイルを作ります。

ks.cfg

#version=RHEL7

install
liveimg --url=http://example.com/rootfs.tgz
text
cmdline
skipx

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

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

zerombr
clearpart --all
bootloader --location=mbr

part raid.11 --ondrive=sda --asprimary --size=500
part raid.12 --ondrive=sdb --asprimary --size=500

part raid.21 --ondrive=sda --asprimary --grow
part raid.22 --ondrive=sdb --asprimary --grow

part swap --ondrive=sda --asprimary --size=1024
part swap --ondrive=sdb --asprimary --size=1024

raid /boot --fstype=xfs --device=md0 --level=RAID1 raid.11 raid.12
raid pv.01 --fstype=xfs --device=md1 --level=RAID1 raid.21 raid.22

volgroup vg0 pv.01 --pesize=32768

logvol / --vgname=vg0 --size=8192 --name=lv_root

rootpw --plaintext password
auth --enableshadow --passalgo=sha512
selinux --disabled
firewall --disabled
firstboot --disabled

reboot

%post --log=/root/ks-post.log
set -eux
sed -i -r '/^GRUB_CMDLINE_LINUX=/s/\s+rhgb//' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
%end

Install

CentOS 7 の minimal の CD-ROM からブートして、インストールのカーネルパラメータで下記のように Kickstart ファイルを指定します。

inst.ks=http://example.com/ks.cfg

さいごに

あらかじめいろいろ構成した一式でインストールできるため、普通に「CentOS をインストール → 追加のパッケージをインストールしたり設定したり」と比べるとかなり早いです。

物理サーバをたくさんセットアップしなければならないときの時間短縮に使えそうです。

また、いざというときにインターネットに接続できない環境で再セットアップする必要に迫られたときも、この方法ならどこか適当な Web サーバにアーカイブを配置するだけなので、普通にやるのと比べれば楽です(yum リポジトリのミラーとか作らなくても良い)。

補足

パッケージのインストールで @core kernel grub2 authconfig mdadm lvm2 とかを指定していますが、@core kernel grub2 authconfig あたりがないと Kickstart でコケます。

mdadmlvm2 はルートパーティションや /boot が MD とか LVM とかの場合に必要です。

参考

CentOS 7 で Pacemaker/Corosync 使うなら LinuxHA Japan と CentOS のどっちが良い?

  • 元は 1 年くらい前に書いたものなので古いです
  • 今は CentOS の公式レポから入れた Pacemaker/Corosync が元気に動いています

Pacemaker/Corosync を使うにあたり、LinuxHA Japan のパッケージと CentOS のパッケージのどちらが良いかのメモ。

LinuxHA Japan のパッケージは下記から入手できる。

ざっくりバージョンの比較

  • LinuxHA Japan
    • corosync-2.3.4-1
    • pacemaker-1.1.13-1
    • resource-agents-3.9.6-1
  • CentOS
    • corosync-2.3.4-7
    • pacemaker-1.1.13-10
    • resource-agents-3.9.5-54

メンテナンスのポリシー

CentOS は updates にパッケージがあったので、バージョンを維持したまま CentOS 7 のライフサイクルの終了まで保守される。

LinuxHA Japan の方は新しいバージョンに更新されている。ポリシーも良くわからない(たぶん無い?)

LinuxHA Japan 特有のパッケージ

下記は LinuxHA Japan がメンテしているものなので LinuxHA Japan のパッケージにしか含まれていない。

  • pm_crmgen
    • Excel から crm.xml を作成するツール
  • pm_diskd
    • ディスクの正常性の監視(pingd の ディスク版)
  • pm_extras
    • いくつかの追加のリソースエージェントとか
    • インタフェースの状態をアトリビュートに記録するデーモン(crm_mon で表示できる)
  • pm_ctl
    • SSH 経由でクラスタのすべての Pacemaker を開始・停止などの制御を行なうツール
    • リソースのマイグレーションもコマンド一発で出来たりするっぽい

下記は他所でメンテされているものだが LinuxHA Japan のパッケージに含まれている。

pssh は次のように使えるものでこれ単体で非常に便利だけど Pacemaker と直接の関係はない。

$ pssh -H 192.168.33.10 -H 192.168.33.11 -H 192.168.33.12 mkdir -p /tmp/hoge
[1] 08:07:14 [SUCCESS] 192.168.33.12
[2] 08:07:14 [SUCCESS] 192.168.33.10
[3] 08:07:14 [SUCCESS] 192.168.33.11

crm と pcs

crm (crmsh パッケージのコマンド) での下記は・・・

crm configure

property stonith-enabled="false"
property no-quorum-policy="ignore"

rsc_defaults migration-threshold="5"
rsc_defaults resource-stickiness="INFINITY"
rsc_defaults failure-timeout="3600s"

primitive vip1 ocf:heartbeat:IPaddr2 \
  params ip="192.168.33.21" cidr_netmask="24" nic="enp0s8" \
  op monitor interval="10" timeout="20" on-fail="restart" \
  op start interval="0" timeout="20" \
  op stop interval="0" timeout="20"

primitive vip2 ocf:heartbeat:IPaddr2 \
  params ip="192.168.33.22" cidr_netmask="24" nic="enp0s8" \
  op monitor interval="10" timeout="20" on-fail="restart" \
  op start interval="0" timeout="20" \
  op stop interval="0" timeout="20"

primitive vip3 ocf:heartbeat:IPaddr2 \
  params ip="192.168.33.23" cidr_netmask="24" nic="enp0s8" \
  op monitor interval="10" timeout="20" on-fail="restart" \
  op start interval="0" timeout="20" \
  op stop interval="0" timeout="20"

group vips vip1 vip2 vip3

verify
commit
show

quit

pcs だと下記の通り。

pcs property set stonith-enabled="false"
pcs property set no-quorum-policy="ignore"

pcs resource defaults migration-threshold="5"
pcs resource defaults resource-stickiness="INFINITY"
pcs resource defaults failure-timeout="3600s"

pcs resource create vip1 ocf:heartbeat:IPaddr2 \
  ip="192.168.33.21" cidr_netmask="24" nic="enp0s8" \
    op monitor interval="10" timeout="20" on-fail="restart" \
    op start interval="0" timeout="20" \
    op stop interval="0" timeout="20"

pcs resource create vip2 ocf:heartbeat:IPaddr2 \
  ip="192.168.33.22" cidr_netmask="24" nic="enp0s8" \
    op monitor interval="10" timeout="20" on-fail="restart" \
    op start interval="0" timeout="20" \
    op stop interval="0" timeout="20"

pcs resource create vip3 ocf:heartbeat:IPaddr2 \
  ip="192.168.33.23" cidr_netmask="24" nic="enp0s8" \
    op monitor interval="10" timeout="20" on-fail="restart" \
    op start interval="0" timeout="20" \
    op stop interval="0" timeout="20"

pcs resource group add vips vip1 vip2 vip3

pcs config
pcs status

まとめ

LinuxHA Japan の特有のパッケージに特別必要なものがないなら CentOS で良いように思う。

Pacemaker 1.0 時代に慣れていると crmsh が無いのが辛いかと思ってたけど、代替の pcs が対話型シェル風に使えないだけでほとんど同じように使えてとくに困らなさそう。