オフィシャルサイト: Cobbler

PXEネットワークインストール(Cobbler)

RedHat Enterprise Linux (RHEL) や Fedora Core を、CDを使わずネットワークブートでインストールする方法。これまでは dhcpd, pxe, tftpd, httpd を個別に設定する必要があったが、 Cobbler (コブラー ) というユーティリティパッケージが現れて、かなり簡単に配布サーバを構築できるようになった。なお、Cobbler には、Yum や Up2date 用のローカルレポジトリを作成/更新する機能や、ディスクレスクライアントのイメージサーバを構築する機能もある。ここでも、その片鱗として、クライアントをレスキューモードで立ち上げるための設定も網羅する。

PXEブートの仕組みについてはどんどん他力に頼ってしまう;

※ `cobbler' はあの頭の平たい毒ヘビのことではなく、動詞 cobble 「手早くこさえる」 に -er を付けたものと思われる。cobbler という名詞もあるが、そちらは「靴直し屋」の意。

Table of Contents

Cobblerのインストール

動作に必要なパッケージ

cobbler (サーバ側) は Fedora Core 6 以降および RedHat Enterprise Linux 4 以降で動作する。 cobbler は主として pythonスクリプト群から成る。そのためもちろん python パッケージが必要だが、その他にも以下のパッケージが必要となる。筆者の環境では python言語環境と Apache は既にインストール済みだったため、yum による Cobbler インストール時に依存関係が自動的に解決されるかどうか分からない。

パッケージ名 説明 CobblerのYumインストールで依存解決されるか
httpd Apache。クライアントへのパッケージ配布に使用する。cobbler をインストールすると /etc/httpd/conf.d/cobbler.conf ファイル(中身はalias定義) が追加される
dhcp DHCPサーバ。ネットワークブートの際にクライアントにIPを割り振る ×
python python言語環境
python-cheetah pythonテンプレートエンジン&コードジェネレータ
createrepo Yumのページでも述べたレポジトリメタデータ構築ユーティリティ
yum-utils その他のYumレポジトリ構築ユーティリティ群
tftp-server TFTPサーバ。PXEブート時にクライアントに初期ブートイメージを送る
xinetd inetd。tftpd が inetd経由起動であるため必要となる

この他に、ローカルネットワークの名前解決のできる DNSサーバも立てておくほうがいい。BIND でなければならない理由はなく、djbdns をお勧めする。DNSサーバは cobbler サーバとは別のマシンで稼働させても構わない。立てるのが面倒なら、以降で出てくる FQDN パラメータを全て IP で指定すればなんとかなる。

Cobblerのインストール (Fedora Core 6 以降)

Fedora Core 6 以降では、 cobbler 自体を Yum でインストールすればほとんどのものは依存関係によって自動的にインストールされる (上のの通り)。 extrasレポジトリを有効にしてから `yum install cobbler' で一発だ。

Cobblerのインストール (RHEL/CentOS 5 以降)

EPEL から Yum でインストールする。レポジトリ定義は、EPEL の FTPサイトから epel-release-x-x.noarch.rpm をダウンロードしてインストールすればセットされる。

Cobblerのインストール (RHEL4 の場合)

RHEL4 では httpd, dhcp, python, xinetd 以外が純正パッケージとしては提供されていないため、個別に入手/インストールする必要がある。 Cobbler 以外は、pythonrpm-libs のバージョンに依存するので、新しければいいというものでなく、下記のバージョンを使用しなければならない。 yum は 2.4.x を使用するものとする。

パッケージ 入手先等
yum Yum解説ページの「RHEL4へのインストール」を参照して必要な依存パッケージとともにインストール。
yum-utils-0.3.*-*.src.rpm Linux@DUKE
createrepo-0.4.4-*.src.rpm Linux@DUKE、または EPEL (Extra packages for Enterprise Linux)
python-cheetah-2.0.*-*.el4.src.rpm EPEL のサイトからソースRPMをダウンロード。Cheetah のオフィシャルサイトはこちら
python-setuptools-0.6*-*.el4.noarch.rpm cobbler をコンパイルするのに必要。EPEL のサイトからダウンロード。
cobbler-1.4.*-*.src.rpm EPEL のサイトからソースRPMをダウンロード。

ソースRPMは、

