LoginSignup
4
2

More than 3 years have passed since last update.

CentOS8をKickstartでネットワークインストールする。

Posted at

はじめに

以前、Ubuntuの自動インストール機能を使用したネットワークインストールの記事を投稿しましたが、せっかくなのでRHEL系でよく使われるKickstartについても残しておこうと思います。

Ubuntu Server 20.04の自動インストール機能を使用したネットワークインストールは以下の記事をご参照下さい。

また、この記事は以下記事の続きとなります。
以下記事でPXEサーバを構築してから行って下さい。

Kickstartとは

RHEL系でよく使われるネットワークインストール方式です。

多分、Fedora Coreが登場したころから機能が実装されていたと思うので、15年以上は世の中で使われていると思います。

Red Hatのマニュアルでも書式や設定など細かく書かれているため、他のOSのネットワークインストールよりとっつきやすいと思います。

構成

VirtualBoxに以下構成の仮想マシンを作成しました。

PXEサーバの構築はリンクの記事を参照してください。

以下PXEサーバ側の操作はVirtualBoxCentOS8での操作となります。

メモリサイズはCentOS 8.2.2004のリリースノートによると最低限2GB必要とのことなので、2GBとします。

・自動インストール対象マシン構成

構成 種別
CPU 1 vCPU
メモリサイズ 2048 MB
ストレージ 16.00 GB
ネットワーク1 ホストオンリーアダプター
ネットワーク2 NAT

・PXEサーバディレクトリ構成

ディレクトリ パス
TFTPディレクトリ /tftpboot
HTTPディレクトリ /pxeboot

・アドレス構成

対象 アドレス
PXEサーバ 192.168.56.105
自動インストール対象マシン 192.168.56.131

※自動インストール対象マシンのアドレスは自動インストール後のアドレスです。

構築の流れ

PXEサーバは構築済みの前提となります。

・PXEサーバ側手順
1. CentOS 8.2.2004のISOファイルマウント
2. CentOS 8.2.2004のカーネルイメージのコピー
3. TFTPブート構成ファイルの作成
4. 自動インストール用ディレクトリ作成
5. Kickstart用anacondaファイル作成

・自動インストール対象マシン側手順
1. 自動インストール対象マシンの設定
2. 自動インストール

Kickstartによるインストール

Kickstartではanacondaファイルに記載された設定に従ってセットアップされます。

anacondaファイルはRHEL系であれば、/root配下に初期インストール時の設定が記載されているため、/root/anaconda-ks.cfgファイルを参考にしてKickstart用の設定ファイルを作成していきます。

CentOS 8.2.2004のISOファイルマウント

今回はUbuntu ServerインストールのようにISOイメージをインストール対象サーバに直接転送するようなことを行わなくて済むのでPXEサーバでISOマウントだけ行います。

CentOSのサイトよりCentOS 8.2.2004をダウンロードし、PXEサーバの「デバイス」→「光学ドライブ」からダウンロードしたISOファイル(CentOS-8.2.2004-x86_64-dvd1.iso)を選択します。

後ほどKickstartで指定するため、マウント先は/pxeboot/repo/CentOS/8/cdromとして、ディレクトリを作成しておきます。

ISOイメージマウント用ディレクトリ作成
sudo mkdir -p /pxeboot/repo/CentOS/8/cdrom

CentOS 8.2.2004のカーネルイメージのコピー

先ほど読み込んだISOファイルをマウントしてCentOS 8.2.2004のカーネルイメージを取得します。

カーネルイメージ格納ディレクトリ作成
sudo mkdir /tftpboot/CentOS
ISOイメージマウント
sudo mount /dev/sr0 /pxeboot/repo/CentOS/8/cdrom
カーネルイメージコピー
sudo cp /pxeboot/repo/CentOS/8/cdrom/images/pxeboot/{vmlinuz,initrd.img} /tftpboot/CentOS

TFTPブート構成ファイルについて

以前も紹介しましたが、PXEブートする際に取得するブート構成ファイルの名前は決められており、以下の様な規則になります。
※参考:BIOSベースのPXEクライアントのブート・ローダー構成

  • UUID (例: a8943708-c6f6-51b9-611e-74e6ac80b93d)
  • 01-MAC_address (例: 01-80-00-27-c6-a1-16)
  • IPアドレスの完全32ビット (例: 0A0000FD)
  • IPアドレスの最上位28ビット (例: 0A0000F)
  • IPアドレスの最上位24ビット (例: 0A0000)
  • IPアドレスの最上位20ビット (例: 0A000)
  • IPアドレスの最上位16ビット (例: 0A00)
  • IPアドレスの最上位12ビット (例: 0A0)
  • IPアドレスの最上位8ビット (例: 0A)
  • IPアドレスの最上位4ビット (例: 0)
  • default (デフォルト構成ファイル)

例えばMACアドレスのファイルを格納した場合、ホストごとにブート構成ファイルを固定できるため、それぞれのホスト専用の定義を指定することができます。

