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 とかの場合に必要です。

参考