rpmbuild --rebuild xxxx.src.rpm

でビルドするが、rpmbuild 全般のことについては RPMの解説ページ を参照。python-cheetah は、基本的には python コードなのでソースからコンパイルする意味はあまりないかと最初思ったが、一部 C言語の部分 (NameMapper) があるので、当該のプラットフォーム上でビルドしたほうがいい。大まかな手順を述べる;

  1. yum をインストール。
  2. yum-utils をビルドしてインストール。
  3. createrepo, python-cheetah をビルド。
  4. createrepo, python-cheetah, python-setuptools をインストール。
  5. cobbler をビルドしてインストール。

この他に syslinux-2.11 以降のパーツが必要だが、それについては具体的な構築手順の中で触れる

配布サーバの構築

筆者が Fedora Core 6 および RHEL4.5 上で RHEL5 と RHEL4ES のネットワークインストール環境を整備した経験に基づいて、手順を示す。以下は、パッケージをクライアントに HTTP で取得させる場合だ。 `cobbler import' のやり方を変えれば NFS で取得させることも可能なようだが筆者はまだ試したことがない。

Cobblerサイトの構築

1. 環境チェック

不備な点を cobbler に判定してもらい、知っておく;

root# cobbler check

2. tftpサーバを有効にする

/etc/xinetd.d/tftp を編集し、`disable = Yes' という行を削除した後、

root# service xinetd restart

3. dhcpd設定ファイルのバックアップ

後述する cobbler の設定により上書きされてしまうので、現状の /etc/dhcpd.conf ファイルを念のためバックアップしておく。

4. cobbler設定ファイルの修正

/etc/cobbler/settings を開き、以下の定義を修正する。それ以外の箇所は通常いじる必要はない。 manage_dhcp を 1 にしておくと、 `cobbler sync' を行う度に /etc/dhcpd.conf が自動的に設定され dhcpd の再起動が行われるようになる。

manage_dhcp: 1
next_server: <DHCPサーバで通知するTFTPサーバのIP、当例の場合は配布サーバと同一つまり自分のIPアドレス>
server: <配布サーバのIPまはFQDN、つまり当例の場合は同上>

加えて、dhcpd.conf が適切に設定されるよう、cobbler の使用するテンプレートファイルを修正しておく。テンプレート類は /etc/cobbler/ にあり、dhcpd.conf のテンプレートファイルは dhcp.template。以下の部分を変更 (ない行は挿入) する;

option routers             <default_gateway>;
option domain-name         "my-domain.com";
option domain-name-servers   <DNS_server>;

routersdomain-name はそれぞれ、クライアントへのDHCPパラメータ払い出し時に伝達されるデフォルトゲートウェイとドメイン名(ドメインサフィックス)。 domain-name-servers はあなたのローカルネットワークの名前解決のできる DNSサーバの IP。DNSサーバなしで済ます場合は domain-namedomain-name-servers の記述は不要。

ブートサーバが RHEL4 の場合は、 syslinux のバージョンが古すぎてネットワークブートに失敗するので、新しい syslinux イメージを入手しなければならない。単純に syslinux-2.11 以上のインストールされた Linux マシンから /usr/lib/syslinux/pxelinux.0 を取ってきて、ブートサーバの /usr/lib/syslinux/ に置けばよい。この時、 pxelinux.1 と名前を変えて配置すれば標準のものと同居させることができる。取ってくる当てがない時は、DAG WIEERS.com 等から syslinux-3.50.x あたりの RPMパッケージをダウンロードし、 file-roller (書庫マネージャ) で pxelinux.0 だけ取り出して同様にコピーすればいいだろう。新しい syslinux ブートイメージを置いたら、settings ファイルとdhcp.template のファイルの下記の部分を書き換える。

settings :

    standard: /usr/lib/syslinux/pxelinux.1

dhcp.template :

    filename    "/pxelinux.1";

5. 配布するOSのブートカーネルおよびinitrdイメージのコピー

後述の `cobbler import ...' で CD からコピーする場合には、その際に以下の行程 5, 6, 7 と同様のことが自動的に行われるので、いきなり 8. CDコンテンツのコピー まで飛ばすことができる。Cobbler 恐るべし。

