KickStartを使ったインストールをやってみる

RedHat系のLinuxOSのインストールを自動化するKickStartという仕組みがあります。
今回はこれを使って、そこそこ安全にLinuxインストールする方法を試してみようと思います。

参考にしたサイト

RedHat本家のマニュアルが充実しているので、恐らくここで事足りると思います。

後はこの辺り。

どんな風にインストールする?

今回のコンセプトは「そこそこ安全に初期インストール」です。


ポイントはこんな感じです

  • インストールするパッケージについては
    • 最小構成をベースする
    • コンパイル出来るようgcc, automake, autoconf などのツールは入れてしまう(最小構成・デフォルトだとインストールされないため)
    • インストール時点での最新版にしてしまう
  • 初期状態で使わないサービスは極力停止する
    • Xは使わないので関連サービスは止める
    • NFSは使わないので関連サービスは止める
    • メールは使わないので関連サービスは止める
    • その他今回の環境で必要としないものは止めてしまう(LVM関係/ソフトウェアRAID関係など)
  • iptablesを有効にしてSSHだけ許可する
  • SELinuxを有効にする(targetedモード)

他には…

  • HTTPを使ったネットワークインストールにする
  • root以外でリモートログインできるユーザーをとりあえず作る 
  • ハードディスクのパーティション構成はシンプルにする
    • /bootに100M(ext3)
    • swapに256M
    • /は残り全部(ext3)

用意した環境

同一セグメントにWebサーバーを立てて、ここにCentOSのメディアのデータを配置した
簡易リポジトリを作成してこれを利用しました。


IPは以下のものを使いました。

Webサーバー内のディレクトリ構成は以下のようにしました。

Document Root/
 +- cfg/             KickStart設定ファイルの配置用ディレクトリ
 |   +- centos4.cfg  CentOS4用のKickStart設定ファイル
 |   +- centos5.cfg  CentOS5用のKickStart設定ファイル
 +- centos4/         CentOS4用メディア配置用ディレクトリ
 |   +- disc1/       メディア1枚目
 |   +- disc2/       メディア2枚目
 |   +- disc3/       メディア3枚目
 |   +- disc4/       メディア4枚目
 +- centos5/         CentOS5用メディア配置用ディレクトリ
     +- disc1/       メディア1枚目
     +- disc2/       メディア2枚目
     +- disc3/       メディア3枚目
     +- disc4/       メディア4枚目
     +- disc5/       メディア5枚目
     +- disc6/       メディア6枚目


※注意
メディアの中に「.」で始まる隠しファイルとして.discinfoというファイルがあるのですが、
これをコピーしておかないとKickStartを走らせることができませんでした。
(404 Not Foundになってしまいそこから先に進まない)


 ちなみに配置する場所がCentOS4, CentOS5で異なりましたことを補足しておきます。

CentOS4の場合

disc[X]/
 +-CentOS/
    +-.discinfo

CentOS5の場合

disc[X]/
 +-CentOS/
 +-.discinfo

そしてKickStart用の設定ファイルです。

KickStart用設定ファイル:CentOS4の場合

CentOS4の場合はこんな感じで作ってみました。

install
url --url http://XXX.XXX.XXX.5/centos4
text
lang ja_JP.UTF-8
langsupport --default=ja_JP.UTF-8 ja_JP.UTF-8
keyboard jp106
network --device eth0 --bootproto static --ip XXX.XXX.XXX.10 --netmask 255.255.255.0 --gateway XXX.XXX.XXX.1 --nameserver XXX.XXX.XXX.1 --hostname centos4
rootpw --iscrypted  [yourpassword]
firewall --enabled --ssh
selinux --enforcing
authconfig --enableshadow --passalgo=md5
timezone Asia/Tokyo
bootloader --location=mbr
clearpart --all
part /boot --fstype ext3 --size=100
part swap --size=256
part / --fstype ext3 --size=100 --grow
reboot

%packages
@ japanese-support
autoconf
automake
cpp
e2fsprogs
e2fsprogs-devel
gcc
gcc4
gcc-c++
gcc4-c++
glibc-headers
glibc-kernheaders
grub
kernel-smp
krb5-devel
libgomp
libstdc++-devel
ntp
openssl-devel
zlib-devel

%post
# Remote User Add
groupadd -g 1000 [youruser]
useradd -u 1000 -g 1000 -d /home/[youruser] -s /bin/bash [youruser]
echo [yourpassword] | passwd --stdin [youruser]

