らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

CentOS8 を Kickstart で自動インストールする

CentOS7 以前と同様、CentOS8 も Kickstart によりインストールの自動化を行うことが可能です。 今回は CentOS8 における Kickstart の実行方法をメモしておきます。 尚、作業は vSphere 上の仮想マシンで行いました。

作業の流れ

Kickstart を使った展開方法には大きく以下に分けられます。

  1. カスタマイズした Kickstart ファイルをメディアに埋め込んでしまう方法 (外部 Web サーバが不要)
  2. カスタマイズした Kickstart ファイルを外部 Web サーバに用意する方法 (外部 Web サーバが必要)

「2.」の方法は別途、Web サーバが必要になってしまいますが、Kickstart の内容を書き換えたい場合等に対応しやすく、柔軟です。 今回は「2.」の方法をとります。 この場合、作業は以下の流れで進めます。

  1. Kickstart ファイルを用意する
  2. Web サーバ上に Kickstart ファイルを配置する
  3. CentOS8 のインストーラから Web サーバ上の Kickstart ファイルを指定し、起動させる

Kickstart 用ファイルの作り方

Kickstart ファイルを作成する場合、最も簡単なのは「一度、手動でインストールし、/root/anaconda-ks.cfg を利用する」ことです。 インストールが完了すると、インストール時に指定されたパラメータが /root/anaconda-ks.cfg に記録されます。 このファイルをベースに、カスタマイズして流用するのが最も手軽です。

Kickstart ファイルを作成した後、「実際にインストールを試しては → デバッグ」は非常に面倒です。 こういった場合は ksvalidator を使うことで Kickstart ファイルの文法を確認することが出来ます。 ksvalidator は以下のように実行することでインストール出来ます。

dnf -y install pykickstart

今回はバージョン 3.16.4 がインストールされました。

# dnf info pykickstart
Last metadata expiration check: 0:00:12 ago on Tue Dec 24 11:20:14 2019.
Installed Packages
Name         : pykickstart
Version      : 3.16.4
Release      : 1.el8_0
Arch         : noarch
Size         : 45 k
Source       : pykickstart-3.16.4-1.el8_0.src.rpm
Repo         : @System
From repo    : AppStream
Summary      : Python utilities for manipulating kickstart files.
URL          : https://github.com/dcantrell/pykickstart
License      : GPLv2 and MIT
Description  : Python utilities for manipulating kickstart files.  The Python 2 and 3 libraries
             : can be found in the packages python-kickstart and python3-kickstart
             : respectively.

ksvalidator は以下のように実行します。

ksvalidator ks.cfg

Kickstart ファイルのカスタマイズ例

カスタマイズした Kickstart ファイルの例は以下の通りです。 ポイントは下記です。

  1. テキストモードでインストールする (グラフィカルインストールは使わない)
  2. キーマップは JP
  3. 言語は en_US.UTF-8
  4. root ユーザのパスワードは PASSWORD
  5. user ユーザを作成、パスワードは PASSWORD
  6. SELinux は無効化する
  7. firewalld は無効化する
  8. タイムゾーンAsia/Tokyo
  9. NTP サーバは Google Time Server を指定 (216.239.35.12216.239.35.8)
  10. パーティションは下記とする
  11. 最小構成インストールに加え、以下のパッケージをインストールする
  12. 全パッケージアップデートする
  13. dnf キャッシュを削除する
  14. インストールメディアを排出してから再起動する

具体的な Kickstart ファイルの内容は以下の通りです。 ファイルが用意出来たら予め用意しておいた Web サーバにアップロードしておきます。

#version=RHEL8
ignoredisk --only-use=sda
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --none --initlabel
# Instllation mode
text
repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream
# Use CDROM installation media
cdrom
# Keyboard layouts
keyboard --vckeymap=jp --xlayouts='jp'
# System language
lang en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=ens192 --ipv6=auto --activate
network  --hostname=localhost.localdomain
# Root password
rootpw PASSWORD
# Run the Setup Agent on first boot
firstboot --enable
# Do not configure the X Window System
skipx
# SELinux
selinux --disabled
# System services
services --enabled="chronyd"
services --disabled="firewalld"
# System timezone
timezone Asia/Tokyo --isUtc --ntpservers=216.239.35.12,216.239.35.8
user --groups=wheel --name=user --password=PASSWORD --gecos="user"
# Disk partitioning information
autopart --fstype=xfs --nohome --nolvm

