unoh.github.com

Linuxをネットワーク経由で自動インストールする方法(後編)

Thu Dec 06 18:07:32 -0800 2007

こんにちは、miyakeです。早く書くつもりだったのに前回からずいぶんと時間が空いてしまいました。今日は前回構築したPXEブート環境を用いて、いよいよOSの自動インストールに取りかかります。

■前回のフォロー

まず初めに、前回の内容について追加です。前回の手順でうまくインストールできなかったという情報がありましたので、ご紹介させて頂きます。

next-serverの指定をしないとインストール出来なかったという事例が紹介されています。前回の内容でうまく動かなかった方は、/etc/dhcpd.confへの追加設定を、

filename "pxelinux.0";
next-server 192.168.10.10;

のようにしてみてください。next-serverに指定するIPアドレスは、tftpサーバとして使用するマシンのIPを指定してください。前回の記事に沿って設定した場合は、dhcpdを動かしているマシンと同一になるはずです。

通常、next-serverの指定がない場合は、dhcpサーバのIPが適用されるはずなのですが、こういうケースもあるということで、指定しておいた方が無難かも知れません。

自分でいくつかの環境で試した限りではnext-serverの指定はあっても無くても問題なく動作したのですが、もしかするとルータのdhcp設定を有効にしている場合に失敗することがあるのかも知れません。正確な原因は分かっていないので、何かご存じの方はコメント等で教えて頂けるとありがたいです。

では、本題を進めましょう。

■kickstartインストール

CentOSなどRedHat系のLinuxを自動インストールするには、kickstartという仕組みを利用します。「kickstartとは何ぞや」という概略を、RedHat EL3のマニュアルから以下に引用させて頂きます。

システム管理者の多くは、マシンにRed Hat Enterprise Linuxをインストールするのに自動化されたインストール方法を使用したいと考えています。このニーズに応えて、Red Hatはキックスタートインストールを開発しました。キックスタートを使用すると、システム管理者はたった1つのファイルを作成するだけで、一般的なインストールで要求される質問に対するすべての答えをそのファイルに含ませることができます。

要するに「設定ファイル書けば、その内容でサーバインストールできるよ」ということですね。

本稿ではこのkickstartインストールを解説します。他のディストリビューションは知らないのですが、debianではpreseedという仕組みを使って自動インストールができるようです(未検証)。今更ですがエントリのタイトルは看板に偽りありでしたね。RedHat系以外を期待された方、申し訳ありません。

■Apacheのインストール

kickstartファイルやインストールディスクのデータをネットワーク経由で取得するには、HTTP, FTP, NFSのいずれかを使用します。ここでは内部用のApacheを立ち上げて、http経由でデータを読み込む方法を紹介します。

NFS経由でインストールすると、インストール後にNFSからファイルコピーができるというので便利かなと思ったんですが、自分の環境ではNFSを使用するとkickstartインストールはうまく動いてくれませんでした。

NFSエラー
SQUASHFS error: sb_bread failed reading block 0xXXXXX
SQUASHFS error: Unable to read cache block [XXXXXXX:XXXX]
SQUASHFS error: Unable to read inode [XXXXXXX:XXXX]
SQUASHFS error: sb_bread failed reading block 0xXXXXX
SQUASHFS error: Unable to read page, block XXXXXXX, size XXXX

みたいなエラーが出て、途中でインストールが止まってしまうという症状です。どなたか詳細をご存じの方がいらっしゃったらコメント等で情報をお寄せ頂けるとありがたいです。kickstartを使わずに手動インストールでNFSからデータを取得した場合は問題無かったんですが…

なので、今回はhttp経由でインストールすることにします。Apacheのインストール方法については割愛しますが、インストール用のファイルはLAN内からのみアクセス可能にしておくといいでしょう。

■OSイメージの準備

今回はhttpd経由でインストールするので、Apacheの公開領域にインストールデータを置きます。

もちろん、通常のインストールと同様に公開ミラーからインストールすることも可能です。とりあえず試してみるには、その方が手っ取り早いかも知れません。

ここでは一例として、こんな感じで/var/www/html/isoでアクセスできるようにしてみました。

sudo mount -t iso9660 -o loop /share/CentOS-5.0-x86_64-bin-DVD.iso /mnt/iso
sudo ln -s /mnt/iso /var/www/html/iso

■kickstartファイルの準備

kickstartファイルを一から自分で書くのは面倒なので、既存の物を引っ張ってきて、それを修正します。

OSをインストールすると、/root/anaconda-ks.cfg というファイルができます。このファイルは、そのサーバのインストール情報を書いたkickstartファイルになっています。

PXEブート用のサーバのものを使い回してもいいですし、インストール対象のサーバに一度手動でOSを入れて、そこから持ってくるのもありです。

sudo cp /root/anaconda-ks.cfg /var/www/html/ks.cfg

のように、こちらもhttpでアクセスできる場所に置きます。ファイルの所有者、パーミッションは適宜設定してください。

ファイルの内容はインストール方法によって変わりますが、一例としてVMware上に作ったPXEブート用サーバの物を載せておきます。

# Kickstart file automatically generated by anaconda.