# Disabled services
DISABLED_SERVICES="apmd autofs cpuspeed cups iiim irqbalance isdn lvm2-monitor mdmonitor mdmpd netfs nfslock pcmcia portmap rhnsd rpcgssd rpcidmapd sendmail xfs"
for SERVICE in ${DISABLED_SERVICES}
do
    /etc/init.d/${SERVICE} stop
    chkconfig --level 123456 ${SERVICE} off
done

# Enabled services
ENABLED_SERVICES="auditd psacct"
for SERVICE in ${ENABLED_SERVICES}
do
    /etc/init.d/${SERVICE} start
    chkconfig --level 345 ${SERVICE} on
done

# Update Packages
yum update -y


CentOS4の場合は、KickStart自身にオプションが無いようだったので、
初期サービスの有効化/無効化を%postに書く形にしてみました。


作成するユーザーはオプションで指定できますが、
uid, gidが指定できないのでスクリプトで作成することにしました

KickStart用設定ファイル:CentOS5の場合

CentOS5の場合はこんな感じで作ってみました。

install
url --url http://XXX.XXX.XXX.5/centos5
text
lang ja_JP.UTF-8
langsupport --default=ja_JP.UTF-8 ja_JP.UTF-8
keyboard jp106
network --device eth0 --bootproto static --ip XXX.XXX.XXX.10 --netmask 255.255.255.0 --gateway XXX.XXX.XXX.1 --nameserver XXX.XXX.XXX.1 --hostname centos5
rootpw --iscrypted [yourpassword]
firewall --enabled --ssh
selinux --enforcing
authconfig --enableshadow --passalgo=md5
timezone Asia/Tokyo
bootloader --location=mbr
clearpart --all
part /boot --fstype ext3 --size=100
part swap --size=256
part / --fstype ext3 --size=100 --grow
services --enabled auditd,psacct --disabled apmd,autofs,avahi-daemon,cpuspeed,cups,iiim,irqbalance,isdn,lvm2-monitor,mdmonitor,mdmpd,netfs,nfslock,pcmcia,portmap,rhnsd,rpcgssd,rpcidmapd,sendmail,xfs
reboot

%packages
@ japanese-support
autoconf
automake
cpp
e2fsprogs
e2fsprogs-devel
gcc
gcc-c++
glibc-headers
glibc-kernheaders
grub
krb5-devel
libgomp
libstdc++-devel
ntp
openssl-devel
zlib-devel

%post
# Remote User Add
groupadd -g 1000 [youruser]
useradd -u 1000 -g 1000 -d /home/[youruser] -s /bin/bash [youruser]
echo [yourpassword] | passwd --stdin [youruser]

# Update Packages
yum update -y

CentOS5の場合はオプションでサービスの有効化/無効化が指定できるので楽ちん。

実行してみる

実行はそんなに難しくありません。
CentOS4,CentOS5のインストールメディア1枚目を用意して、CDブートを行います。

boot :

となったところで、

boot : linux ks=http://XXX.XXX.XXX.5/cfg/centos4( or centos5).cfg ip=XXX.XXX.XXX.10 gateway=XXX.XXX.XXX.1 netmask=255.255.255.0

などと入力してやれば、後は自動でインストールが始まり、
インストールが終われば勝手にリブートまで行くはず。


後半のip, gateway, netmask はインストール時に仮に割り当てるネットワーク設定ですので、
DHCPの環境であれば特に必要もないと思います。
(今回は設定を明示してインストールしました)

今後やってみようと思っていること

  • ブート方法

 今回の方法だと最初の1枚目はインストールメディアが必要になってしまいます。
 全部ネットワーク経由にするためにPXEブートの環境を作ってみようと思います。
 Cobblerというツールがよさげで、かなり気になったので使ってみようかなぁと。

 今回はyumを使うときのリポジトリはネット上のミラーを見に行きますが、
 内部にリポジトリ作ってそっちを見にいくようにしておきたい。

  • 設定ファイルの配布など

 パッケージやサービスは初期インストール時にある程度カスタマイズをしてみましたが、
 個別の設定をもう少し自動でやりたいなと思っています。
 こっちはPuppetなどの構成管理ツールと組み合わせてみようかなと思っています。
 (%postにシェルスクリプト並べてもできるんでしょうが、力技になるので工夫しようかと)

  • SELinuxをstrictモードで最初から動かす

 オプションを見る限りはモードを指定する方法は無いように見えるので、
 何かうまいことやって初期インストール完了時点からstrictモードで動かせると楽しい。


今日はこんなところで。