  RedHat Linux KickStart HOWTO
  Martin Hamilton <martinh@gnu.org>
  v0.2, 11 January 1999
  藤原輝嘉 <fujiwara@linux.or.jp>
  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
  <http://www.gnu.org/copyleft/gpl.html>.

  2.  ホームページ

  本ドキュメントを Linux HOWTO ドキュメントのミラーサイトや CD-ROM から
  入手した場合には，KickStart HOWTO ホームページ
  <http://wwwcache.ja.net/dev/kickstart/> を見て，より新しい版が出ていな
  いかどうかを確認するとよいでしょう．

  3.  日本語訳について

  日本語訳は Linux Japanese FAQ Project が行いました (藤原輝嘉
  <fujiwara@linux.or.jp>(日本語訳)，中野武雄
  <nakano@apm.seikei.ac.jp>(校正))．日本語訳に関する誤りの指摘や，原文の
  作者にフィードバックをしたいけれど英語は苦手だという方は JF プロジェク
  ト(<JF@linux.or.jp>) までご連絡ください．

  原文のライセンスに従いまして，日本語訳の配布ライセンスは GNU General
  Public License <http://www.gnu.org/copyleft/gpl.html>(バージョン 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 サーバ <ftp://ftp.ntplx.net/pub/networking/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 <<EOF >>/etc/passwd
       squid:*:102:3500:Squid Proxy:/usr/squid:/bin/bash
       EOF

       cat <<EOF >>/etc/group
       cache:x:3500:
       EOF

  以下に示す例は，システムの起動スクリプトを修正するものです:

       cat <<EOF >>/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 <<EOF >/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.cpio >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 <http://wwwcache.ja.net/dev/patchup/> を試
  してください．このスクリプトは，システムにインストールされている RPM
  パッケージと候補ディレクトリにある RPM パッケージを比較し，更新の必要
  があると思われるものを報告します．スクリプトを信用して，そのまま RPM
  パッケージをインストールすることもできます．

  A3: rpm2hml <http://rufus.w3.org/linux/rpm2html/> は 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 サイト
  <http://www.dhcp.org/> にある詳しい情報をご覧ください．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 <http://www.rpm.org/> からダウンロードすることができますし，書店
  で購入することもできます! 以下は急いでいる人が簡単に利用できるようにす
  るためのヒントです．

  RPM パッケージは spec ファイルから作られます．このファイル (KickStart
  の設定ファイルに似た形式)は，パッケージを構築するために必要な手順のレ
  シピから構成されています．もしかすると複数プラットフォームに対応するこ
  とあるかもしれないので，パッケージはソースから構築することが期待されて
  います．また，コンパイルの前にはパッチを適用する必要があるかもしれませ
  ん．一度構築とインストールを行うと，パッケージに関連するものとして指定
  したファイルとディレクトリからバイナリの RPM ファイルが生成されます．
  覚えておくべき重要な点としては，RPM は指定されたパッケージに関連する
  ファイルとディレクトリについて何も知らないので，これを指定する必要があ
  ります．

  Squid WWW キャッシュサーバ <http://squid.nlanr.net/> の独自 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");

