2008/01/16 カテゴリ : Tech  Linux  Debian  NFS 

LinuxでNFS-root

今回はNFS-rootの話です。

つい先日、うちの EPIA M (C3 600Mhz, DDR 266 512MB)をPXEとNFS-rootでブートに成功したので、メモもかねて書いておきたいと思います。

・NFS-rootとは何か?
文字通りです。NFSをルートファイルシステムにします。
通常はOSをHDDなどにインストールして、起動時にはそこからロードしますが、NFS-rootはNFSサーバー上の一角にインストールし、起動時にはそこからOSのデータをロードします。

こんなことできて何がうれしいかと言うと、
・複数のPCにOSをインストールしなくても同じOSを立ち上げて、再起動すればすべて元通りにできる。一時的にdistccを実行したいときなどに利用できます。
・パーツが余ったので自宅サーバーを立てようと思うが、HDDが余っていない。いまある内部用のNFSサーバーから数GBでいいから使いたい。
・完全ディスクレスマシンを構築したい。
など、考えればいくつか浮かんできます。

私の場合はHDDを搭載すると、せっかくEPIAのファンレスモデルを使っているのにほぼ無音に出来ないのと発熱も上がるので、NFS-rootを導入してみました。
ちなみに、EPIAで何をするかと言うと・・・今のところ起動しているだけです。
USBのNICでも増設してルーター代わりにでも使用しようかと検討中です。

ちなみに、NFS-rootはあくまでもルートにするだけです。
別途ブートローダーを用意しなければいけません。
そのためにはIDEにHDDを・・・本末転倒なので、どうにかして用意しなければいけません。
その一つに、PXEとtftpを使用する方法があります。

・PXEとは
PXEはIntel社が策定した規格で、細かいことは以下を参照してください。
参考まで: http://ja.wikipedia.org/wiki/Preboot_Execution_Environment
要は、DHCPなどで自分のIPとtftpサーバーのIPを取得し、tftpでブートに必要なものをロードするものです。
割と最近のハードはデフォルトで対応しています。


今回はこのPXEとtftpとNFSを使って完全ディスクレスを構築したいと思います。
※以下の説明はDebianなので他のOSを使う人は適時読み替えてください。
※DHCPサーバーも構築するので、ブロードバンドルーターのDHCPサーバー機能や他のDHCPサーバーを切ってください。自宅でなければ人に迷惑をかけないように気をつけてください。

※以下の項目を試す場合は「自己責任」でおねがいします。

構成
・サーバー name.hoge.local 192.168.0.2
・クライアント epia.hoge.local 192.168.0.100

サーバーでDHCP,DNS,TFTP,NFSをすべて動かします。

・NFS-root対応カーネル作成

  1.  $ sudo apt-get install linux-source-2.6.22
  2.  $ cd /usr/src
  3.  $ sudo tar jxf linux-source-2.6.22.tar.bz2
  4.  $ cd linux-source-2.6.22
  5.  $ sudo make menuconfig

以下、メニューでこれらを有効にする

  1. Networking  ---> 
  2.  Networking options  --->
  3.   [*]   IP: kernel level autoconfiguration
  4.   [*]     IP: DHCP support
  5.   [*]     IP: BOOTP support
  6.   [*]     IP: RARP support
  7. Device Drivers  --->
  8.  Network device support  --->
  9.   Ethernet (10 or 100Mbit)  --->
  10.    <*>   VIA Rhine support
  11. File systems  --->
  12.  <*> Ext3 journalling file system support
  13.  [*]   Ext3 extended attributes
  14.  [*]     Ext3 POSIX Access Control Lists
  15.  [*]     Ext3 Security Labels
  16.  Network File Systems  --->
  17.   <*> NFS file system support
  18.   [*]   Provide NFSv3 client support
  19.   [*]     Provide client support for the NFSv3 ACL protocol e
  20.   [*]   Provide NFSv4 client support (EXPERIMENTAL)
  21.   [*]   Allow direct I/O on NFS files
  22.   [*] Root file system on NFS

カーネル設定は以上。
NFS-rootのサポートとExt3のサポートを有効に、あと使用するNICのドライバも有効にします。

  1.  $ sudo make-kpkg --revision=1 kernel_image

などで作成します。

・サーバー上にルートを構築

  1.  $ sudo mkdir /diskless
  2.  $ sudo mkdir /diskless/epia
  3.  $ cd /diskless/epia
  4.  $ sudo debootstrap etch ./ --arch i386

