2023年12月30日土曜日

Kickstartを使ってRHEL 8やRHEL 9を自動インストールする

自宅で検証をする際に、Red Hat Enterprise Linux (RHEL) やCentOS、最近ではRocky LinuxやAlmaLinuxなど、RHEL系のディストリビューションを利用することが多く、頻繁にインストール作業を手作業で行っていた。

慣れてしまえばそこまで時間を要するものではないので、GUIを使ってせっせとインストール作業をしていたが、もっと効率よくインストールできるよう、Kickstart (キックスタート) を使ってインストールの自動化をすることにした。

環境

Kickstartの検証はESXi上に構築したRHEL 8及びRHEL9で実施した。検証完了後に同じKickstartファイルを使って、他ディストリビューションでの動作確認もしており、Rocky Linux、AlmaLinuxでもKickstartによる自動インストールが動作することを確認している。

以下に確認したディストリビューションの一覧を記載する。

  • RHEL 8.3
  • Rocky Linux 8.3
  • AlmaLinux 8.3
  • RHEL 9.2

手順

1. Kickstartファイル (ks.cfg) を作成

Kickstartは、インストール情報を定義したKickstartファイルと呼ばれるファイルを読み込ませることで自動インストールを実現する。このファイルは通常ks.cfgというファイル名で作成をするのが一般的となるが、ファイル名は任意で設定して問題ない。

Kickstartファイルは、インストール時に各種設定を定義するためのコマンドやオプションが用意されている。詳細は公式マニュアルを参照いただきたいが、最低限必要となるコマンドについては、以下表にて説明する。

なお、RHEL 8とRHEL 9で細かいところで設定方法が異なる個所があるため注意すること。

設定項目 設定コマンド 説明
インストールモード text インストールをGUIベース (graphical) にするか、CLIベース (text) にするかの設定。
利用規約 (EULA) への同意 eula --agreed 利用規約への同意を自動で行う設定。
リポジトリ repo インストールに使用するリポジトリのパスを指定。インストールイメージに応じて変更が必要。
パッケージ %packages%end 必要なパッケージを指定。最小インストールの場合は、@^minimal-environmentを指定。
インストール後のスクリプト実行 %post%end インストール後の処理として実行するコマンドを記載する。インストール中の文字化けを防止するため、このタイミングで言語設定をja_JP.UTF-8へ変更をしている。
キーボードレイアウト keyboard キーボードレイアウトを指定。
言語設定 lang システムの言語設定。ここでja_JP.UTF-8を選ぶと、インストールは進むものの画面表示が文字化けした状態となるため、あえてen_US.UTF-8を選択している。
ネットワーク network ホスト名やIPアドレスなどの設定。本設定を省略すると、DHCPによる設定が反映される。
インストールタイプ cdrom ISOイメージからのインストールを設定。
初期セットアップ firstboot 初期セットアップの処理を実行するかどうか。初期インストールであれば、有効にしておけば問題ない。
無視するディスク ignoredisk --drivesオプションにてインストールに関係ないディスクを無視するよう設定する。逆に特定のディスクのみを指定する場合は、--only-useを使用する。仮想環境の場合は、sdaのみ指定しておけば問題ない。
自動パーティション autopart 自動的にパーティションを設定する際に指定。
パーティション初期化 clearpart パーティションの初期化動作を指定。--initlabelオプションにて、対象ディスク (ignorediskで指定したディスク) をすべてフォーマットする。--noneはもしパーティションが存在する場合は削除しないためのオプション。
タイムゾーン timezone タイムゾーンを設定する。日本にする場合はAsia/Tokyoを選択する。RHEL 8の場合はここでNTPサーバを指定できる。その場合は、--ntpserversにて指定する。また、ハードウェアクロックをUTCの時刻とみなす際のオプションがRHEL 8は--isUtc、RHEL 9は--utcと異なるため注意する。
タイムソース timesource RHEL 9の場合は本設定項目にてタイムソースとするNTPサーバを指定する。--ntp-serverを用いて指定する。
rootパスワード rootpw 平文 (--plaintext) またはハッシュ化 (--iscrypted) した文字列でパスワードを指定できる。ハッシュ化したパスワードは、インストール済みの環境の/etc/shadowから抽出すると楽。
RHEL 9以降はデフォルトでrootログインが禁止されるため、もしrootログインを許可したい場合は、--allow-sshオプション(RHEL 9.1以降で使用可能)を付与する(RHEL 8の場合は特に指定しなくてもデフォルトでrootにてログイン可能)。
SELinux selinux SELinuxの有効化、無効化を設定。
ファイアウォール firewall firewalldの有効化、無効化を設定。
インストール後の動作 reboot インストール後に自動で再起動かける場合に指定。同時にDVDを取り出したい場合は、--ejectを付与する。
kdump %addon com_redhat_kdump%end kdumpの設定。
パスワードポリシー %anaconda%end パスワードの最小文字列などのパスワードポリシーの設定。RHEL 9からは本設定項目は非推奨となっている。