インストールCDの 1枚目またはDVD (レスキュー専用の場合は後述のCDコンテンツのコピー・レスキュー版を参照) の /images/pxeboot/ にある vmlinuzinitrd.imgtftp公開ディレクトリへコピーする。tftpサーバの公開ディレクトリは通常 /tftpboot/ だが、不確かな場合は /etc/xinetd.d/tftp ファイルを見れば分かる。 server_args パラメータの -s オプションで指定されたディレクトリがそれだ。下記コマンド例の rhel5 というディレクトリ名は任意。

root# cd /tftpboot
root# mkdir rhel5
root# cp /PATH/TO/vmlinuz /PATH/TO/initrd.img  rhel5

6. 配布ディストリビューション定義の登録

ページ体裁の都合上複数行に分けたが本当はひとつのコマンド。 --kernel= --initrd= のパラメータは行程5.でコピーしたカーネルイメージと initrdイメージのフルパス。

root# cobbler distro add --name=rhel5 \
 --kernel=/tftpboot/rhel5/vmlinuz --initrd=/tftpboot/rhel5/initrd.img

念のため、ここで一度 sync させておく;

root# cobbler sync

7. プロファイルの登録

プロファイルは、後述する system名と前述のディストリビューション定義とを結びつける役割をする。下記の --distro= には先ほど行程6.の `distro add --name=' で指定したものを指定する。後述の「起動パラメータのカスタマイズ」の段取りをここで済ませておくことも可能で、その場合は引数に --kickstart=... や kopts=... も加える。 Rescueモード用の kickstartファイルの内容については「起動パラメータのカスタマイズ」を見ていただきたい。

基本形
root# cobbler profile add --name=rhel5servers --distro=rhel5
kickstartファイルも指定する場合
root# cobbler profile add --name=rhel5servers --distro=rhel5 \
  --kickstart=/etc/cobbler/<ks_file>
Rescueモード用プロファイルの場合
root# cobbler profile add --name=rhel5rescue --distro=rhel5 \
  --kickstart=/etc/cobbler/<rescue_ks_file> --kopts="rescue"

8. CDコンテンツのコピー

`cobbler import' コマンドを使って、インストールCDの内容を Apache のドキュメントルートディレクトリ下へコピーする。

インストール用の場合

インストール媒体が DVD 1枚だけの場合はマウントしてコマンドするだけで済むが、RHEL4 のように複数枚構成の CD としてしか提供されていない場合は、全 CD の中身を一旦ひとつに統合してからでないと作業できない (内容が一部重複しているため)。後者の場合で、ISOイメージを媒体に焼かずに行う手順を示す。

root# mkdir /tmp/rhel5cd
root# mount -o loop -t iso9660 /PATH/TO/ISO_IMG1 /media/cdrom
root# shopt -s dotglob (解説: ドットから始まるファイルも * でヒットするようにするBASHシェルオプションを有効化)
root# unalias cp (cp のコマンドエイリアスが `cp -i' になっているといちいち上書き確認が出るのでエイリアスを取り消す)
root# cp -rf /media/cdrom/* /tmp/rhel5cd
root# umount /media/cdrom
root# mount -o loop -t iso9660 /PATH/TO/ISO_IMG2 /media/cdrom
root# cp -rf /media/cdrom/* /tmp/rhel5cd
root# umount /media/cdrom (最後の 3行を以下同様にインストールCD枚数分繰り返す)

さて、これでやっと本命のコマンドが打てる。行程 5, 6, 7 を手動でやってきた人は、下記で --name= に指定するのは distro として定義した名前。行程5. から飛んできた人は、ここで勝手に決めればよい。下記の例の場合、 /tmp/rhel5cd/ 下の内容物が /var/www/cobbler/ks_mirror/rhel5/ へシンクロされるとともに、distro 及び profile が自動的に登録され、各種必要ファイルが /var/www/cobbler/ 下の所定のディレクトリに作られる。また、 yum-utils のコマンド類や createrepo コマンドが呼ばれて、配布に必要なメタデータも生成される。シンクロが終わったら一時書き出しに使った /tmp/rhel5cd は削除しても構わない。

root# cobbler import --path=/tmp/rhel5cd --name=rhel5
root# cobbler sync
root# cobbler report

行程 5. からジャンプしてきた人は、上記 report コマンドで、どういう設定 (特に profile) ができたかをよく見極め、行程 9. へ。