install
cdrom
lang ja_JP.UTF-8
keyboard jp106
network --device eth0 --bootproto dhcp --hostname pxe
rootpw --iscrypted XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
firewall --enabled --port=22:tcp
authconfig --enableshadow --enablemd5
selinux --enforcing
timezone Asia/Tokyo
bootloader --location=mbr --driveorder=hda
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
#clearpart --linux --drives=hda
#part /boot --fstype ext3 --size=100 --ondisk=hda
#part pv.2 --size=0 --grow --ondisk=hda
#volgroup VolGroup00 --pesize=32768 pv.2
#logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=512 --grow --maxsize=1024
#logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow

%packages
@base
@core
@development-tools
@japanese-support
kernel-devel

■kickstartのカスタマイズ(基本設定)

こうして用意したkickstartファイルを、インストールしたい構成に合わせてカスタマイズします。

既に述べた通り、anaconda-ks.cfgにはそのサーバのインストール情報が記録されているのですが、HDDの初期化に関する項目はコメントアウトされています(clearpartの行より上は純粋なコメントです)。必要に応じてコメントを解除したり、自分の好みの設定を書いてやるといいでしょう。

次にインストールメディアを指定します。2行目の「cdrom」という記述を

url --url http://192.168.10.10/iso

のように変更します。ここで指定するURLを公開ミラーのもの(http://ftp.iij.ad.jp/pub/linux/centos/5.0/os/x86_64など)にすれば、インストール用のイメージを用意しなくてもOKです。

NFSから取得する場合は、

nfs --server=192.168.10.109 --dir=/mnt/iso/

のようにするといいはずです(自分はうまくいきませんでしたが)。

また、適当なところに「text」という一行を入れてやると、インストーラがテキストモードで動作します。特に指定しない場合は通常のGUIインストーラが立ち上がるのですが、テキストモードの方がサクサク動くし、表示も分かりやすいので個人的にはこの方がお勧めです。

あとは基本的に見たままなのですが、firewallやselinuxの設定も変更できます。CentOS5.0の標準インストーラではこの項目は自動的に有効になりますが、kickstartインストールの場合は、

firewall --disabled
selinux --disabled

とすることで、無効にした状態でインストールできます。

それから、「reboot」という行を書いておくことでインストール作業が終了した後に自動で再起動してくれます。これを入れておかないと相当不便なので、是非とも書いておきましょう。

■kickstartのカスタマイズ(%packageセクション)

%packagesセクションにはインストールするパッケージの一覧が入ります。ここにパッケージ名を書いておくと、標準のインストーラには登録されていない物もインストール可能です(インストールメディアに入っていない物は無理ですが)。

例えば、上記の「kernel-devel」の下にこんな感じで書き加えます。

ntp
zsh
screen
ncurses-devel
ruby
ruby-devel
net-snmp

■kickstartのカスタマイズ(%postセクション)

通常のインストールはパッケージまで入れたらおしまいですが、kickstartでは%postセクションでインストール後に実行するスクリプトを記述できます。

%post
chkconfig ntpd on

# user setting
useradd hoge
usermod -G wheel,apache hoge
chsh -s /bin/zsh hoge

# authentication
echo 'auth required /lib/security/$ISA/pam_wheel.so use_uid' >> /etc/pam.d/su
echo 'SU_WHEEL_ONLY yes' >> /etc/login.defs
sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

# mail alias
echo "root: hoge@example.com" >> /etc/aliases
newaliases

echo "Server setup completed!" | mail root

とか。このあたりは好きに書いてください。

上記のように、%postセクションの最後でメールを送信してやると、インストール完了時にメールが飛んでくるので席を離れても安心です(もちろん途中で止まるとアウトですが)。

reboot指定をした場合、再起動がかかるのはこの%postセクションのスクリプトが実行された後になります。

■kickstartのリファレンス

kickstartにはこの他にも様々な機能があります。記述をミスしてもそこでインストール失敗にはならず、クリアできなかった部分だけ手作業での入力を求めたり、かなり賢いので試行錯誤して自分なりのkickstartを作ってみてください。

検索すれば資料はたくさんありますが、まずはRHELの公式マニュアルを一通り眺めてみるのがいいんじゃないかと思います。

■インストールに使用するkickstartの指定

こうして用意したkickstartファイルを、/tftpboot/pxelinux.cfg/default(前回の方法に沿った場合)で指定します。

default centos5_64
prompt 1
timeout 10

label centos5_64
kernel vmlinuz
append ks=http://192.168.116.10/ks.cfg noipv6 load initrd=initrd.img devfs=nomount
#append ks=nfs:192.168.10.10:/tftpboot/ks.cfg load initrd=initrd.img devfs=nomount

のように、appendの行に「ks=」でkickstartファイルを指定します。コメントアウトしているのはNFS使用時の設定です(手元ではうまく動かなかったけど)。

複数のインストール設定を使い分ける場合は、「label」以下をコピーして別名で用意し、「prompt」の設定を長くして(1/10秒単位)ブートプロンプトから「boot:linux ks=…」のようにします。また、IPアドレスでkickstartを使い分ける方法もありますが、ここでは割愛します(未検証)。

■まとめ

以上、自動インストールのTipsを2回に渡ってお送りしました。自分自身まだまだ理解の浅い未熟者ですが、皆さんの参考になれば幸いです。不備や追加情報があればコメント(はてブ含む)やTBなどでご指摘ください(特にNFS関連の情報歓迎)。

またこのエントリを書くに当たってWeb上の様々なページを参考にさせて頂きました。全てを紹介することはできませんが、代表として以下のサイトをご紹介させて頂きます。