以下に私が実際に使用しているKickstartファイルを例として記載する。OSインストールイメージがDVD版の場合とMinimal版の場合で変更を加える箇所があり、具体的には以下2点となる。

  • レポジトリのパス
  • open-vm-toolsのインストール方式 (Minimalのイメージにはopen-vm-toolsが含まれないため、dnfを使ってインストールする必要がある)

▼【RHEL 8】OSインストールイメージがDVDの場合

#version=RHEL8
# Use text install
text

# Agree EULA
eula --agreed

# Package
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream

%packages
@^minimal-environment
@guest-agents
kexec-tools

%end

# Run post script
%post --logfile=/root/ks-post.log
echo 'LANG="ja_JP.UTF-8"' > /etc/locale.conf ; cat /etc/locale.conf

%end

# Keyboard layouts
keyboard --xlayouts='jp'

# System language
lang en_US.UTF-8 --addsupport=ja_JP.UTF-8

# Network information
network  --bootproto=static --device=ens192 --gateway=192.168.11.31 --ip=192.168.11.192 --nameserver=192.168.11.61,192.168.11.62 --netmask=255.255.255.0 --noipv6 --activate
network  --hostname=localhost.localdomain

# Use CDROM installation media
cdrom

# Run the Setup Agent on first boot
firstboot --enable

ignoredisk --only-use=sda
autopart
# Partition clearing information
clearpart --none --initlabel

# System timezone
timezone Asia/Tokyo --isUtc --ntpservers=192.168.33.23

# Root password
rootpw --plaintext XXXXXXXX
#rootpw --iscrypted XXXX~(省略)~XXXX

# Disable SELinux
selinux --disabled

# Disable firewalld
firewall --disabled

# Reboot after installation
reboot

%addon com_redhat_kdump --enable --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

▼【RHEL 8】OSインストールイメージがMinimalの場合

#version=RHEL8
# Use text install
text

# Agree EULA
eula --agreed

# Package
repo --name="Minimal" --baseurl=file:///run/install/sources/mount-0000-cdrom/Minimal

%packages
@^minimal-environment
kexec-tools

%end

# Run post script
%post --logfile=/root/ks-post.log
echo 'LANG="ja_JP.UTF-8"' > /etc/locale.conf ; cat /etc/locale.conf

export http_proxy=http://192.168.33.23:8080
export https_proxy=http://192.168.33.23:8080
dnf install open-vm-tools -y

%end

# Keyboard layouts
keyboard --xlayouts='jp'

# System language
lang en_US.UTF-8 --addsupport=ja_JP.UTF-8

# Network information
network  --bootproto=static --device=ens192 --gateway=192.168.11.31 --ip=192.168.11.192 --nameserver=192.168.11.61,192.168.11.62 --netmask=255.255.255.0 --noipv6 --activate
network  --hostname=localhost.localdomain

# Use CDROM installation media
cdrom

# Run the Setup Agent on first boot
firstboot --enable

ignoredisk --only-use=sda
autopart
# Partition clearing information
clearpart --none --initlabel

# System timezone
timezone Asia/Tokyo --isUtc --ntpservers=192.168.33.23

# Root password
rootpw --plaintext XXXXXXXX
#rootpw --iscrypted XXXX~(省略)~XXXX

# Disable SELinux
selinux --disabled

# Disable firewalld
firewall --disabled

# Reboot after installation
reboot

%addon com_redhat_kdump --enable --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

▼【RHEL 9】OSインストールイメージがDVDの場合

#version=RHEL9
# Use text install
text

# Agree EULA
eula --agreed

# Package
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream

%packages
@^minimal-environment
@guest-agents

%end

# Run post script
%post --logfile=/root/ks-post.log
echo 'LANG="ja_JP.UTF-8"' > /etc/locale.conf ; cat /etc/locale.conf

%end