とすればdebootstrapが全部やってくれます。
終了したら、

  1.  $ sudo chroot ./ /bin/bash

chrootしてpasswdやネットワークの設定をしてください。ネットワークはもちろんDHCPでOKです。

あとはNFS-rootを有効にしたカーネルを boot/ にコピーします。(今回のようにパッケージになっていれば chroot環境で dpkg -i linux-image-2.6.22でも可)

・syslinuxのインストール
ここではブートローダーにpxelinuxを使用するので、

  1.  $ sudo apt-get install syslinux

でsyslinuxをインストールして、

  1.  $ sudo cp /usr/lib/syslinux/pxelinux.0 /diskless/

とします。/disklessがtftpのルートなので、後述のdhcpd.confではこのファイルを指定します。

  1.  $ sudo mkdir /diskless/pxelinux.cfg
  2.  $ cd /diskless/pxelinux.cfg
  3.  $ sudo vi default

  1. DEFAULT linux
  2. LABEL linux
  3.   KERNEL epia/boot/vmlinuz-2.6.22
  4.   APPEND root=/dev/nfs nfsroot=192.168.0.2:/diskless/epia ip=dhcp
  5.   IPAPPEND 0

中身はこんな感じです。


・NFSサーバーを用意
(/disklessを公開して、サブディレクトリをそれぞれのサーバーのルートにします)

  1.  $ sudo apt-get install nfs-kernel-server

で、/etc/exportsに以下を追加

  1.  /diskless 192.168.0.0/255.255.255.0(rw,no_subtree_check,no_root_squash)

※ no_root_squash を付けないとNFSサーバーから見たらnobodyなどとしてマウントされますので注意してください。
パーミッションの関係上付けないとダメです。

  1.  $ sudo /etc/init.d/nfs-kernel-server restart

以上でOKです。

・tftpサーバーの用意

  1.  $ sudo apt-get install tftpd-hpa

xinetdで起動するので、 /etc/xinetd.conf か /etc/xinetd.d/以下の設定 を確認(なければ作ってください)

  1. service tftp
  2. {
  3.         socket_type             = dgram
  4.         protocol                = udp
  5.         wait                    = yes
  6.         user                    = root
  7.         server                  = /usr/sbin/in.tftpd
  8.         server_args             = -s /diskless
  9.         disable                 = no
  10.         per_source              = 11
  11.         cps                     = 100 2
  12.         flags                   = IPv4
  13. }

こんな感じになっていればOKです。

  1.  $ sudo /etc/init.x/xinetd restart

しておきます。

・dhcpサーバーの構築

  1.  $ sudo apt-get install dhcp

/etc/dhcpd.conf を編集

  1. subnet 192.168.0.0 netmask 255.255.255.0 {
  2.     server-identifier name.hoge.local;
  3.     option routers 192.168.0.1;
  4.     option subnet-mask 255.255.255.0;
  5.     option broadcast-address 192.168.0.255;
  6.     option domain-name hoge.local;
  7.     option domain-name-servers name.hoge.local;
  8.     default-lease-time 600;
  9.     max-lease-time 7200;
  10.     host epia {
  11.         hardware ethernet FF:FF:FF:FF:FF:FF;
  12.         fixed-address 192.168.0.100;
  13.         filename "pxelinux.0";
  14.         option host-name "epia";
  15.         option root-path "/diskless/epia";
  16.         next-server 192.168.0.2;
  17.     }

  1.  $ sudo /etc/init.d/dhcp restart

以上で準備は整いました。

あとはクライアントの電源を入れ、Delキーを押してBIOSの設定画面で、PXE bootを有効にし、優先度を最高にすればOKです。
再起動すると、無事に立ち上がる・・・はずです。多分。

以上、NFS-rootでディスクレスにする方法です。

このepia搭載PCですが、電源ファンが異音を発するので取り外したため、ケースファンのみで静かに動いています。
あとは夏に熱暴走しないことを祈るばかりです。

おまけ
PXE以外にも、USBメモリにブートローダーを入れておくという手もあります。
さらにOS自体もつっこめば、ディスクレスではないですがSSD買うよりかなり安価に構築できます。
この方法はそのうちに書くかもしれません。今のところ失敗続きなのでいつになるかわかりませんが・・・。

コメントフォーム

認証
captcha_key
 
 

トラックバックURI

アシアルPHP書籍情報