最近は 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 でコケます。
mdadm
と lvm2
はルートパーティションや /boot
が MD とか LVM とかの場合に必要です。