Gentooを用いたディスクレスノード
1.
導入
このHOWTOについて
このHOWTOは、Gentoo Linuxディストリビューションを元にディスクレスワークステーションをセットアップする手助けをします。
できるだけユーザーフレンドリーに、そして、Linux初心者にも理解できるように説明していきます。
わたしたちの誰もが、ある時点では初心者だったのですから :)。
経験豊富なユーザーは、ディスクレスノード、ネットワークに関する複数のHOWTOを容易に結びつけることが可能かもしれません。
それに関心のあるユーザーすべてが、たとえ知識があると無かろうと、このガイドによって簡単に導入できればよいと思います。
ディスクレスマシンとは何か?
ディスクレスマシンとは、ハードディスク、フロッピードライブ、CD-ROMドライブ等のような、通常起動可能ないかなる装置も持たないPCのことです。
ディスクレスノードは、ネットワークから起動し、ローカルハードディスクが提供していたような保存場所を提供するサーバーが必要です。
今から、このサーバーのことをマスターと呼ぶことにします。それに対し、ディスクレスマシンの方は、スレーブ(名前が何だと言うのだ? 訳注:コンピュータ関連では割とよく用いられるマスター/スレーブという言葉は、人種差別的な良くない言葉なのでそれを考慮してのこと)とします。
スレーブノードは、PXEブート可能なネットワークアダプタが必要です(訳注:PXEとは、intel提唱するPreboot Execution Environmentのことで使用方法等は後述されています。また、PXE以外にもgrubやetherboot等を使うことによってディスクレス環境を構築することができる場合もあります。)。
ほとんどの最近のカードは、PXEをサポートしていますし、多くのマザーボード組み込みのアダプタも動作するでしょう。
はじめる前に
Gentooがマスターノードにインストールされていなければなりません。また、スレーブノードのファイルシステムを記録しておくのに十分な空き容量がマスターに必要です。
2.
マスターとスレーブの設定
カーネルについて
注意:
もし、あなたのノードをopenMosixクラスターにしようとしているなら、
カーネルにopenMosixパッチが当たっているか確認してください。
それは、portageのsys-kernel/openmosix-sourcesにあります。
また、openMosix用のカーネルをコンパイルする方法を知るために、openMosix HOWTOを読むべきです。
|
カーネルとは、ハードウェアとマシン上で起動される他のあらゆるソフトウェアとの間に存在するものであり、
本質的に、カーネルベースのOSの中心となるものです。
コンピュータが起動するとき、BIOSはハードディスクの予約されたブート領域に"指示"を見つけ出し、これを実行します。
この"指示"とは、典型的には、カーネルを起動するブートローダーです。
カーネルが起動した後、カーネルによってすべてのプロセスが処理されます。
カーネルやカーネルの設定についてもっと情報が欲しい場合、カーネルHOWTOを見てください。
マスター用カーネルの設定
マスター用カーネルは、望みのサイズにすることができますが、選択しておかなければならないオプションがいくつか有ります。
次のように打ち込んでカーネル設定メニューに入りましょう:
コード表示 2.1: マスター用カーネルの設定編集 |
# cd /usr/src/linux
# make menuconfig
|
/usr/src/linux/.configを手作業で編集する代わりに、
安全に編集できるグレーとブルーのGUIのメニューが出てきたと思います。
もし、あなたのカーネルが現在正常に機能しているのなら、現在の設定をファイルに保存するためにGUIを抜けて、次のように打ち込んでください。
コード表示 2.2: マスター用カーネルの設定をバックアップ |
# cp .config .config_working
|
次のサブメニューに進んで、列挙した項目が(モジュールとしてではなく)ビルトイン(訳注:カーネルに組み込み)として選択されているか確認してください。
次に示すオプションは、カーネルバージョン2.4.22のものです。
もし、違うバージョンを使う場合、文字列や順序が異なるかもしれません。
少なくとも下に示したものだけは、確実に選択してください。
コード表示 2.3: マスター用カーネルのオプション |
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
Networking options --->
<*> Packet socket
[ ] Packet socket: mmapped IO
< > Netlink device emulation
[ ] Network packet filtering (replaces ipchains)
[ ] Socket Filtering
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
File systems --->
[*] /proc file system support
[*] /dev file system support (EXPERIMENTAL)
[*] Automatically mount at boot
Network File Systems --->
<*> NFS server support
[*] Provide NFSv3 server support
|
注意:
カーネル設定オプションは、あなたのシステムの設定オプションに、単に追加するべきで、完全に置き換えるという意味ではありません。
|
マスター用カーネルを再設定したら、再コンパイルします:
コード表示 2.4: マスター用カーネルとモジュールの再コンパイル |
# make dep
# make clean bzImage modules modules_install
# cp arch/i386/boot/bzImage /boot/bzImage-master
# cp System.map /boot/System.map-master
|
次に、新しいカーネルに対するエントリをlilo.conf、または、grub.confに追加し、新しいカーネルをデフォルトで起動するエントリにします。
どちらに追加するかは、どちらのブートローダーを使っているのかによります。
bootディレクトリに新しいbzImageをコピーしてしまったので、後は、これらの新しいオプションを有効にする為にシステムを再起動するだけです。
スレーブ用カーネルについて
スレーブ用カーネルは、モジュール無しにコンパイルすることをお薦めします。
というのは、モジュールをリモート起動でロードし、設定するのは難しく、必要がない処理だからです。
さらに、スレーブ用カーネルは、ネットワークから効率よく起動できようにできるだけ小さく、コンパクトにすべきです。
わたしたちは、スレーブ用カーネルをマスターを設定したのと同じ場所でコンパイルすることにします。
混乱を避け、時間を浪費しない為に、マスターの設定ファイルをバックアップしておくのはいい考えです。
コード表示 2.5: マスター用カーネルの設定バックアップ |
# cp /usr/src/linux/.config /usr/src/linux/.config_master
|
それでは、マスター用カーネルを設定したのと同じようにしてスレーブ用カーネルを設定します。
もし、まっさらな設定ファイルからはじめたいのなら、次のように打ち込むことで、/usr/src/linux/.configファイルをデフォルトに戻すことができます:
コード表示 2.6: カーネル設定を白紙に戻す |
# cd /usr/src/linux
# make mrproper
|
GUIの設定画面に進みます:
コード表示 2.7: スレーブ用カーネルの設定編集 |
# cd /usr/src/linux
# make menuconfig
|
次のオプションが、モジュールではなく、ビルトインで選択されていることを確認してください。
コード表示 2.8: スレーブのカーネルオプション |
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
Networking options --->
<*> Packet socket
[ ] Packet socket: mmapped IO
< > Netlink device emulation
[ ] Network packet filtering (replaces ipchains)
[ ] Socket Filtering
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support (NEW)
File systems --->
[*] /proc file system support
[*] /dev file system support (EXPERIMENTAL)
[*] Automatically mount at boot
Network File Systems --->
<*> file system support
[*] Provide NFSv3 client support
[*] Root file system on NFS
|
それでは、スレーブ用カーネルをコンパイルしましょう。(もしあればですが)マスターに対して構築したモジュールを台無しにしたくないでしょうから、ここで慎重になる必要があります:
コード表示 2.9: スレーブ用カーネルのコンパイル |
# cd /usr/src/linux
# make clean dep bzImage
|
さて、スレーブのファイルを保存しておくのに使われるディレクトリをマスター上に作成しましょう。
わたしたちは、/disklessを使うことにしますが、どこでも好きな場所にすることができます。
それでは、スレーブのbzImageを/disklessにコピーします:
コード表示 2.10: スレーブ用カーネルのコピー |
# mkdir /diskless
# cp /usr/src/linux/arch/i386/boot/bzImage /diskless
|
最初のスレーブのファイルシステムの設定
マスターとスレーブのファイルシステムは、大きく違った設定に変更されていてもかまいません。
私達は、今のところ、適切なファイルとマウントポイントを持った予備の(訳注:スレーブの)ファイルシステムを用意することにだけ関心があります。
まずはじめに、/disklessの中に最初のスレーブ用のディレクトリを作る必要があります。
ある種のシステムファイルを共有することは、パーミッションの問題やシステムクラッシュの原因となるので、
それぞれのスレーブに対して、別々のルートファイルシステムが必要です。
これらのディレクトリには好きな名前をつけることができますが、ユニークで混乱がない為、スレーブのIPアドレスを使うことを提案します。
最初のスレーブの静的IPアドレスは、例えば、192.168.1.21とします:
コード表示 2.11: リモートルートディレクトリの作成 |
# mkdir /diskless/192.168.1.21
|
/etcにある様々な設定ファイルを、スレーブ上で動作するように変更してやる必要があります。
マスターの/etcディレクトリを新しいスレーブのルートにコピーします:
コード表示 2.12: スレーブファイルシステム用の/etcの作成 |
# cp -r /etc /diskless/192.168.1.21/etc
|
まだファイルシステムは準備できていません。様々なマウントポイントやディレクトリが必要です。
それらを作るには:
コード表示 2.13: スレーブファイルシステムのマウントポイントやディレクトリの作成 |
# mkdir /diskless/192.168.1.21/home
# mkdir /diskless/192.168.1.21/dev
# mkdir /diskless/192.168.1.21/proc
# mkdir /diskless/192.168.1.21/tmp
# mkdir /diskless/192.168.1.21/mnt
# mkdir /diskless/192.168.1.21/mnt/.initd
# mkdir /diskless/192.168.1.21/root
# mkdir /diskless/192.168.1.21/var
# mkdir /diskless/192.168.1.21/var/empty
# mkdir /diskless/192.168.1.21/var/lock
# mkdir /diskless/192.168.1.21/var/log
# mkdir /diskless/192.168.1.21/var/run
# mkdir /diskless/192.168.1.21/mfs
|
ほとんどのディレクトリは理解できるでしょう。
/devや/procのようなディレクトリは、スレーブが起動するときに使用され、
その他のディレクトリは、その後でマウントされます。
また、スレーブのホスト名が反映されるように、/diskless/192.168.1.21/etc/hostnameファイルを変更した方がよいでしょう。
バイナリやライブラリ、その他のファイルは、このHOWTOの後の方、スレーブを起動する直前に用意します。
3.
DHCPサーバーの設定
DHCPサーバーについて
DHCPとは、Dynamic Host Configuration Procotol(動的ホスト設定プロトコル)の略です。
DHCPサーバーは、スレーブがPXEブートで、最初に通信するコンピュータです。
DHCPサーバーの主な目的は、IPアドレスを割り当てることです。
DHCPサーバーは、MACアドレスに基づいてIPアドレスを割り当てることができます。
スレーブがIPアドレスを取得したら、DHCPサーバーはスレーブに起動時のファイルシステムとカーネルをどこから取得すればよいのかを教えます。
はじめる前に
始める前に、いくつか確認しておかなければならないことがあります。
ネットワーク接続を次のように打ち込んで確認します:
コード表示 3.1: ネットワーク設定の確認 |
# ifconfig eth0 enable multicast
# ifconfig -a
|
eth0デバイスの稼動状況を確認してください。次のようにな感じに見えると思います:
コード表示 3.2: 正常動作のeth0デバイス |
eth0 Link encap:Ethernet HWaddr 00:E0:83:16:2F:D6
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:26460491 errors:0 dropped:0 overruns:2 frame:0
TX packets:32903198 errors:0 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:100
RX bytes:2483502568 (2368.4 Mb) TX bytes:1411984950 (1346.5 Mb)
Interrupt:18 Base address:0x1800
|
MULTICASTの項目が重要です。
もし、この項目が現れないなら、マルチキャストサポートを含めてカーネルを再コンパイルする必要があります。
DHCPサーバーのインストール
もしまだDHCPサーバーをインストールしていないなら、次のように打ち込んでインストールする必要があります:
コード表示 3.3: DHCPサーバーのインストール |
# emerge dhcp
|
もし、DHCPサーバーのインストールが済んでいるなら、PXEブートが正しく機能するように設定ファイルを編集します。
DHCPサーバーの設定
DHCPサーバーを起動する前に編集しなければならないファイルは一つだけです:/etc/dhcp/dhcpd.conf。
サンプルファイルをコピーして編集します:
コード表示 3.4: DHCPサーバーの設定ファイル編集 |
# cp /etc/dhcp/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
# nano -w /etc/dhcp/dhcpd.conf
|
この設定ファイル内の全般的なレイアウトとしては、階層的に設定を書いていきます。次のような感じです:
コード表示 3.5: dhcpd.confのレイアウト例 |
ddns-update-style none;
shared-network LOCAL-NET {
subnet 192.168.1.0 netmask 255.255.255.0 {
host slave{
}
group {
}
}
}
|
shared-network宣言の記述は任意で、同じネットワークトポロジーに属する割り当てたいIPアドレスに使用されます。
少なくとも、一つのsubnetは宣言されていなければなりません。
group宣言は、複数の宣言にオプションをまとめて適用できるようにするものです。
dhcpd.confの例は次の様な感じになるでしょう:
コード表示 3.6: dhcpd.confの例 |
# DHCP configuration file for DHCP ISC 3.0
ddns-update-style none;
# PXE特有の定義
# Code 1: ブートファイルサーバーのマルチキャストIPアドレス
# Code 2: クライアントがMTFTP応答に対して監視するUDPポート
# Code 3: MTFTPサーバーがMTFTP要求を待ち受けるUDPポート
# Code 4: 新規MTFTP転送を開始しようとする前に、クライアントが待機する秒数
# Code 5: MTFTP転送を再開しようとする前に、クライアントが待機する秒数
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;
subnet 192.168.1.0 netmask 255.255.255.0 {
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
option vendor-class-identifier "PXEClient";
vendor-option-space PXE;
# クライアント起動ROMが、PXE準拠のサーバーであると認識できるように、
# 少なくともひとつのベンダー特有のPXEオプションが設定されていなければなりません。
# 起動ROMにマルチキャストTFTPを提供しないようにする為に、
# マルチキャストIPアドレスを0.0.0.0に設定しています。
# (0.0.0.0というアドレスは、アドレス設定無しという意味です。)
option PXE.mtftp-ip 0.0.0.0;
# ここには、起動ROMがダウンロードするファイルの名前を指定します。
filename "pxelinux.0";
# それを取得するサーバーの名前をここに書きます。
next-server 192.168.1.1;
}
pool {
max-lease-time 86400;
default-lease-time 86400;
deny unknown clients;
}
host slave21 {
hardware ethernet 00:40:63:C2:CA:C9;
fixed-address 192.168.1.21;
server-name "master";
option routers 192.168.1.1;
option domain-name-servers 192.168.1.1;
option domain-name "mydomain.com";
option host-name "slave21";
}
}
|
next-serverの後のIPアドレスに対して、filenameで指定されるファイルを要求します。
このIPアドレスは、tftpサーバーのIPアドレスとなりますが、通常は、マスターのIPアドレスと同じです。
filenameは、/disklessディレクトリと関係があります(後述しますが、tftpサーバーに指定するオプションによります)。
host宣言内のhardware ethernetオプションには、MACアドレスを指定し、
その特定のMACアドレスに対して、fixed-addressで指定した固定IPアドレスを割り当てます。
host-nameを書いておくことは恐らくいい考えで、単に、特定のスレーブのホスト名を書きます。
このHOWTOの範囲を超えるようなオプションについては、
dhcpd.confに関するとても良いmanページがあります。
次のように打ち込んで読むことができます:
コード表示 3.7: dhcpd.confのmanページを参照する |
# man dhcpd.conf
|
DHCPサーバーの起動
DHCP初期化スクリプトを起動する前に、/etc/conf.d/dhcpファイルを編集します。
次のような感じです:
コード表示 3.8: /etc/conf.d/dhcpの例 |
IFACE="eth0"
DHCPD_OPTS="-d"
|
-dフラグは、詳細なデバッグの為につけます。(訳注:ログをsyslog経由(デフォルトでは/var/log/daemon.log)ではなく、標準エラー出力に出すようになります。)
IFACE変数には、わたしたちの場合、eth0ですが、DHCPサーバーを起動したいデバイスを指定します。
複数のイーサネットカードを持つような複雑なネットワークトポロジーに対しては、
IFACEにもっと変数を追加できることは便利でしょう。
(訳注:eth0,eth1,eth3の3つのインタフェースがある場合、IFACE="eth0 eth1 eth3"のようにスペース区切りで追加します。デバイス名の順番は任意です。)
DHCPサーバーを起動するには:
コード表示 3.9: マスター上のDHCPサーバーを起動する |
# /etc/init.d/dhcp start
|
DHCPサーバーを起動スクリプトに追加するには:
コード表示 3.10: マスターのデフォルトランレベルにDHCPサーバーを追加する |
# rc-update add dhcp default
|
DHCPサーバーのトラブルシューティング
ノードが起動したかどうかを知るには、/var/log/daemon.logを見ます。
もしノードが起動に成功したなら、daemon.logファイルは次のようになっているでしょう:
コード表示 3.11: DHCPログファイルの例 |
DHCPDISCOVER from 00:00:00:00:00:00 via eth0
DHCPOFFER on 192.168.1.21 to 00:00:00:00:00:00 via eth0
DHCPREQUEST for 192.168.1.21 from 00:00:00:00:00:00 via eth0
DHCPACK on 192.168.1.21 to 00:00:00:00:00:00 via eth0
|
注意:
このログファイルは、スレーブのMACアドレスを知る手助けにもなります。
|
もし次のようなメッセージが出ていたら、恐らく、DHCPサーバーは正しくブロードキャストしていますが、
何か設定ファイルに間違いがあるということを意味しています。
コード表示 3.12: DHCPサーバーエラーの例 |
no free leases on subnet LOCAL-NET
|
設定ファイルを変更したら必ずDHCPサーバーを再起動してください。
再起動するためには:
コード表示 3.13: マスターのDHCPサーバーを再起動する |
# /etc/init.d/dhcpd restart
|
4.
TFTPサーバーの設定とPXE Linuxブートローダーの設定
TFTPサーバーについて
TFTPとは、Trivial File Transfer Protocol(機能が貧弱なファイル転送プロトコル)の略です。
TFTPサーバーは、スレーブにカーネルと初期のファイルシステムを提供します。
すべてのスレーブのカーネルとファイルシステムは、TFTPサーバーに保存されていますので、
恐らくマスターをTFTPサーバーにするのはいい考えでしょう。
PXELINUXについて
PXELINUXは、LILOやGRUBと同等のネットワークブートローダーで、TFTP経由で提供されます。
基本的には、クライアントにカーネルや起動初期のファイルシステムがどこにあるかを伝え、カーネルに様々なオプションを渡します。
はじめる前に
H. Peter AnvinさんによるSYSLINUXパッケージに含まれるpxelinux.0ファイルが必要です。
次のように打ち込むことで、パッケージをインストールできます:
コード表示 4.1: syslinuxのインストール |
# emerge syslinux
|
TFTPサーバーのインストール
tftpサーバーとしては、パッケージとして入手可能なtftp-hpaを強くお薦めします。
このtftpサーバーは、偶然にもSYSLINUXの作者と同一人物によって書かれていて、pxelinuxと相性がよいです。
インストールする為には、単に次のように打ち込んでください:
コード表示 4.2: TFTPサーバーのインストール |
# emerge tftp-hpa
|
PXELINUXの設定
TFTPサーバーを起動する前に、pxelinuxを設定しておく必要があります。
まず、pxelinuxバイナリを/disklessディレクトリにコピーします:
コード表示 4.3: リモートブートローダーの設定 |
# cp /usr/lib/syslinux/pxelinux.0 /diskless
# mkdir /diskless/pxelinux.cfg
# touch /diskless/pxelinux.cfg/default
|
これでデフォルトのブートローダーの設定ファイルが作成されました。
pxelinux.0バイナリは、pxelinux.cfgディレクトリ内において、
クライアントのIPアドレスを16進数表記した名前を持つファイルを探します。
もし見つけられなかった場合、一番右端の桁を取り除いたファイル名があるかを試し、これを桁がなくなるまで繰り返します。
バージョン2.05以降のsyslinuxは、さらにMACアドレスにちなんで付けられたファイル名も検索します。
もしファイルが一つも見つからなかった場合、defaultファイルを使用します。
コード表示 4.4: PXEがpxelinux.cfg/の中に探すファイルの順番 |
C0A80115
C0A8011
C0A801
C0A80
C0A8
C0A
C0
C
01-00-40-63-c2-ca-c9
default
|
defaultファイルから始めましょう。
コード表示 4.5: pxelinux.cfg/defaultの例 |
DEFAULT /diskless/bzImage
APPEND ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/diskless/192.168.1.21
|
DEFAULTタグでは、pxelinuに、以前コンパイルしたカーネルイメージ、bzImageを使うよう指示しています。
APPENDタグは、カーネル初期化オプションです。
わたしたちは、スレーブ用カーネルをNFS_ROOT_SUPPORTオプション付きでコンパイルしたので、nftrootをここで指定します。
最初のIPアドレスはマスターのIPアドレスで、二番目のIPドレスは/disklessに中に作成した、スレーブの初期のファイルシステムが保存されているディレクトリです。
TFTPサーバーの設定
/etc/conf.d/in.tftpdを編集します。
INTFTPD_PATHにtftprootディレクトリを、INTFTPD_OPTSにコマンドラインオプションを指定する必要があります。
次のような感じになるでしょう:
コード表示 4.6: /etc/conf.d/in.tftpdの例 |
INTFTPD_PATH="/diskless"
INTFTPD_OPTS="-l -v -s ${INTFTPD_PATH}"
|
-lオプションは、このサーバーはスタンドアローンモードで動作する、つまりinetd経由で動作させないことを表しています。
-vオプションは、ログ/エラーメッセージを詳細に出力することを表します。
-s /disklessでは、tftpサーバーのルートを指定しています。
TFTPサーバーの起動
TFTPサーバーを起動するには、次のようにします:
コード表示 4.7: マスターのTFTPサーバーの起動 |
# /etc/init.d/in.tftpd start
|
こうすることで、/etc/conf.d/in.tfpdで指定したオプション付きでTFTPサーバーが起動します。
もしシステム起動時に自動的にこのサーバーを起動したいなら:
コード表示 4.8: TFTPサーバーをマスターのデフォルトランレベルに追加する |
# rc-update add in.tftpd default
|
ネットワーク起動プロセスのトラブルシューティング
ネットワーク起動プロセスのデバッグにおいて、できることがいくつかあります。
主に、tcpdumpと呼ばれるツールを使います。
(訳注:X環境があるなら、tcpdumpよりetherealというツールの方が直感的に操作し易いGUIを提供します。)
tcpdumpをインストールするには:
コード表示 4.9: tcpdumpのインストール |
# emerge tcpdump
|
これで様々なネットワークトラフィックを監視し、クライアントとサーバー間のやりとりが機能しているか確かめることができるようになりました。
もし、上手く行かないなら、確認する項目がいくつかあります。
まず、クライアント、及びサーバーが物理的に正しく接続されているか、ネットワークケーブルが損傷していないかを確認します。
もし、あなたのクライアントあるいはサーバーが特定のポートでだけ要求を受け付けないのなら、ファイアウォールの妨害がないか確認してください。
二つのコンピュータ間のやり取りを監視するには:
コード表示 4.10: クライアント、サーバー間のやり取りをtcpdumpで監視する |
# tcpdump host and
|
tcpdumpをTFTPが使うポートの様な、特定のポートでだけ動作させることも可能です:
コード表示 4.11: TFTPサーバーの監視 |
# tcpdump port 69
|
受信しうる一般的なエラーは、"PXE-E32: TFTP open time-out"です。
これは恐らくファイアウォールの問題です。
もしTCPwrappersを使っているなら、/etc/hosts.allowとetc/hosts.denyを調べて、
それらが正しく設定されているか確認してください。
クライアントは、サーバーに接続を許可されていなければなりません。
5.
NFSサーバーの設定
NFSサーバーについて
NFSは、Network File System(ネットワークファイルシステム)の略です。
NFSサーバーは、スレーブに対してディレクトリを提供するのに使用されます。
この部分は、後で、各個人がいくらか変更できますが、今は、最初のスレーブノードをディスクレスで起動することに専念します。
Portmapperについて
様々なクライアント・サーバーサービスは、特定のポートでは動作するかわりに、RPC(Remote Procedure Calls)に依存しています。
サービスが初期化されるときに、ランダムなポートで待ち受け状態になり、このポートをPortmapperユーティリティに登録します。
NFSはRPCに依存している為、NFSを起動させる前にPortmapperが起動していることが必要です。
はじめる前に
NFSサーバーは、カーネルレベルのサポートが必要です。もしこれを有効にしていないなら、マスター用カーネルの再コンパイルが必要です。
マスター用カーネルの設定を再びチェックする為には:
コード表示 5.1: NFS特有のオプションを調べる |
# grep NFS /usr/src/linux/.config_master
|
もしあなたのカーネルが適切に設定されているなら、次のような出力があるはずです:
コード表示 5.2: マスター用カーネルの設定にNFS特有のオプションが正しく設定されている場合 |
# CONFIG_ROOT_NFS is not set
CONFIG_NFSD=y
CONFIG_NFSD_V3=y
# CONFIG_NFSD_TCP is not set
# CONFIG_NCPFS_NFS_NS is not set
|
NFSサーバーのインストール
NFSパッケージは、次のように打ち込むことで、portageから取得できます:
コード表示 5.3: nfs-utilsのインストール |
# emerge nfs-utils
|
このパッケージには、portmapユーティリティ、nfsサーバー、nfsクライアントユーティリティが含まれ、
自動的に初期化時の依存性を解決します(訳注:前述のように、NFSを起動する前にportmapperを起動しなければならないが、これを自動でやってくれるという意味)。
NFSサーバーの設定
修正しなければならない主なファイルは3つです:
コード表示 5.4: NFS設定ファイル |
/etc/exports
/diskless/192.168.1.21/etc/fstab
/etc/conf.d/nfs
|
/etc/exportsファイルは、NFS経由で、どのように、誰に対して、何をエクスポートするのかを指定します。
マスターがエクスポートしているNFSファイルシステムをマウントできるように、スレーブのfstabを変更します。
マスターの典型的な/etc/exportsは、次のような感じです:
コード表示 5.5: マスターの/etc/exportsの例 |
/diskless/192.168.1.21 192.168.1.21(rw,no_root_squash,no_all_squash)
/opt 192.168.1.0/24(ro,no_root_squash,no_all_squash)
/usr 192.168.1.0/24(ro,no_root_squash,no_all_squash)
/home 192.168.1.0/24(rw,no_root_squash,no_all_squash)
/var/log 192.168.1.21(rw,no_root_squash,no_all_squash)
|
最初のフィールドは、エクスポートするディレクトリを示しています。
次のフィールドは、誰にどうやってエクスポートするのかを示しています。
"誰に"の欄では、特定のディレクトリをマウントするのを許可する相手をNFSに指示します。
"どうやって"の欄では、マウントするクライアントがファイルシステムに対して何ができるのかを表しています。
読み取り専用にするにはro、読み書き可能にするにはrwを指定します。
no_root_squashとno_all_squashオプションは、ディスクレスクライアントがディスクに書き込むのに重要で、
これを指定することで、クライアントがI/O要求を出したときに、"squashed"しないようになります。
(訳注:NFSオプションには、セキュリティ対策として、アクセス要求の権限をマッピングする"root_squash"(ugi/gid=0の要求を匿名ユーザーの権限に置き換えます)"と"all_squash"(root_suqashに似ていますが、すべてのuid/gidからのアクセスを匿名ユーザー権限に置き換えます)がありますが、no_root_squash、no_all_squashは、これらを無効にするものです。ディスクレスクライアントは、システム起動時に必ずroot権限(uid=0/gid=0)でNFSマウントしに行く為、このオプションが必要です。詳細は、man 5 exportsを見てください。)
スレーブのfstabファイル/tftpboot/192.168.1.21/etc/fstabは、次のようになるでしょう:
コード表示 5.6: スレーブのfstabの例 |
master:/diskless/192.168.1.21 / nfs hard,intr,rw,nolock,rsize=8192,wsize=8192 0 0
master:/opt /opt nfs hard,intr,ro,nolock,rsize=8192,wsize=8192 0 0
master:/usr /usr nfs hard,intr,ro,nolock,rsize=8192,wsize=8192 0 0
master:/home /home nfs hard,intr,rw,nolock,rsize=8192,wsize=8192 0 0
none /proc proc defaults 0 0
master:/var/log /var/log nfs hard,intr,rw 0 0
none /mfs mfs dfsa=1 0 0
|
この例では、masterは単にマスターのホスト名ですが、容易に想像つくように、マスターのIPアドレスでも良いです。
最初の欄は、ディレクトリマウントしようとするディレクトリで、二番目の欄はどこにマウントするのかを示しています。
三番目の欄は、ファイルシステムで、NFS経由でマウントされるディレクトリはどれもNFSを指定します。
四番目の欄は、マウント処理において使用される様々なオプションです(マウントオプションについては、mount(1)を見てください(訳注:mount(8)のtypo?mountのmanは8章です))。
ソフトマウントポイントで問題がおきる人もいますので、すべてハードマウントにしましたが、
あなたのクラスターをより効率の良いものにしたいなら、/etc/fstabの様々なオプションを調べるべきです。
修正すべき最後のファイルは、/etc/conf.d/nfsです。
これは初期化時にNFSにオプションを指定する為のもので、次のような感じになります:
コード表示 5.7: マスターの/etc/conf.d/nfsの例 |
# Config file for /etc/init.d/nfs
# デフォルトで起動するサーバーの数
RPCNFSDCOUNT=8
# rpc.mountdに渡すオプション
RPCMOUNTDOPTS=""
|
ネットワーク上のディスクレスノードの数に応じてRPCNFSDCOUNTを変更すべきです。
NFSサーバーの起動
/etc/init.dにある初期化スクリプトを使ってNFSサーバーを起動します:
コード表示 5.8: マスターのNFSサーバーの起動 |
# /etc/init.d/nfs start
|
もしこのスクリプトをシステム起動時に開始させたいなら、単に次のように打ち込んでください:
コード表示 5.9: NFSサーバーをマスターのデフォルトランレベルに追加する |
# rc-update add nfs default
|
6.
スレーブのファイルシステムをコンパイルする
足りないファイルをコピーする
スレーブ特有のファイルは保存してありますが、ここで、マスターに同期させて、
スレーブのファイルシステムを作成し、必要なバイナリをスレーブに対して提供するようにします。
コード表示 6.1: スレーブのファイルシステムの作成 |
# cp -r /bin /diskless/192.168.1.21/bin
# cp -r /sbin /diskless/192.168.1.21/sbin
# cp -r /lib /diskless/192.168.1.21/lib
|
初期化スクリプト
デフォルトのスクリプトは、checkrootを起動しようとしまが、スレーブノードにおいては意味がありません。
難しい方法としては、手作業で/diskless/192.168.1.21/sbin/rcスクリプトを編集することですが、
厄介で危険な方法であり、もしスレーブノードファイルシステムをマスターと再び同期させようとするときに、このスクリプトを取っておくのを忘れてしまい、上書きしていまう恐れがあります。
上手い回避策としては、システム起動時に/fastbootを持つことです。
このフィアルは、checkrootがファイルシステムチェックをしないようにします。
しかし、初期化プロセスが完了する時に、初期化プロセスによってそのファイルは消されてしまいます。
私達が初期化プロセスの最後にこのファイルを再び作成する必要がある理由はそういう訳です。
次のようにします:
コード表示 6.2: 初期化スクリプトがファイルシステムチェックをするのを防止する |
# touch /diskless/192.168.1.21/fastboot
# echo "touch /fastboot" >> /diskless/192.168.1.21/etc/conf.d/local.start
|
ディスクレスノードに必要なサービスの数だけ、/diskless/192.168.1.21/etc/runlevelに初期化スクリプトが必要です。
それは、あなたのスレーブに何をさせたいかによります。
警告:
マスターにログインしているときに、スレーブのランレベルに起動スクリプトを追加・削除する目的で、
rc-updateプログラムを使用しないでください。
そうしてしまうと、マスターのランレベルを変更してしまいます。
手作業でリンクを作成するか、sshを使って、あるいはディスプレイとキーボードを繋いで、スレーブノードにログインする必要があります。
(訳注:あるいは、各スレーブノードのディレクトリ、例えばこの例では/diskless/192.168.1.21にchrootしても良いでしょう。)
|
コード表示 6.3: 典型的なスレーブのランレベル |
/diskless/192.168.1.21/etc/runlevels/:
total 16
drwxr-xr-x 2 root root 4096 2003-11-09 15:27 boot
drwxr-xr-x 2 root root 4096 2003-10-01 21:10 default
drwxr-xr-x 2 root root 4096 2003-03-13 19:05 nonetwork
drwxr-xr-x 2 root root 4096 2003-02-23 12:26 single
/diskless/192.168.1.21/etc/runlevels/boot:
total 0
lrwxrwxrwx 1 root root 20 2003-10-18 17:28 bootmisc -> /etc/init.d/bootmisc
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 checkfs -> /etc/init.d/checkfs
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx 1 root root 23 2003-10-18 17:28 consolefont -> /etc/init.d/consolefont
lrwxrwxrwx 1 root root 20 2003-10-18 17:28 hostname -> /etc/init.d/hostname
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 keymaps -> /etc/init.d/keymaps
lrwxrwxrwx 1 root root 22 2003-10-18 17:28 localmount -> /etc/init.d/localmount
lrwxrwxrwx 1 root root 18 2003-10-18 17:28 net.lo -> /etc/init.d/net.lo
lrwxrwxrwx 1 root root 20 2003-10-18 17:28 netmount -> /etc/init.d/netmount
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 portmap -> /etc/init.d/portmap
lrwxrwxrwx 1 root root 21 2003-10-18 17:28 rmnologin -> /etc/init.d/rmnologin
lrwxrwxrwx 1 root root 18 2003-10-18 17:28 serial -> /etc/init.d/serial
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 urandom -> /etc/init.d/urandom
/diskless/192.168.1.21/etc/runlevels/default:
total 0
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 distccd -> /etc/init.d/distccd
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/init.d/local
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 metalog -> /etc/init.d/metalog
lrwxrwxrwx 1 root root 22 2003-10-18 17:28 ntp-client -> /etc/init.d/ntp-client
lrwxrwxrwx 1 root root 16 2003-10-18 17:28 ntpd -> /etc/init.d/ntpd
lrwxrwxrwx 1 root root 16 2003-10-18 17:28 sshd -> /etc/init.d/sshd
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 vcron -> /etc/init.d/vcron
/diskless/192.168.1.21/etc/runlevels/nonetwork:
total 0
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/init.d/local
/diskless/192.168.1.21/etc/runlevels/single:
total 0
|
さぁ、スレーブを起動する時が来ました。幸運を祈って。起動しましたか?
おめでとう、いまやあなたはディスクレスノードの誇れる所有者です。:)
このドキュメントの内容は、他のものが明示されない限りは、
CC-BY-SA-2.5ライセンスです。
Gentoo Name and Logo Usage Guidelines (日本語訳)が適用されます。
|