CentOS 7 を KickStart でインストールする ISO を作る

最近は開発用の VM の構築には Packer や Vagrant が流行っているようですが、自社では諸事情で VirtualBoxVMware で個別に VM を作るのが主流です。

が、VM を作るたびに CentOSインストーラーの GUI をぽちぽちするのは苦痛なので、KickStart で一発でインストールできる ISO を作っています。

先日 CentOS 7 がリリースされたので CentOS 7 用の ISO も作ってみました。

作り方

手順の中の ftp://example.com/centos/7/os/x86_64/ は適当な CentOS 7 のミラーに変更してください。 自社とかでミラーしているならそれを使うのが良いと思います。

.

ISO を作るために mkisofs が必要なのでインストールします。CentOS 6 なら genisoimage パッケージに含まれています。

$ yum install genisoimage

作業用のディレクトリを作成します。

$ mkdir -p iso/{isolinux,ks}
$ cd iso

適当な CentOS のミラーから centos/7/os/x86_64/isolinux/ をダウンロードします。

$ rsync -avz rsync://ftp.iij.ad.jp/centos/7/os/x86_64/isolinux/ isolinux/

isolinux.cfg を編集します。

$ vi isolinux/isolinux.cfg

"label linux" という行から最後までをざくっと削除して下記の内容を追記します。

label centos7
  menu label ^Install CentOS 7
  menu default
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=ftp://example.com/centos/7/os/x86_64/ ks=cdrom:/ks/centos7.cfg

ついでに先頭の方にある timeout の値を短くしておきます。

timeout 50

KickStart のコンフィグを作成します。

$ vi ks/centos7.cfg

次のように作成します。

ks/centos7.cfg

#version=RHEL7

cmdline
install
url --url=ftp://example.com/centos/7/os/x86_64/

lang en_US.UTF-8
keyboard --vckeymap=jp106 --xlayouts=jp
timezone Asia/Tokyo --isUtc --nontp

network --bootproto=dhcp --ipv6=auto --activate --hostname=unknown

#rootpw --plaintext password
rootpw --iscrypted $1$2c5VfLZS$WKO3i5/aJrKMDe9fudZ/p0

zerombr
bootloader --location=mbr

clearpart --all --initlabel
part / --fstype=xfs --grow --asprimary --size=1

auth --enableshadow --passalgo=sha512
firstboot --disabled
selinux --disabled
firewall --disabled

poweroff

%packages --nobase
%end

%pre
mkdir /mnt/cdrom
mount -o ro /dev/cdrom /mnt/cdrom
%end

%post --log=/root/ks-post.log
set -x
%include /mnt/cdrom/ks/post.sh
%end

インストール後になにか後処理を入れたいなら ks/post.sh に書きます。

$ vi ks/post.sh

例えばブート時のカーネルパラメータから rhgb を削除するようにしてみます。

ks/post.sh

# [grub] remove rhgb
sed -i.orig -r '/^GRUB_CMDLINE_LINUX=/s/\s+rhgb//' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg

ISO を作ります。

$ mkisofs \
    -o ../centos7-x86_64.iso \
    -b isolinux/isolinux.bin \
    -c isolinux/boot.cat \
    -no-emul-boot -boot-load-size 4 -boot-info-table -r -J -v ./

centos7-x86_64.iso が作成されます。この ISO からブートすると KickStartCentOS 7 が自動でインストールされます。

注意点

なお、↑の centos7.cfg ままだと・・・

  • root のパスワードが password です
    • 次の手順で変更できます
      • openssl passwd -1 で好きなパスワードを入力して暗号化します
      • centos7.cfgrootpw --iscrypted ... のところを暗号化されたパスワードで書き換えます
  • 問答無用でディスクのパーティションを削除します
    • この ISO を挿入してブートすると既存のシステムは破壊されます
  • ディスク全体を "/" にします
    • swap が必要なら後で追加してください
  • インストールされるパッケージは最小構成です
    • Base すらありません
    • インストール後に yum groupinstall base してください
  • firewall は無効です
    • 必要ならセットアップ後に有効にしてください
  • selinux は無効です
    • すみません

ハマったところ

isolinux.cfgカーネルパラメータで inst.stage2 でインストールソースを指定しないと次のようなメッセージが表示されてインストールが止まりました。

dracut-initqueue: Warning: Could not boot
dracut-initqueue: Warning: /dev/root does not exist 

CentOS 6 のころは無くても大丈夫だったのになぜだろう?