%packages
@^minimal-environment
bash-completion
bind-utils
git
lsof
tcpdump
tmux
tree
unzip
vim-enhanced
wget
zip
%end

%addon com_redhat_kdump --disable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

%post --log=/root/ks-post-anaconda.log
set -x
dnf -y update
dnf clean all
%end

# Reboot
reboot --eject

実際に Kickstart でインストールする

ここからは CentOS8 インストールメディアを挿入した仮想マシンを作成し、実際に Kickstart を使ってインストールを進めます。

Step.1

仮想マシンの起動オプション設定は仮想マシン設定の編集仮想マシン オプション起動オプション から確認することが出来ます。 デフォルトは EFI になっているはずです。 CentOS8 のインストーラは「BIOS で起動した場合」と「EFI で起動した場合」で起動画面が異なります。 今回は EFI で起動させるものとします。

f:id:sig9:20191224133604p:plain:w640

Step.2

仮想マシンを CentOS8 のインストールメディアから起動した場合、Step.1 で説明した起動オプション (EFI or BIOS) によって以下のように起動画面が異なります。

EFI

EFI の場合は e を押して起動オプションを指定することになります。

f:id:sig9:20191224133608p:plain:w400

BIOS

BIOS の場合は TAB を押して起動オプションを指定することになります。

f:id:sig9:20191224133611p:plain:w400

Step.3

デフォルトでは中段の Test this media & install CentOS Linux 8.0.1905 が選択されているはずです。 最上部の Install CentOS Linux 8.0.195 がハイライトされた状態で e を押し、次へ進みます。

f:id:sig9:20191224133614p:plain

Step.4

起動オプションが表示されます。

f:id:sig9:20191224133616p:plain

以下画像の赤線部分のように Kickstart 用設定ファイルが配置されている位置を指定します。 ks=~ 部分の追記が完了したら、Ctrl + x を押してインストールを開始します。 Kickstart 内でインストールが完了したら再起動するように指定してある為、しばらくすると自動的に再起動し、Kickstart で指定したパラメータでインストールされた CentOS8 が起動してくるはずです。

f:id:sig9:20191224133619p:plain

Kickstart の URL を入力する際、「日本語キーボードを使っているにも関わらず、US キーマップになっていて記号が上手く出来ない」場合は以下を参考に記号を入力してください。

  1. =」… キーボード右上、(1) の位置にある「」ボタンをそのまま押す
  2. :」… Sfhit を押しながらキーボード右側、(2) の位置にある「」ボタンを押す

f:id:sig9:20191224141837p:plain:w600

インストール後の確認

今回は 20GB のディスクを割り当てましたが、インストール後のパーティションは以下の状態になっていました。 EFI システムなので /boot/efi が作成されたことが分かります。 また、Kickstart で指定した通り、ファイルシステムxfs で作成されています。

# mount | grep sda[1-4]
/dev/sda4 on / type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sda2 on /boot type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro)
# swapon -s
Filename                                Type            Size    Used    Priority
/dev/sda3                               partition       2097148 0       -2

ディスクの割当 (≒ 使用状況) は以下のようになっていました。 こちらも Kickstart で指定した通り、/home は作成されていません。

# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        982M     0  982M   0% /dev
tmpfs           995M     0  995M   0% /dev/shm
tmpfs           995M   17M  979M   2% /run
tmpfs           995M     0  995M   0% /sys/fs/cgroup
/dev/sda4        17G  1.6G   15G  10% /
/dev/sda2      1014M  170M  845M  17% /boot
/dev/sda1       599M  6.8M  593M   2% /boot/efi
tmpfs           199M     0  199M   0% /run/user/0

参考