レスキュー用の場合

レスキューブートだけが目的なら、インストール媒体の 1枚目だけ import すればいい。もっと節約したいと思うのなら、 rescuecd.img だけをダウンロードしてきて import してやれば 100MB 程度で済む。 Fedora Core 7 (FC7) i386 のレスキューCD ISOイメージで検証した手順を示す。

Fedora Project のダウンロードサイトから入手するファイル:

上記 initrd.imgvmlinuz前述したように /tftpboot/fc7/ へコピーしておく。 minstg2.img は、レスキューCD やインストールCD を `text' 付きでブートした際に展開される小型版 OS イメージであり、レスキューCDイメージには欠けているので念のため用意しておく (Fedora Core 6 からそういう仕組みになった)。そして、

root# mount -o loop /PATH/TO/F-7-i386-resuecd.iso /media/cdrom
root# mkdir /var/fc7iso   <--このパスは任意
root# cp -dR /media/cdrom/* /var/fc7iso
root# cp /PATH/TO/minstg2.img /var/fc7iso/images/
root# cobbler import --path=/var/fc7iso --name=<distroで指定した名前>
root# cobbler sync
root# cobbler report

行程 5. からジャンプしてきた人は、上記 report コマンドで、どういう設定 (特に profile) ができたか覚えておき、行程 9. へ。

9. クライアントシステム定義の登録

system は、各々のクライアントの IP (あるいはホスト名か MACアドレス) とプロファイルとの対応を定義するアクション。RHEL4 と RHEL5 など複数のディストリビューションを配布したい場合と、ひとつだけ配布する場合とに分けて説明しよう。

単一systemの場合

ひとつのディストリビューションしか配布しない場合には、default というシステムを定義するだけでいい。最近の Cobbler では、import さえ行えばこの default システム登録作業さえ不要だ。--profile= に指定するのは行程7.で `profile add --name=' に指定した名前。

root# cobbler system add --name=default --profile=rhel5servers
root# cobbler sync
マルチsystemの場合

定義手法は幾つかあるようだが、あり得ない MACアドレス を --name= に指定するのが一番手っ取り早い。

root# cobbler system add --name=00:00:00:00:00:01 --profile=<profile_name>
root# cobbler system add --name=00:00:00:00:00:02 --profile=<another_profile_name>
root# cobbler sync

このようにすると、--name= で指定した各々の識別名 (この場合は MACアドレス) に対して PXEパラメータファイル /tftpboot/pxelinux.cfg/01-<name> が作成されるとともに、default システム定義も生成される。この場合の default は各 system 定義を寄せ集めたものとなり、クライアントの MACアドレスがいずれの識別名にも一致しなかった場合のメニューとして機能し、その中から希望のシステムをセレクトできるようになる。 --name= で指定した MACアドレスがクライアントの MACアドレスと一致する場合には、PXEブートメニューは出ずに、関連づけられた profile を使ってブートが始まる。

10. 定義の確認

定義がうまくいっているか確認;

root# cobbler report

起動パラメータとKickStartファイルのカスタマイズ

パッケージの取得先やパッケージリストなどを自動セットする

ここまでで出来上がった設定では、勝手に自動パーティション構成されて最小限のパッケージがインストールされてしまう (最近の Cobbler) ため、キックスタートの整備/調整を用意しなければならない。RHEL4 用など古い Cobbler の場合はブートパラメータに空のキックスタートファイルが指定されているので調整しなくても害はないが、何台もインストールする場合はやっておいたほうが便利だ。

最近のCobblerの場合

最近の Cobbler では、python のテンプレートエンジン Cheetah を使ったテンプレーティングが進んでおり、各 profile にはデフォルトで sample.ks というキックスタートテンプレートが結びつけられている。テンプレートというのは、Python Cheetah の変数を使って書いたキックスタートファイルのことで、Cobbler が実行時にセットする変数 (例えば profile名) を拾って内容を動的に変化させることができるので、profile 毎/system 毎に個別のキックスタートファイルを作ることなく、少数のキックスタートテンプレートで幅広い profile/system のインストールパターンに対応できるというものだ。私も深く理解しているわけではないので、詳しくは Cobbler-Trac の Kickstart Templating (あるいは Cafe Chantant Blog さんによる日本語訳) を読んでいただきたい。