また、ブート構成ファイルの設定の書き方によっては、起動時に読み込むOSファイルやOSイメージをユーザに選択させることもできるので、defaultに複数の起動定義を記載して選択することも可能です。

TFTPブート構成ファイルの作成

今回はインストール対象マシンのMACアドレスのファイルにKickstartインストール用定義を記載します。

インタフェース名とMACアドレスは以下の想定で進めますので、自身の環境に合わせて適宜読み替えて下さい。

インタフェース MACアドレス
enp0s3 08:00:27:1d:57:34

尚、今回はVirtualBoxで作成したため、インタフェースはenp0s3となっておりますが、インタフェース名は環境によって変わるので、事前にインストールしてみるなどしてインタフェース名を確認しておいてください。

/tftpboot/pxelinux.cfg/01-08-00-27-1d-57-34
sudo cat << _EOF_ | sudo tee /tftpboot/pxelinux.cfg/01-08-00-27-1d-57-34
default kickstart
label kickstart
  kernel CentOS/vmlinuz
  initrd CentOS/initrd.img
  append ks=http://192.168.56.105/pxeboot/vmhost.cfg load initrd=CentOS/initrd.img devfs=nomount ksdevice=enp0s3
_EOF_

Anacondaファイルの設定について

anacondaファイルはいくつかのセクションに分かれており、セクションごとに指定の設定を行います。

前述の通り、RHEL系のマシンの/rootにはインストール時に使用したanacondaファイルが置かれているので、どのようなインストールを行ったのか分かるようになっています。

DVDインストールした場合のAnacondaファイル例(展開して下さい)
Anacondaファイル例
#version=RHEL8
ignoredisk --only-use=sda
autopart --type=lvm
# Partition clearing information
clearpart --none --initlabel
# Use graphical install
graphical
# Use CDROM installation media
cdrom
# Keyboard layouts
keyboard --vckeymap=jp --xlayouts='jp'
# System language
lang ja_JP.UTF-8

# Network information
network  --bootproto=static --device=enp0s3 --ip=192.168.56.105 --netmask=255.255.255.0 --ipv6=auto --activate
network  --bootproto=dhcp --device=enp0s8 --ipv6=auto --activate
network  --hostname=vmpxe01
repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream
# Root password
rootpw --iscrypted $6$GT/YYwgPk.wHIkLs$StfR0tXBveOrReUe95oqGuIdqxBCBgtZaPF2lZYWT/ciPVyvYwt9Jwc4lFQ0jC1LvYy6iBS6.zezUm69I2iST1
# Run the Setup Agent on first boot
firstboot --enable
# Do not configure the X Window System
skipx
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Tokyo --isUtc
user --name=centos --password=$6$Z9TXdeskUsRw0rwJ$4p.CPUlkJ.yzkN9i8iJVd1mItlkMgQzVUFPg0YcPh0nsghV5wD7El9wkukt5Cni/iDEdWc49KnIcoNeTHi5QU1 --iscrypted --gecos="vmware"

%packages
@^minimal-environment

%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

Anacondaファイルのセクションについて

いくつもセクションが分かれていますが、基本設定以外は%[セクション名]で始まり、%endで終わる必要があります。

また、Kickstartによるインストールを行う際によく使われるであろうスクリプトセクションですが、prepre-installはOSが完全にインストールされていない状況での処理のため、基本的には使用する必要はありません。

そのため、OSインストール後に何か処理を行わせたい場合はpostスクリプトセッションに書けば問題ないです。

セクション セクションコマンド 用途
基本設定 無し ネットワークやディスク設定などの基本設定全般
パッケージセクション %packages インストールするパッケージを記載
アドオンセクション %addon [addon_name] アドオンで提供される機能の設定
Anaconda設定セクション %anaconda 現状パスワードポリシーのためだけの設定
preスクリプトセクション %pre Kickstartファイル読み込み直後に実行される処理
pre-installスクリプトセクション %pre-install ネットワーク設定後に実行される処理
postスクリプトセクション %post インストール完了後、最初に再起動されるまでに実行される処理

Kickstartファイルの作成前準備

今回は前述の構成に以下の設定を加えることを想定してKickstart用のAnacondaファイルを作成してみようと思います。

  • firewalldとSELinuxを無効にする。
  • Python3.8をインストールする。
  • chronyでNICTのサーバに問い合わせを行うようにする。
  • dnf updateでパッケージを最新化する。

AnacondaファイルはTFTPブート構成ファイル内で指定した通り、以下に作成します。

ファイル パス
anacondaファイル /pxeboot/vmhost.cfg

また、anacondaファイルに記載されているパスワードもハッシュ値で記載する必要があるので以下の様な方法でハッシュ値を生成しておきます。
※今回はパスワードcentosで生成します。

パスワードハッシュ化
sudo openssl passwd -6 centos

もし、/rootanacondaファイルをコピーして作成している場合、権限が0600となっており、Kickstartで読み取る際、読み取れずに失敗するため、修正しておきます。

