RedHat Linux KickStart HOWTO Martin Hamilton v0.2, 11 January 1999 藤原輝嘉 16 May 1999 本 HOWTO ドキュメントは,RedHat Linux の KickStart システムを使って同 一の Linux マシンを素早く大量にインストールする方法を説明します.また 上級ユーザ向けに,KickStart のインストール手続きを修正して独自の処理を させる方法と,独自 RPM パッケージの構築方法を簡単に説明します. ______________________________________________________________________ 目次 1. 著作権表示 2. ホームページ 3. 日本語訳について 4. はじめに 5. 必要なもの 6. 起動フロッピーの設定 7. KickStart の設定ファイル 7.1 システム情報 7.2 インストールするパッケージ 7.3 インストール後のシェルコマンド 8. 実際のインストール 9. ブートディスク/補助ディスクのマウント 10. RedHat のインストーラの修正 11. FAQ とお願いリスト 12. クレジット 13. 付録 A - BOOTP/DHCP と NFS の設定 14. 付録 B - 独自の RPM パッケージの作り方 15. 付録 C - 独自の RPM をディストリビューションに入れる ______________________________________________________________________ 1. 著作権表示 Copyright (c) 1998 Martin Hamilton, All rights reserved. This is free documentware; you can redistribute it and/or modify it under the terms of version 2 or later of the GNU General Public License . 2. ホームページ 本ドキュメントを Linux HOWTO ドキュメントのミラーサイトや CD-ROM から 入手した場合には,KickStart HOWTO ホームページ を見て,より新しい版が出ていな いかどうかを確認するとよいでしょう. 3. 日本語訳について 日本語訳は Linux Japanese FAQ Project が行いました (藤原輝嘉 (日本語訳),中野武雄 (校正)).日本語訳に関する誤りの指摘や,原文の 作者にフィードバックをしたいけれど英語は苦手だという方は JF プロジェク ト() までご連絡ください. 原文のライセンスに従いまして,日本語訳の配布ライセンスは GNU General Public License (バージョン 2 以 降)となります. 4. はじめに RedHat Linux のバージョン 5 には,KickStart と呼ばれる,あまり知られて いない(現時点ではドキュメントもあまりありません)機能が付いています.こ の機能を用いると,RedHat Linux のインストール作業の大部分 (あるいは全 て) を自動化することができます.自動化できる処理には以下のものがありま す: o 使用する言語の選択 o ネットワークの設定およびディストリビューションのインストール元の選 択 o キーボードの選択 o (lilo 等の)ブートローダのインストール o ディスクのパーティション設定とファイルシステムの作成 o マウスの選択 o X ウィンドウシステムのサーバの設定 o タイムゾーンの選択 o root のパスワード(の初期値)の選択 o インストールするパッケージの選択 察しの良い RedHat ユーザであれば,これらは本質的に RedHat Linux システ ムを手動インストールする際の手順であることに気づいたかと思います. KickStart システムは通常のインストール手順をスクリプト記述することを可 能にします.これは,通常はキーボードから入力すべき情報を設定ファイルに 書くことによって行います. しかしお待ちください.話はまだあります :-) KickStart を使うと,通常のインストール処理を終えた後に,さらにシェルレ ベルのコマンド群を指定して実行させることができます.つまり, RedHat Linux の一部として配布されていないローカル向けのソフトウェアを自動的に 追加インストールして(フリーソフトウェアであっても,RedHat ディストリ ビューションに付いてこないものがあります.法的な理由により RedHat が配 布できないものもあります.例えば ssh や暗号化システム PGP です),完全 に使えるシステムにするために必要な仕上げを行うことができるのです. 5. 必要なもの KickStart を使ったインストールには 2 つのアプローチがあります.1 つは 単に KickStart の設定ファイルを RedHat の起動フロッピーにコピーすると いうものです.もう 1 つの方法は,通常の起動フロッピーを用い,KickStart の設定ファイルはネットワーク経由で取り込むという方法です. どちらの場合にも以下のものが必要です: 1. Intel (i386) 系のマシン - この文書を執筆している時点では, KickStart はこれらのマシンでなければ動作しないようです. 2. KickStart の設定ファイル - こちらについては次のセクションで説明しま す. 3. RedHat の起動ディスク - 修正パッケージやドライバの更新パッケージを 利用するため updates ディレクトリから入手することが望ましいでしょ う. 4. 使おうとしている IP アドレスの DNS エントリ - これは無くても構いま せんが,これを指定するとインストール時にマシンのドメイン名を入力せ ずに済みます. ネットワークを通して設定ファイルを取り込む場合には,設定ファイルを NFS 経由でエクスポートする必要があります.これは現在サポートされている唯一 のアクセス方法です.設定ファイルの指定により,RedHat ディストリビュー ション本体を別の NFS サーバから取り込むことができます. 静的な IP アドレスをマシンに設定することもできます.例えば,KickStart によるインストールのために予約した特別なアドレスです.別の方法として, 設定ファイルに IP アドレスを直書きしたくなければ,BOOTP/DHCP サーバを 使って設定ファイルを取り込むように KickStart に指示することができま す.これを用いると,何らかのサーバが指定の範囲内のアドレスを自動的に割 り当てます.このようなサーバとしては,動的アドレス割り当て拡張付きの CMU BOOTP サーバ 等がありま す. NFS や BOOTP/DHCP の詳しい説明については付録 A を参照してください. 6. 起動フロッピーの設定 本質的には,しなければならない作業は KickStart の設定ファイルを RadHat の起動フロッピーに ks.cfg という名前でコピーすることだけです.この操作 は以下のように行います: mcopy ks.cfg a: しかし RedHat の起動フロッピーには色々なファイルが詰め込んであるので, 他のファイルをいくつか消して空きを作ってやらないと KickStart の設定 ファイルをコピーできないかもしれません.筆者の場合には各種メッセージの ファイルを消せば何とかなりました.このメッセージは普通,ブートローダ SYSLINUX が表示するものです.この操作は以下のように行います: mdel a:\*.msg 別の方法としては,持っていないハードウェアのドライバをいくつか捨ててし まうこともできるでしょう.後述の起動フロッピーの修正に関するセクション をご覧ください. SYSLINUX の設定ファイルである syslinux.cfg も編集したくなるかもしれま せん.このファイルも RedHat の起動フロッピーのトップレベルディレクトリ にあります.例えば以下のような syslinux.cfg を用いると,マシンの起動時 に自動的に KickStart モードに入ります.通常の入力待ちはありません: default ks prompt 0 label ks kernel vmlinuz append ks=floppy initrd=initrd.img 独自の起動フロッピーや補助フロッピーを作る際には,お近くの RedHat のミ ラーサイトの updates/i386 ディレクトリにある最新のディスクイメージを元 にするとよいでしょう.古いディスクイメージにはバグがあったり,対応して いるハードウェアが少ないことがあります. 7. KickStart の設定ファイル 設定ファイルには 3 つの主なセクションがあります: 1. システム情報(ディスクのパーティション情報やネットワークの設定) 2. インストールする RedHat のパッケージ 3. インストール後に実行するシェルのコマンド ここで説明しないものも他にいくつかありますが,それも動作すると思いま す.詳しい情報については, misc/src/install/ks.samp にある KickStart の設定例と doc/README.ks を見てください.これらのファイルは,CD-ROM ま たは RedHat のミラーサイト内の RedHat ディストリビューションのトップ ディレクトリにある i386 ディレクトリにあります. 7.1. システム情報 利用可能なディレクティブのうち,筆者が使っているものを以下に示します: lang 言語の設定(英語など) lang en network ネットワークの設定(BOOTP や DHCP の使用など) network --bootp nfs インストール元となる NFS サーバとディレクトリ.指定例は以下: nfs --server chicken.swedish-chef.org /mnt/cdrom NFS サーバ chicken.swedish-chef.org を使い,RedHat ディストリビュー ションを /mnt/cdrom ディレクトリからマウントします. keyboard キーボードの種類の設定(例えばイギリス用キーボード等) keyboard uk zerombr MBR(Master Boot Record) を消去します.既存のオペレーティングシス テムのブートローダをディスクから消去します. clearpart 既存のパーティションを消去します.例えば,インストール前に既存の ディスクパーティションを全て消す等の場合です. clearpart --all part ディスクのパーティションを切ります.例えば,ルートファイルシステ ムに 500MB を割り当てます. part / --size 500 install RedHat Linux を新規インストールします. mouse 使用するマウスを設定します.例えば,PS/2 または PS/2 互換の「バ スマウス」では以下のように設定します. mouse ps/2 timezone タイムゾーンを設定します.例えば,イギリスのローカル時刻は以下の ように設定します. timezone --utc Europe/London rootpw root の初期パスワードを設定します.これには予め暗号化したパスワ ード文字列を与えます. rootpw --iscrypted XaacoeGPmf/A. lilo ブートローダ LILO をインストールします.マスターブートレコー ド(Master Boot Record, MBR)にインストールするには以下のように指 定します. lilo --location mbr %packages インストールするパッケージ.詳しくは後述します. %post インストール後に実行するシェルのコマンド.詳しくは後述します. KickStart が RedHat ディストリビューションを探すディレクトリには, RedHat という名前のサブディレクトリが必要だということに注意してくださ い.このディレクトリ内には,該当プラットフォーム用の RedHat ディストリ ビューションがあります.先に示した例では,以下のようなファイルとディレ クトリがあるはずです: /mnt/cdrom/RedHat /mnt/cdrom/RedHat/base /mnt/cdrom/RedHat/contents /mnt/cdrom/RedHat/i386 /mnt/cdrom/RedHat/instimage /mnt/cdrom/RedHat/RPMS /mnt/cdrom/RPM-PGP-KEY ネットワーク経由でなく CD-ROM からインストールしているなら,ディレクト リの内容は以下のようになるはずです: RedHat RedHat/base RedHat/contents RedHat/i386 RedHat/instimage RedHat/RPMS RPM-PGP-KEY 複数アーキテクチャ用の RedHat ディストリビューションがある場合( NFS サ ーバ上などにあるはずです.複数アーキテクチャのディストリビューションは 1 枚の CD-ROM に収まりません)には,それぞれのディストリビューションに は,以下のようなサブディレクトリの下に同じ名前のファイル群やディレクト リ群があると思います: alpha/RPM-PGP-KEY i386/RPM-PGP-KEY sparc/RPM-PGP-KEY architecture/Redhat/architecture というファイルが存在しなければなりま せん(例: i386/Redhat/i386). 暗号化したパスワード文字列を作るのは,Perl を使えばとても簡単です.例 えば以下のように行います. % perl -e 'print crypt("schmurrdegurr", "Xa") . "\n";'p その他のオプション(および実際には使われないオプション)を示します.筆者 は試していません: cdrom ネットワークではなく CD-ROM からインストールします. device デバイスの詳細事項を明示的に宣言します.指定例を以下に示します. device ethernet 3c509 --opts "io=0x330, irq=7" device オプションに指定できる値は,SCSI コントローラ用の scsi, 独自 CD-ROM ドライブ用の cdrom です. upgrade 新規インストールではなく,既にインストールしているものを更新しま す. xconfig X ウィンドウのサーバ,グラフィックカード,モニタを設定します. xconfig --server "Mach64" --monitor "tatung cm14uhe" 最後のオプションについてはあまり詳しく調べていません.というのも,筆者 は KickStart でインストールしたマシンのコンソールで X を実行する予定が ないからです.筆者は KickStart 内で xconfig を実行すると動作がちょっと 変になると聞いていますが,同じ機能は Xconfigurator を使ってコマンドラ インから実現できます.したがって,X の設定はインストール後のスクリプト に残しておくのが良いでしょう. KickStart の設定ファイルの最初の部分を示します.このファイルは,先程説 明したオプションを組み合わせて作ります: lang en network --static --ip 198.168.254.253 --netmask 255.255.255.0 --gateway 198.168.254.1 --nameserver 198.168.254.2 nfs --server chicken.swedish-chef.org /mnt/cdrom keyboard uk zerombr yes clearpart --all part / --size 500 part swap --size 120 install mouse ps/2 timezone --utc Europe/London rootpw --iscrypted XaacoeGPmf/A. lilo --location mbr RedHat に関する書籍の一部には,実際には動作しない network ディレクティ ブ(network --option)を呼び出すような記述を行っているものがあるので注意 してください.正しい呼び出し方は,network の後に --static, --bootp, --dhcp のいずれかを記述します.BOOTP オプションと DHCP オプションは別 のものであることを覚えておいてください.両者は別のコードで書かれている くらい違っています. part ディレクティブには引き数 --grow を追加することができます.この引 き数は,指定したサイズよりもパーティションを大きくしてよいことを指示し ます.この指定が意味を持つのはパーティションが 1 つあり,これに --grow というタグが付いている場合だけでしょう. 7.2. インストールするパッケージ KickStart の設定ファイルの packages セクションの先頭には, %packages ディレクティブだけを書いた行を置きます.この後には 2 つのタイプのうち の 1 つあるいは両方のパッケージ指定子を書きます.それぞれのパッケージ は,RPM の名前(バージョンとプラットフォームの情報は含めません)を指定す ることによってインストールすることができます.またパッケージのグループ は,グループの名前を指定すればインストールできます. KickStart の設定ファイルの packages セクションの設定例を以下に示しま す: %packages @ Base netkit-base bind-utils ncftp rdate tcp_wrappers traceroute cmu-snmp さて,これらのグループは何でしょうか? たくさんのグループがデフォルトで 定義されていますね.これは RedHat ディストリビューションのトップレベル ディレクトリにある base/comps というファイルに書かれています.本ドキュ メントの執筆の時点におけるグループを示します: o Base o Printer Support o X Window System o Mail/WWW/News Tools o DOS/Windows Connectivity o File Managers o Graphics Manipulation o X Games o Console Games o X multimedia support o Console Multimedia o Print Server o Networked Workstation o Dialup Workstation o News Server o NFS Server o SMB (Samba) Connectivity o IPX/Netware(tm) Connectivity o Anonymous FTP/Gopher Server o Web Server o DNS Name Server o Postgres (SQL) Server o Network Management Workstation o TeX Document Formatting o Emacs o Emacs with X windows o C Development o Development Libraries o C++ Development o X Development o Extra Documentation このリストは手動インストールの時にユーザが尋ねられる各種設定に対応して いることにお気づきかと思います.一部のパッケージは複数のグループに含ま れていますが,それらのグループを同時にインストールしても問題はありませ ん.comps リスト中の各グループエントリは以下のようになっています: 0 Extra Documentation sag lpg howto faq man-pages end 名前(上のリストの最初の行)の隣が 1 であるグループは,デフォルトでイン ストールされるものとして選択されます.このファイルを編集して独自のグル ープを作ることや,既存のグループを再定義することにより,Linux のインス トール処理をさらにカスタマイズできます. 7.3. インストール後のシェルコマンド この機能が多分最も特筆すべきものであり,手動インストールにはこれ直接に 対応するものはありません.ここで行えることはシェルのコマンド列を指定す ることであり,実行されるのはインストールの主要な部分(ディスクのパー ティション分割,パッケージインストール等)が終わった後になります. KickStart の設定ファイル中において,このセクションの先頭の印は %post ディレクティブです.これ以降の部分では,新しく構築した Linux システム にインストールされているユーティリティを全て使用することができます.指 定例を以下に示します: %post ln -s /etc/rc.d/init.d /etc/init.d ln -s /etc/rc.d/rc.local /etc/rc.local ln -s /usr/bin/md5sum /usr/bin/md5 ln -s /usr/bin/perl /usr/local/bin/perl chmod ug-s /bin/linuxconf mkdir /var/tmp/tmp perl -spi -e 's!image=/boot/vmlinuz-.*!image=/boot/vmlinuz!' /etc/lilo.conf rm /etc/rc.d/rc*.d/*sendmail I/O リダイレクションやヒアドキュメントを使うこともできます: cat <>/etc/passwd squid:*:102:3500:Squid Proxy:/usr/squid:/bin/bash EOF cat <>/etc/group cache:x:3500: EOF 以下に示す例は,システムの起動スクリプトを修正するものです: cat <>/etc/rc.local echo 8192 > /proc/sys/kernel/file-max echo 32768 > /proc/sys/kernel/inode-max [ -x /usr/sbin/sshd ] && /usr/sbin/sshd [ -x /usr/sbin/cfd ] && /usr/sbin/cfd EOF これは crontab のエントリの設定例です: cat </tmp/crontab.root # Keep the time up to date 0,15,30,45 * * * * /usr/sbin/ntpdate -s eggtimer 2>&1 >/dev/null # Recycle Exim log files 1 0 * * * /usr/exim/bin/exicyclog # Flush the Exim queue 0,15,30,45 * * * * /usr/exim/bin/exim -q EOF crontab /tmp/crontab.root rm /tmp/crontab.root 独自に作った RPM をインストールすることもできます: rpm -i ftp://chicken.swedish-chef.org/rpms/squid.rpm rpm -i ftp://chicken.swedish-chef.org/rpms/ssh.rpm rpm -i ftp://chicken.swedish-chef.org/rpms/exim.rpm rpm -i ftp://chicken.swedish-chef.org/rpms/cfengine.rpm rpm -i ftp://chicken.swedish-chef.org/rpms/linux.rpm ssh-keygen -b 1024 -f /etc/ssh_host_key -N "" depmod -a これと同じ効果は,実行したいコマンドを含む RPM パッケージを作ることに よっても実現できることを知っておいてください.詳しくは後で説明します. このような RPM パッケージに付ける名前は注意して決めてください.そうす ればこれを最初(例: 'aaa' で始まる名前を指定)や最後(例: 'zzz' で始まる 名前を指定)にインストールさせることができます. root の crontab エントリを設定で危険が比較的小さい方法は,エントリを /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly にファイルとして作成することです. 独自の RPM パッケージを作るための詳しい情報については付録 B をご覧くだ さい. 8. 実際のインストール インストールを行うマシンは RedHat の起動フロッピーを使って普通に起動し ますが,SYSLINUX では RETURN キーを押さないで, linux ks と入力しま す. 運が良ければ,これを入力するだけで終わりです! 前に簡単に説明したように RedHat の起動フロッピーをカスタマイズしていれ ば,それすらも必要ないでしょう :-) RedHat のインストールに含まれる普通の手順を今まさに自動化したわけです から,手動インストールのダイアログが現れるのは,KickStart が次の手順を 見失った場合だけです.最もありそうなケースは,ネットワークインタフェー スが自動的に検出されず,インタフェースの IRQ や I/O アドレスの問い合わ せが行われる場合です.ISA バス用のカードの場合には KickStart が補助を 必要とすることもよくありますが,PCI バス用のカードの場合には自動的に処 理されます. 通常通りの操作で仮想コンソールを切替えることにより,KickStart が行って いる処理を監視することができます: o Alt-F1 - インストールのダイアログ o Alt-F2 - シェルのプロンプト o Alt-F3 - インストールのログ(インストールプログラムからのメッセージ) o Alt-F4 - システムのログ(カーネル等からのメッセージ) o Alt-F5 - その他のメッセージ 9. ブートディスク/補助ディスクのマウント RedHat の起動ディスク boot.img は MS-DOS フォーマットです.また,起動 には SYSLINUX プログラムを使っています.補助ディスクは Linux の ext2 ファイルシステムです.ループバックファイルシステムをサポートするように Linux カーネルを設定してあれば,これらを両方ともファイルシステムにマウ ントし,ハックすることができます: # mkdir -p /mnt/boot /mnt/supp # mount -o loop -t msdos boot.img /mnt/boot # mount -o loop supp.img /mnt/supp マウントしてしまえば,起動ディスクと補助ディスクに含まれるファイルはそ れぞれ /mnt/boot と /mnt/supp にあるファイルとして操作できるはずです. mount のバージョンが古いと -o loop オプションが使えないかもしれないの で気を付けてください.このような場合には,明示的に losetup コマンドを 用いて,それぞれのファイルに対してループバックデバイスを設定してやる必 要があります.操作例を以下に示します: # losetup /dev/loop0 boot.img # mount -t msdos /dev/loop0 /mnt/boot 補助ディスク等の ext2 ファイルシステムをマウントする際にも, -t ext2 オプションを明示的に指定する必要があるかもしれません.しかし,最近の Linux ディストリビューションを使っているならば,このような心配をする必 要はないはずです. あまりいじり回すつもりがないのであれば,手を抜いてフロッピーのディスク イメージでなく実際のフロッピーディスクを操作してももちろん構いません. ですが時間をかけたくなければ,ループバックデバイスを使う方がよいでしょ う.というのも,本物のフロッピーディスクの読み書きは遅いのですが,ディ スクイメージを使えばこの問題を避けてハックすることができるからです. 10. RedHat のインストーラの修正 インストールの手順自体をいじりたければ,RedHat の CD-ROM またはお近く の RedHat ミラーサイトから,インストーラのソースコードを入手してくださ い.これはディストリビューションのトップディレクトリにある i386 ディレ クトリの下の misc/src/install ディレクトリにあります. RedHat の起動ディスクを調べれば,Linux カーネルである vmlinuz に加え, 大きなファイル initrd.img があることに気づくと思います: -rwxr-xr-x 1 root root 559 May 11 15:48 boot.msg -rwxr-xr-x 1 root root 668 May 11 15:48 expert.msg -rwxr-xr-x 1 root root 986 May 11 15:48 general.msg -rwxr-xr-x 1 root root 968842 May 11 15:48 initrd.img -rwxr-xr-x 1 root root 1120 May 11 15:48 kickit.msg -r-xr-xr-x 1 root root 5352 May 11 15:48 ldlinux.sys -rwxr-xr-x 1 root root 875 May 11 15:48 param.msg -rwxr-xr-x 1 root root 1239 May 11 15:48 rescue.msg -rwxr-xr-x 1 root root 402 May 11 15:48 syslinux.cfg -rwxr-xr-x 1 root root 444602 May 11 15:48 vmlinuz ご想像の通り,これはファイルとして格納されている別の ext2 ファイルシス テムです.ただし少しひねりが入っています.実際には圧縮もされているので す.このファイルを展開して,その結果をマウントすることができます.操作 例を以下に示します: # gzip -dc /mnt/boot/initrd.img >/tmp/initrd.ext2 # mkdir /mnt/initrd # mount -o loop /tmp/initrd.ext2 /mnt/initrd このファイルシステムで最も重要な部分は,起動ディスクに入っているローダ ブルカーネルモジュール群でしょう.新しいバージョンのドライバをマージす る必要があるなら,これを静的にリンクした新しいカーネルで vmlinuz を置 き換えるか,あるいはモジュール群を差し替える必要があります.さらに,空 きディスクを確保するために他のモジュールを捨てる必要があるかもしれませ ん. モジュール群は modules/modules.cgz ファイルです.これはどんなファイル なのでしょうか? これは実際には圧縮した cpio ファイルです.読者の皆さん が信じるかどうかは分かりませんし,もう誰も cpio なんて使ってないと思わ れるかもしれませんが! 実際には RPM パッケージ自体も内部的には cpio を 使っています.以下の手順はモジュール群のファイルをハックするための方法 です: # gzip -dc /mnt/initrd/modules/modules.cgz >/tmp/modules.cpio # cpio -itv modules.listing # mkdir modules # cd modules # cpio -idumv <../modules.cpio 筆者が知る限りでは,現在の Linux(少なくとも主要ディストリビューション では)には圧縮されたファイルシステムを透過的に扱う方法は無いはずです. もっと良い方法があればお知らせください! 何らかの変更を行った場合には,以下の処理も忘れずに行ってください: 1. cpio を使ってアーカイブを作り直します.作り直しの方法は,読者の皆さ んへの宿題としておきます…. 2. できたアーカイブを gzip を使って圧縮します. 3. これを /mnt/initrd あるいは圧縮されていない initrd.img が置かれてい る場所にコピーします. 4. /mnt/initrd (あるいはマウントした場所)をアンマウントします. 5. 新しい initrd.img を gzip を使って再び圧縮します. 6. できたアーカイブを起動ディスクイメージにコピーします.本ドキュメン トの例では /mnt/boot/initrd.img です. 7. 起動ディスクイメージ(例えば /mnt/boot)をアンマウントします. 最後に,このように修正した起動ディスクの設定を用いて新しい起動フロッピ ーを作成することができます.作成は例えば以下のように行います: # cat boot.img >/dev/fd0 11. FAQ とお願いリスト Q: KickStart を使ったインストールの後,マシンが起動しません. BIOS が Missing operating system といったメッセージを吐きます. A:ルートファイルシステムが置かれているパーティションが起動可能でないよ うです.fdisk を使って,起動可能ステータスを変えてください. Q: フロッピーで起動した後に Error opening files for kickstart copy: File exists というメッセージが出ます. A: もっと新しいバージョンの boot.img と supp.img を使ってください.こ のファイルはお近くの RedHat ミラーサイトの updates ディレクトリにあり ます.RedHat 5.1 では,古いバージョンのディスクイメージの一部にバグが ありました. Q: 重要なパッチ(更新 RPM パッケージ)も自動的に適用することができるので しょうか? できるとしたらどうやって適用するのでしょうか? A1: インストールしたい RPM パッケージを,インストールに使う RPMS ディ レクトリにコピーし,古い RPM パッケージを削除して, RedHat/base/hdlist ファイルを新しい RPM パッケージの詳細情報に書き直します.これを行うた めに Eric Doutreleau さんが作成したスクリプトを付録 C で紹介します.こ の作業を自分自身で行った場合は,その後忘れずに genhdlist を実行してく ださい. A2: Perl スクリプト patchup を試 してください.このスクリプトは,システムにインストールされている RPM パッケージと候補ディレクトリにある RPM パッケージを比較し,更新の必要 があると思われるものを報告します.スクリプトを信用して,そのまま RPM パッケージをインストールすることもできます. A3: rpm2hml は A2 をずっと強力に したバージョンです(12MB の C 言語のコードとたった 1 ページの Perl スク リプトを比べていますが!). Q: インストールサーバに一つだけ設定ファイルを置き、それがすべてのクラ イアントによって (IPADDR-kickstart が無い時に) デフォルトで使われるよ うにするにはどうすればいいでしょう? A1: BOOTP/DHCP 'boot file' のパラメータである bf を使ってファイル名を 設定してください. A2: /etc/bootptab の該当項目にレコード bf=/kickstart/ks.cfg を追加して ください. Q: うまく行かない時にもっと柔軟に動作するようにしたいです.例えば, ディストリビューションが CD-ROM 上に無い時に別の場所を尋ねるといった動 作です. A: ? Q: 明示的に特定のパッケージを除外したいです.例えば, sendmail に関係 するものだけを除外するような場合です. A: BASE を sendmail 抜きで再構築してください. Q: /etc/rc.d/ にあるランレベルスクリプトによって起動時に自動的に開始さ れるサービスを選択する方法を教えてください. A: chkconfig ユーティリティを使うと,起動時に自動的に開始するサービス を設定することができます.これをインストール後に実行するスクリプトのセ クションで実行することもできます.ランレベル 3, 4, 5 で ypbind を起動 するための設定例を以下に示します: chkconfig --level 345 ypbind on これにより,レベル 3, 4, 5 で ypbind が起動されるようになります. Q: シェルのコマンドを %post セクションで実行する時,メイン画面を上書き しないで出力を別の仮想コンソールに出したいと思います.これをシェルコマ ンドセクションで open を使って行えますか? A: できます.以下のようにしてください: exec >/dev/tty5 Q: ファイルシステム生成のコードは不良ブロックのチェックを行いますか? A: ファイルシステム生成時の出力が表示される仮想コンソールに移れば, 「読み取り専用」テスト実行に関する出力が行われていないことがわかると思 います.したがって,答えは「いいえ」のようです. Q: 一部のマシンだけを他のマシンと違う設定にすることはできますか? A: ホスト依存の設定を KickStart の設定ファイルのスクリプト記述セクショ ンに移せば大丈夫です.ここで指定したマシンの場合に限って指定された RPM パッケージをインストールするようにします.設定ファイルのパッケージセク ションに条件付きインストール機能(例: アーキテクチャ,ホスト名/ドメイン 名,IP アドレスによる分岐)があれば便利だったのでしょうが…. Q: RedHat 5.1 から 5.2 で変更された部分はありますか? A1: インストーラへの変更点はたくさんありますが,そのほとんどはバグ修正 と見栄えの改善です.筆者が言える限り(新旧の misc/src/install ディレク トリの diff -rcs を取った結果)では,KickStart への影響はありません. A2: RedHat 5.2 では bootpd への自動 IP 割り当て/DHCP パッチが入ったよ うですが,その使い方の説明はドキュメントには入っていません. Q: (/home を残したまま / を消す等のために) 特定のパーティション(1 つま たは複数)を消すことはできますか? できるならば,どのようにして行うので しょうか? A: できません.今のところは! Q: 複数のドライブに分けてパーティションを割り当てることはできますか? 例えば,/ を sda に置き,/home を sdb に置くといった具合です. A: できません.パーティション操作ツールからアクセスできるのは最初のド ライブだけのようです. Q: 既に存在しているパーティションをマウントテーブルに入れることはでき ますか? それとも,新しいパーティションを生成してこれをマウントテーブル に入れることしかできないのですか? A: ? Q: mkkickstart を実行した後,mkkickstart が生成したファイルはどこに置 かれるのですか? A: mkkickstart はファイルを作りません. mkkickstart は KickStart の設 定を標準出力に出力します. Q: 仮想コンソール 4 (Alt-F4) に Unable to load NLS charset cp437(nls_cp437) というメッセージが出ます.これはどういう意味でしょう か? 何か問題があるのでしょうか? A: Joliet 拡張形式(ISO 9660 の Unicode 拡張)で焼いた CD-ROM をマウント しようとしているように見えます.理論的には CD-ROM 上のファイル名はおか しくなり,Linux では正しく読めません.実際には,問題になることはまずな いようです.実は関係ないのかもしれません. Q: どうして X ウィンドウシステムがインストールされるのでしょう? インス トール対象のパッケージにはしていないのですが. A: XFree86-VGA16 の RPM パッケージは 'base' コンポーネントに入っている ので必ずインストールされます.ただし base クラスの定義を変えればその限 りではありません. Q: インストール後に実行するスクリプト内で,それまでにインストールされ たパッケージを使い,フロッピーに入っている限られたツールではできない面 白いことができますか? A: できます.Perl をインストールして KickStart の設定ファイルと組み合 わせれば,5 行くらいのスクリプトで大抵のことができます :-) 12. クレジット Eric Doutreleau さんには chkconfig に関する情報, SYSLINUX の設定ファ イルのハック,お使いのディストリビューションのサーバの RPM を更新する ための Perl スクリプトについて教えていただきました.Robert Kaminsky さ んにはたくさんの調査を行っていただきました. Piete Brooks さん,Flavia Regina Munhoz さん,Tom Toffoli さん,Bob Robbins さん,Charlie Brady さん,Ragen Herrington さんにはコメントや質問をいただきました.これら の皆さんに感謝します. 13. 付録 A - BOOTP/DHCP と NFS の設定 BOOTP や DHCP が一体何のことだか分からなければ, DHCP の WWW サイト にある詳しい情報をご覧ください.NFS はこれとは 別に NFS HOWTO で詳しく説明されています.DHCP mini-HOWTO もあります. ここでは入門的なレベルの説明を行うつもりであり,それぞれの話題に関する 突っ込んだ説明は行いません.話を簡単にしすぎだと思われたら,筆者にお知 らせください. ここで説明する BOOTP/DHCP + NFS の構成を使ったインストールにおいては, KickStart の設定ファイルは BOOTP/DHCP サーバ上の /kickstart/IPADDR- kickstart からインストール対象のマシンに NFS でマウントできなければな りません.ここで IPADDR は新しいマシンの IP アドレスです.例えば, /kickstart/198.168.254.254-kickstart はマシン 198.168.254.254 用の設定 ファイルです. BOOTP/DHCP の応答で bf(boot file)パラメータを返すことによってこの位置 を上書きすることができるはずです.このファイルは全く別のマシンから NFS マウントすることもできると思います. 既存の Linux マシンからディレクトリを NFS エクスポートするには,以下の ような内容のファイル /etc/exports を作成します: /kickstart *.swedish-chef.org(ro,no_root_squash) /mnt/cdrom *.swedish-chef.org(ro,no_root_squash) 使う予定の IP を DNS に登録していない場合には,NFS サーバや RPC ポート マッパから見えないと言われるかもしれないので注意してください.このよう な場合には,IP アドレスとネットマスクの組を設定ファイルに書けばなんと かなります.記述例を以下に示します: /kickstart 198.168.254.0/255.255.255.0(ro,no_root_squash) /etc/hosts.allow には以下の記述を行います: ALL: 194.82.103.0/255.255.255.0: ALLOW このようなことが起こるのは,大部分の Linux ディストリビューションは NFS 関係デーモンの一部あるいは全てにおいて TCP wrappers を使ってアクセ ス制御を行っているためです./etc/exports の文法は他の UNIX 系 OS と異 なることが多いので注意してください.各 Linux ディストリビューションに 入っている NFS サーバは,他の UNIX に入っている NFS サーバよりも広範囲 に渡るオプションを持っていることがよくあります. KickStart の設定ファイルに root のパスワードが書かれている場合や,機密 情報が入っているディレクトリを NFS でエクスポートする場合には,この情 報を見せる人間をできるだけ少なくすべきである点に注意してください.これ は NFS のエクスポート許可できるだけ絞り込むことによって行うことができ ます.例えば,エクスポートの指定をドメイン全体でなく特定のホストやサブ ネットに対して行う等の方法です.KickStart を使ったインストール用に自由 に使える IP アドレスがあれば,問題もなく簡単に作業できますが,後で IP アドレスを変更するか,あるいは BOOTP/DCHP を使って IP アドレスを使うよ うにマシンの設定を変更しなければならないでしょう. ほとんどの NFS サーバでは /etc/exports を変更したことを mountd と nfsd (一部の UNIX では名前の先頭に "rpc." が付いています)に教えてやる必要が あります.変更の通知は普通,SIGHUP を送ることによって行います.変更の 通知を行うための exportfs と呼ばれるプログラムまたはスクリプトが用意さ れていることもあります.実行例を以下に示します: # exportfs -a このマシンが起動した時に NFS が起動,実行されていなければ,このディレ クトリは自動的にはエクスポートされません.試しに再起動するか,root に なって以下のプログラムを実行してください: # portmap # rpc.nfsd # rpc.mountd 前に書いたように,一部のシステムでは rpc. というプレフィックスは使われ ません.最近の UNIX ディストリビューションのほとんどでは,これらのプロ グラムは /usr/sbin ディレクトリまたは /usr/libexec ディレクトリにあり ます.これらのディレクトリはパスには入っていないかもしれません(su を 使って root になった場合など).portmap プログラムは rpcbind という名前 のこともあります.例えば,Solaris の一部のバージョンの nfsd は実行する サーバの数をコマンドライン引き数で指定しなければならず,biod と呼ばれ る別のデーモンを起動しなければならないこともあります.以上の説明で大部 分(全て?)の Linux システムを満足させられるはずです. CMU 版の BOOTP サーバで DHCP と動的アドレス割り当て拡張(前述)を用いる 場合には,/etc/bootptab エントリ(/etc/bootptab は BOOTP/DHCP 設定ファ イルの通常の位置に置かれます)の例は以下のようになるでしょう: .dynamic-1:ip=198.168.254.128:T254=0x30:T250="ds=198.168.254.2: dn=swedish-chef.org:sm=255.255.255.0:gw=198.168.254.1: dl=0xFFFFFFFF": (見やすくするために行を折り返しています) ここに書かれているのは,新しいマシンを見つける度に IP アドレスを動的に 割り当てること,割り当てるアドレスは 198.168.254.128 から始まる連続し た 48 個(16 進値で 30)のアドレスであることです.各クライアントには T250 の値が返されます.この例では以下のような設定が行われます: o DNS サーバ ds に 198.168.254.2 を設定 o ドメイン名 dn に swedish-chef.org を設定 o サブネットマスク sm に 255.255.255.0 を設定 o デフォルトゲートウェイ gw に 198.168.254.1 を設定 o リース期間 dl (アドレスが有効な期間)に「無期限」を設定 現在使われている CMU 版のサーバには,動的アドレス割り当てをサポートし ていないバージョンもたくさんあるようです.このような場合には,インスト ールするマシンのハードウェアアドレス(通常はイーサネットの MAC アドレ ス) を /etc/bootptab に列挙しなければならないでしょう.このファイル中 でのエントリは以下のようになると思います: bork.swedish-chef.org:ip=198.168.254.128:ha=0000E8188E56: ds=198.168.254.2:dn=swedish-chef.org:sm=255.255.255.0: gw=198.168.254.1:dl=0xFFFFFFFF": (見やすくするために折り返しています) パラメータ ha は,インストール先のマシンのハードウェアアドレスに対応す る点に注意してください. 14. 付録 B - 独自の RPM パッケージの作り方 RPM パッケージのフォーマットは既に非常に詳しく文書化されています.特に Ed Bailey 氏の「Maximum RPM」という書籍が詳しいです.これは RPM WWW site からダウンロードすることができますし,書店 で購入することもできます! 以下は急いでいる人が簡単に利用できるようにす るためのヒントです. RPM パッケージは spec ファイルから作られます.このファイル (KickStart の設定ファイルに似た形式)は,パッケージを構築するために必要な手順のレ シピから構成されています.もしかすると複数プラットフォームに対応するこ とあるかもしれないので,パッケージはソースから構築することが期待されて います.また,コンパイルの前にはパッチを適用する必要があるかもしれませ ん.一度構築とインストールを行うと,パッケージに関連するものとして指定 したファイルとディレクトリからバイナリの RPM ファイルが生成されます. 覚えておくべき重要な点としては,RPM は指定されたパッケージに関連する ファイルとディレクトリについて何も知らないので,これを指定する必要があ ります. Squid WWW キャッシュサーバ の独自 RPM 用のサ ンプル spec ファイルの例を以下に示します: Summary: Squid Web Cache server Name: squid Version: 1.NOVM.22 Release: 1 Copyright: GPL/Harvest Group: Networking/Daemons Source: squid-1.NOVM.22-src.tar.gz Patch: retry-1.NOVM.20.patch %description This is just a first attempt to package up the Squid Web Cache for easy installation on our RedHat Linux servers %prep %setup %build configure --prefix=/usr/squid perl -spi -e 's!#( -DALLOW_HOSTNAME_UNDERSCORES)!$1!' src/Makefile make %install make install %files /usr/squid この RPM の構築方法を示します: % mkdir -p SOURCES BUILD SRPMS RPMS/i386 % cp ~/squid-1.NOVM.22-src.tar.gz SOURCES % cp ~/retry-1.NOVM.20.patch SOURCES % rpm -ba squid-1.NOVM.22+retry-1.spec rpm コマンドは BUILD ディレクトリの下にサブディレクトリを自動的に生成 します.そして rpm コマンドは,このサブディレクトリにソースコードを展 開し,パッチを適用します(パッチの当て方に関するオプションはたくさんあ ります.詳しくは先に挙げた書籍で調べてください).ここで rpm は configure と make を実行して自動的にパッケージを構築し,make install を使ってこれをインストールします.そして /usr/squid の下にあるファイル のスナップショットを取ります.Squid のバイナリ RPM となるのは,このス ナップショットです. 展開,構築,インストールの処理には任意のシェルコマンドを入れることがで きる点に注意してください.例えば,Squid のコンパイル時のパラメータを少 し変えるために perl を呼び出すことができます. 最終的なバイナリ RPM パッケージが RPMS ディレクトリにあるプラットフォ ーム固有のサブディレクトリ i386 に残ります.今回の例ではパッケージは squid-1.NOVM.22-1.i386.rpm という名前になります.ファイル名は spec ファイルのパラメータを繋げて作る点に注意してください.すなわち Name, Version, Release, 該当するハードウェアプラットフォーム(今回の例では i386)です.独自の RPM を作る際には,長すぎて使いものにならない名前を付 けてしまわないように,この点を忘れないようにしましょう. RPM パッケージを構築する際にはパッケージ全体を再構築する必要はないこと も知っておいて損はないでしょう.操作例を以下に示します: Summary: Linux 2.0.36 kernel + filehandle patch + serial console patch Name: linux Version: 2.0.36+filehandle+serial_console Release: 1 Copyright: GPL Group: Base/Kernel Source: linux-2.0.36+filehandle+serial_console.tar.gz %description This is just a first attempt to package up the Linux kernel with patches for installation on our RedHat Linux servers %prep echo %setup echo %build echo %install echo %post /sbin/lilo %files /lib/modules/2.0.36 /boot/vmlinuz この例は単に,/boot/vmlinuz ファイルと /lib/modules/2.0.36 ディレクト リの内容に基づいて RPM パッケージを作成し,対象のマシンにパッケージの インストールを行った後に /sbin/lilo を実行するだけです.これよりもうま い spec ファイルの書き方があれば筆者にお知らせください. 15. 付録 C - 独自の RPM をディストリビューションに入れる Eric さんが作成した,最新の RPM を RedHat ディストリビューションの領域 に入れるためのスクリプトを以下に示します: #!/usr/bin/perl # $redhatdir="/cdrom/i386"; $rpmdir="/cdrom/i386/RedHat/RPMS/"; $updatedir="/cdrom/updates/"; @OTHERDIR=($updatedir); foreach $dir (@OTHERDIR) { print "update for $dir\n"; system(" find $dir -name \"*.rpm\" -exec cp {} $rpmdir \\; "); } chdir($contribdir) || die "peux pas aller dans $contribdir $!\n"; system("chmod -R 755 $redhatdir"); chdir($rpmdir) || die "problem to go in $rpmdir $!\n"; # # remove the old file # opendir(DIR,'.'); @package=grep(/\.rpm$/,readdir(DIR)); foreach $file (@package) { $file =~ /(.*)\-([\d+|\.]+\w*)\-(\d+)\.[i386|noarch].*/; $nom=$1; $version=$2; $buildvers=$3; if ($NOM{$nom}) { $version2=$VERSION{$nom}; $buildver2=$BUILDVERS{$nom}; $file2=$FILE{$nom}; $nom2=$NOM{$nom}; if ( $version2 gt $version ) { print "$file2 is newer than $file\n"; unlink($file); } else { if ( $version2 lt $version ) { print "$file is newer than $file2\n"; unlink($file2); $VERSION{$nom}=$version; $BUILDVERS{$nom}=$buildvers; $FILE{$nom}=$file; $NOM{$nom}=$nom; } else { if ( $buildver2 > $buildvers ) { print "$file2 : $buildver2 est mieux que $file : $buildvers\n"; unlink($file); } else { print "$file2 : $buildver2 is older than $file : $buildvers\n"; unlink($file2); $VERSION{$nom}=$version; $BUILDVERS{$nom}=$buildvers; $FILE{$nom}=$file; $NOM{$nom}=$nom; } } } } else { $VERSION{$nom}=$version; $BUILDVERS{$nom}=$buildvers; $FILE{$nom}=$file; $NOM{$nom}=$nom; } } # we do the hard thing here # system("$redhatdir/misc/src/install/genhdlist $redhatdir");