Gentoo Logo

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
(コピーする前に/bootがマウントされている事を確認してください)
# 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
(openMosixの場合のみ)
# 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";
    # それを取得するサーバーの名前をここに書きます。
    # マスターのIPアドレスを使います
    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;
       # スレーブに静的IPアドレスを割り当てます
       fixed-address                    192.168.1.21;
       server-name                      "master";
       # もし必要なら、ゲートウェイアドレスを書きます
       option routers                   192.168.1.1;
       # もし必要なら、DNSのIPアドレスを書きます
       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/の中に探すファイルの順番

(16進表記の割り当てられたIPアドレス)
C0A80115
C0A8011
C0A801
C0A80
C0A8
C0A
C0
C
(01はイーサネットの意味で、それ以降はスレーブのMACアドレスと一致します
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 クライアントのIPアドレス and サーバーのIPアドレス

tcpdumpをTFTPが使うポートの様な、特定のポートでだけ動作させることも可能です:

コード表示 4.11: TFTPサーバーの監視

# tcpdump port 69

受信しうる一般的なエラーは、"PXE-E32: TFTP open time-out"です。 これは恐らくファイアウォールの問題です。 もしTCPwrappersを使っているなら、/etc/hosts.allowetc/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の例

# それぞれのスレーブに対して次のように1行で書きます
/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_squashno_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

(openMosixクラスターを構築している場合のみ)
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: 初期化スクリプトがファイルシステムチェックをするのを防止する

(次の起動の為に/fastbootファイルを作成する)
# touch /diskless/192.168.1.21/fastboot
(毎回、起動時に/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

さぁ、スレーブを起動する時が来ました。幸運を祈って。起動しましたか? おめでとう、いまやあなたはディスクレスノードの誇れる所有者です。:)



印刷

ページの更新日 November 20, 2003

この翻訳はすでにメンテナンスされていません。

要約: このHOWTOは、Gentoo Linuxを用いてディスクレスノードをセットアップする手助けをします。

Michael Andrews
Researcher

Sven Vermeulen
Reviewer

Xavier Neys
Reviewer

武田洋之
翻訳

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.