# Keyboard layouts
keyboard --xlayouts='jp'

# System language
#lang ja_JP.UTF-8
lang en_US.UTF-8 --addsupport=ja_JP.UTF-8

# Network information
#network --bootproto=static --device=ens192 --gateway=192.168.11.31 --ip=192.168.11.192 --nameserver=192.168.11.61,192.168.11.62 --netmask=255.255.255.0 --noipv6 --activate
network --hostname=localhost.localdomain

# Use CDROM installation media
cdrom

# Run the Setup Agent on first boot
firstboot --enable

ignoredisk --only-use=sda
autopart
# Partition clearing information
clearpart --none --initlabel

# System timezone
timezone Asia/Tokyo --utc
timesource --ntp-server 192.168.33.23

# Root password
#rootpw --plaintext --allow-ssh XXXXXXXX
rootpw --iscrypted --allow-ssh XXXX~(省略)~XXXX

# Disable SELinux
selinux --disabled

# Disable firewalld
firewall --disabled

# Reboot after installation
reboot

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

%end

2. NFSサーバにKickstartファイルを配置

作成したKickstartファイルは、OSインストール時に読み込ませる必要がある。いくつか方式はあるが、今回はNFSサーバにKickstartファイルを配置して、ネットワーク経由で読み込みさせることにする。

NFSサーバの構築は本題とは関係がないため割愛するが、今回はQNAP NASをNFSサーバとして使用することにした。配置パスは以下となる。

nfs:192.168.11.13:/Public2/ks/ks.cfg

3. OSインストールメディアで起動

通常通りOSインストールメディアにて起動し、最初の画面にて「Install Red Hat Enterprise Linux 8.3」を選択したのち、「e」を押し、インストールパラメータを指定する画面に遷移する。

4. インストールパラメータでkickstartファイルを指定

インストールパラメータでは、以下の通り、init.ksのパラメータを追記する。追記箇所を間違えないよう注意。

linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-8-3-0-BaseOS-x86_64 quiet inst.ks=nfs:192.168.11.13:/Public2/ks/ks_rhel8.cfg

パラメータ追記後、「Ctrl + x」を押してインストールを開始する。

5. 自動インストール開始

Kickstartによる自動インストールが成功した場合は、以下画面のように「Starting automated install」といった表示がされ、自動的にインストールが進む。

なお、Kickstartファイルにてlang ja_JP.UTF-8を設定した場合、インストールは実行されるが、文字化けするので注意。文字化けを回避するため、前述したKickstartファイルでは、%postの処理で言語設定を変更するようにしている。

インストール完了後、自動で再起動がされ、ログインプロンプトが表示されればインストール完了となる。

6. インストール後の確認

インストール完了後、SSHでログインし以下であることを確認した。Kickstartにより問題なく初期設定がされていることが確認できた。

  • 言語設定がja_JP.UTF-8であること
  • タイムゾーンがAsia/Tokyoであること
  • Chronyにて指定したNTPサーバと同期していること
  • open-vm-toolsがインストールされ起動していること
  • SELinuxが無効化されていること
  • firewalldのサービスが停止していること
# localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp
      X11 Layout: jp

# timedatectl
               Local time: 土 2021-05-08 17:46:57 JST
           Universal time: 土 2021-05-08 08:46:57 UTC
                 RTC time: 土 2021-05-08 08:46:57
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

# chronyc -n sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.33.23                 2   6   377    54   +208us[ +253us] +/- 2101us

# systemctl status vmtoolsd
● vmtoolsd.service - Service for virtual machines hosted on VMware
   Loaded: loaded (/usr/lib/systemd/system/vmtoolsd.service; enabled; vendor pr>
   Active: active (running) since Sat 2021-05-08 16:17:38 JST; 1h 29min ago
     Docs: http://github.com/vmware/open-vm-tools
 Main PID: 988 (vmtoolsd)
    Tasks: 3 (limit: 10900)
   Memory: 6.5M
   CGroup: /system.slice/vmtoolsd.service
           mq988 /usr/bin/vmtoolsd

 5月 08 16:17:38 localhost.localdomain systemd[1]: Started Service for virtual >

# getenforce
Disabled

# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor >
   Active: inactive (dead)
     Docs: man:firewalld(1)

参考

更新履歴

  • 2021/5/8 新規作成
  • 2023/12/30 RHEL 9の情報を追記

0 件のコメント:

コメントを投稿

人気の投稿