では本題。自前のキックスタートテンプレートを作るには、デフォルトで使用されている sample.ks を雛形にさせてもらうと便利だ。例えば、standard.ks というコピーを作る;

root# cd /var/lib/cobbler/kickstarts
root# cp -p sample.ks standard.ks

ファイルの序盤はほぼ通常のキックスタートファイルそのものなので、要件に応じて各パラメータを書き換えればよい (キックスタートについては当方の解説ページもどうぞ)。ただし、表記上の注意が少々ある;

インストールするパッケージをカスタマイズしたい場合、ちょっとしたトリックがある。sample.ks では %packages セクションが

%packages
$SNIPPET('func_install_if_enabled')

とだけ書かれている。これはスニペットという仕組みで、上記の $SNIPPET は、/var/lib/cobbler/snippets/ にある func_install_if_enabled というファイルに書かれたコードを読み込む。実は、この %packages セクションをカスタマイズするには、standard.ks 自体の %packcages セクションの書き換えはおろか、func_install_if_enabled ファイルの書き換えさえ必要ない。例えば、rhel5servers という profile 用のパッケージリストを定義したければ、下記のようにする;

root# cd /var/lib/cobbler/kickstarts
root# mkdir -p per_profile/func_install_if_enabled
root# touch rhel5servers

この /var/lib/cobbler/kickstarts/per_profile/<snippet_name>/<profile_name> ファイルに

@development-libs
@editors
emacs
...

といった具合にキックスタートファイル書式のパッケージリストを書くのだ。勘のいい人なら予想できたと思うが、固有の system に対する代替 func_install_if_enabled をこさえたければ、
/var/lib/cobbler/kickstarts/per_system/<snippet_name>/<system_name> ファイルにパッケージリストを書けばいいわけだ。対system よりも対profile の方が優先度が高い (より個別具体的なインストール先優先の法則)。

以上の準備が整ったら、Cobbler 上の rhel5servers プロファイルに standard.ks を関連づける;

root# cobbler profile edit --name=rhel5servers \
  --kickstart=/var/lib/cobbler/kickstarts/standard.ks
root# cobbler sync  <--念のため
RHEL4 用など古いCobblerの場合

/etc/cobbler/kickstart_<profile_name>.ks (ファイル名は任意) を作成し、KickStartパラメータを書いておく。例えば、プロファイル rhel5servers について最低限インストールソースの取得先をプリセットしておきたいとすれば、 kickstart_rhel5servers.ks ファイルに次の内容を含める (/cblr/ というパスについては後述);

install
url --url http://<配布サーバのIPまたはFQDN>/cblr/ks_mirror/rhel5

レスキューモード用 kickstartファイルの場合は下記の内容だけ書いておけばよい;

lang ja_JP.UTF-8
keyboard jp106
mouse none
url --url http://<配布サーバのIPまたはFQDN>/cblr/ks_mirror/rhel5

書き終わったら、プロファイルを修正するために下記のようにコマンドする;

root# cobbler profile edit --name=rhel5servers \
  --kickstart=/etc/cobbler/kickstart_rhel5servers.ks
root# cobbler sync

すると面白いことが起こる。ここで --kickstart= で指定したファイルが、 Apache によるファイル配布元である /var/www/cobbler/ 下の、 kickstarts/<profile_name>/ks.cfg および kickstarts_sys/<system_name>/ks.cfg へコピーされるのだ。前述の pxelinux.cfg/<system_name> は変わらないまま。その後 kickstart_<profile_name>.ks を修正した際には `cobbler sync' だけ行えばいい。

インストーラをグラフィカルモードで立ち上げたい

最近のCobblerの場合

settings ファイルの kernel_options: (カーネルオプションつまり、通常のインストーラで boot: プロンプトに入れるパラメータ) に書かれている text オプションを、グラフィカルモードにしたい対象の profile あるいは system の登録情報で打ち消すことができる。Cobbler では、より個別具体的なインストール先の方が優先度が高いので、profile に対して設定すればその profile を利用している system は全て影響を受けるし、或る system に対してだけ設定すればその情報が上位の profile の設定をオーバーライドする。例えば、rhel5servers というプロファイルで text モードを打ち消すには、下記のようにコマンドする。

root# cobbler profile edit --name=rhel5servers --kopts="\!text"

ちなみに、カーネルオプションを複数与えたい場合には、--kopts="foo=bar nonet \!text" といった具合にスペース区切りで書く。

RHEL4 用など古いCobblerの場合

※ 前記の「最近のCobblerの場合」のやり方は最近発見した。古い Cobbler でも同じ方法が通用するのかもしれないが、既に検証環境がない。下記の方法を試す前にまずそちらを試してみていただきたい。可能ならその方がスマートだ。

どのプロファイルでも常にインストーラをグラフィカルモードで走らせるには settings ファイルの kernel_options: に書かれている text:~ 行を取り除いておく。その上で、例外的にテキストモードを強制したいプロファイルがある場合には、`cobbler profile add' の際に --kopts="text" を指定すれば、そのプロファイルの PXEブートパラメータファイルには text が挿入される。

