自宅で検証をする際に、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 件のコメント:
コメントを投稿