anacondaファイルの権限変更
sudo chmod 644 /pxeboot/vmhost.cfg

firewalldとSELinuxの無効化

基本設定として定義が存在するので、以下で無効化するだけです。

firewalldとSELinuxの無効化
selinux --disabled
firewall --disabled

Python3.8のインストール

dnfのパッケージインストールとPython3.8の使用設定を行います。

ついでにpipも使用できるようにしておきます。

Python3.8インストール(Packagesセクション)
python38
Python3.8設定(Postセクション)
alternatives --set python /usr/bin/python3.8
update-alternatives --install /usr/bin/pip pip /usr/bin/pip3.8 1

chronyの設定

chronyのアドレスを設定するような定義は存在しないため、postセクションでsedを使用して直接ファイルを書き換えてしまいます。

chronyの設定
sed -i -e "s/^pool/#pool/g" \
       -e "/^#pool 2/a \
pool ntp.nict.jp prefer iburst" /etc/chrony.conf

dnf update

dnf updatepostセクションに直接書き込みます。

dnf_update
dnf -y update

Kickstartファイルの作成

コメントを加えたりしつつ、作成したAnacondaファイルが以下となります。

細かくは説明しませんが、Kickstart用にいくつかパラメータを修正、追加も行っています。

コツとしては、eula --agreedで同意の選択を省くことと、repoの指定は行わないこと(AppStreamリポジトリはKickstartインストール時に指定されるため)、最後に再起動するようreboot設定をすることでしょうか。

Kickstart用Anacondaファイル例(展開して下さい)
Kickstart用Anacondaファイル例
##################################################################
# 基本セクション
##################################################################
#version=RHEL8
zerombr
ignoredisk --only-use=sda
autopart --type=lvm
# Partition clearing information
clearpart --all --initlabel

# Kickstartインストール
text
url --url=http://192.168.56.105/pxeboot/repo/CentOS/8/cdrom/
eula --agreed
reboot

# Keyboard layouts
keyboard --vckeymap=jp --xlayouts='jp'
# System language
lang ja_JP.UTF-8

# Network information
network  --bootproto=static --device=enp0s3 --ip=192.168.56.131 --netmask=255.255.255.0 --nodefroute --noipv6 --onboot=on --activate
network  --bootproto=dhcp --device=enp0s8 --noipv6 --onboot=on --activate
network  --hostname=vmhost

# Root password
rootpw --iscrypted $6$BQJphupSd1P6pREf$RDUQt69lV0np1OZpZ7I9MmpkYzPV7QMJ.Pz5TOKsXusEF.qmnmrcqOF6D5LXfLTciLLB2QIEyXriDhzyMLluv/
# Run the Setup Agent on first boot
firstboot --disable
# Do not configure the X Window System
skipx
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Tokyo --isUtc
user --name=centos --password=$6$BQJphupSd1P6pREf$RDUQt69lV0np1OZpZ7I9MmpkYzPV7QMJ.Pz5TOKsXusEF.qmnmrcqOF6D5LXfLTciLLB2QIEyXriDhzyMLluv/ --iscrypted --gecos="centos"

# firewalld、SELinuxの無効化
selinux --disabled
firewall --disabled

##################################################################
# %packageセクション
##################################################################
%packages
@^minimal-environment

# Python3.8インストール
python38

%end

##################################################################
# %addonセクション
##################################################################
%addon com_redhat_kdump --disable --reserve-mb='auto'

%end

##################################################################
# %anacondaセクション
##################################################################
%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セクション(インストール後に実行する初期設定)
##################################################################
# post処理をログに残す
%post --log=/root/anaconda-post.log --erroronfail

# NTP設定 (chronyd)
sed -i -e "s/^pool/#pool/g" \
       -e "/^#pool 2/a \
pool ntp.nict.jp prefer iburst" /etc/chrony.conf

# Python設定
alternatives --set python /usr/bin/python3.8
update-alternatives --install /usr/bin/pip pip /usr/bin/pip3.8 1

# dnf update
dnf -y update

%end

自動インストール対象マシンの設定

自動インストール対象マシンはPXEブートできるようにしておけば基本的には設定は必要ありません。

但し、インストールディスクに既にOSがインストールされているような場合は各種BIOSの起動デバイス選択からPXEブートが先になるように変更します。

VirtualBoxの場合、仮想ストレージが空の状態であれば、以下のように起動順序ネットワークにチェックされていることを確認すれば問題ありません。

01_boot.jpg

自動インストール

自動インストール対象マシンの電源を入れることでネットワークインストールが始まります。

あとは待つだけなので気長に待ちましょう。

まとめ

最近はAWSなどのクラウド環境が増えてきたのでKickstartを使う機会も減っていますが、オンプレミスのサーバ等を構築する際にはまだまだ使える機能なので、選択肢の一つとして覚えておくと、何かの役に立つかもしれません。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2