一方、規定値はテキストモードのままにしておいて特定のプロファイルのみグラフィカルモードにしたい場合は、当該のプロファイルの PXEブートパラメータファイル /tftpboot/pxelinux.cfg/<system_name> を直接編集して、下記の赤字部分を取り除く。マルチシステム構成にした場合は、同ディレクトリの default に書かれている該当システムの定義からも `text' を取り除かなければならない。ただし、 `cobbler sync' を行う度に元に戻ってしまうので、こちらの方法はあまりお勧めでない。

default linux
prompt 0
timeout 1
label linux
    kernel /images/rhel5/vmlinuz
    append append ksdevice=eth0 lang= syslog=<cobbler_sv>:25150 text initrd=/images/rhel5/initrd.img ks=http://<cobbler_sv>/cblr/kickstart_sys/default/ks.cfg

その他デーモンの起動

Apache

まず、これまでの `cobbler sync' によって自動生成された /etc/httpd/conf.d/cobbler.conf の内容が正当であることを確認しよう。また、メイン設定ファイル /etc/httpd/conf/httpd.conf (こちらは cobbler による変更は受けない) も確認して、 cobbler.conf のディレクティブを阻害するような設定があれば調整しておかなければならない。内容が整ったら Apache を(再)起動しておく。

dhcpd, tftpd

これらは既に起動しているはずだ。でなければ(再)起動させておく。 dhcpd は rc起動、tftp は xinetd起動であることをお忘れなく。

DNSサーバ

配布サーバと同一マシン上であれ別マシン上であれ、とにかく DNSサーバが稼働していてローカルネットワークの名前解決ができることを確認しておく。

余分なDHCPサーバの停止

ルータや他のサーバで DHCPサーバ機能が有効になっていないか確認し、必要ならばそれらの機能を停止しておく。無理なら配布用のLANを周囲から切り離すしかないかもしれない。

ネットワークインストールの実行(クライアント)

まず、クライアントのPXEブートを可能にする。メーカー、機種によってやり方はまちまちだが、たいていは、BIOS でネットワークブートを有効にした上でそのブート順位を上げるか、電源投入時に F12 キーを押しっぱなしにするか、その両方であることが多い。

マルチシステム構成にした場合で、なお且つクライアントの MACアドレスがどの system とも一致しない時には、PXEブートプロンプト boot: でポーズとなる。タイムアウト制限内に、希望の system識別名を直接タイプするか、 menu とタイプして一覧から選択すれば、関連づけられた profile のカーネルでブートする。単一システムの場合か MACアドレスが一致する場合には、PXEブートプロンプトはスキップされる。そうして Anacondaインストーラが起動する。

起動パラメータのカスタマイズ をしていない場合は、`Installation Method' の画面へ来たら HTTP を選択し、その次の `HTTP Setup' 画面で Web site name: に配布サーバの IP (または FQDN) を入力。 Server directory には、当ページの例であれば下記のいずれかをタイプする;

/cblr//etc/httpd/conf.d/cobbler.conf で定義されている Apache上の alias で、実ファイルシステム上の /var/www/cobbler/ を指している。 links/ には各 distro のアーキテクチャフォルダへの (ファイルシステム上の) シンボリックリンクが置かれている。 /etc/httpd/conf.d/cobbler.confFollowSymLinks が設定されているので、上記の URL はどちらも、結果的に実ファイルシステムの /var/www/cobbler/ks_mirror/rhel5 を参照することになる。