// /* vim: set tabstop=4 shiftwidth=4: */ 等幅フォントでご覧下さい。 disklesslinux-kit Author: disklessfun mail: disklessfun@mail.goo.ne.jp Version: 0.09a Last Change: 2006/11/15 概要 技術的背景 対応OS 制限 著作権 ライセンス ダウンロード 導入手順(簡易な説明) 運用のポイント カスタマイズ用に少し詳細の説明 その他 概要 NFSROOTでディスクレス化というと、カーネル再構築がつきものですが、disklesslinux-kit(以 降、本キット)はカーネル再構築をおこなわずにNFSROOTディスクレス化を実現します。 技術的背景 カーネル再構築をおこなわずにNFSROOTを実現する為に、少々リッチなinitrdを用いています。 ※一般的にNFSROOTでディスクレスLinuxを実現する手法については既に広く知られていることで すので、ここでは詳しく述べません。 対応OS [クライアント] Version0.09aについては * Fedora Core 5(2.6.17-1.2187_FC5) * Fedora core 5(2.6.18-1.2200.fc5) * Fedora Core 6(2.6.18-1.2798.fc6) * Fedora Core 6(2.6.18-1.2849.fc6) * CentOS 4.4(2.6.9-42.0.3.EL) のみで動作確認をおこなっています。ディスクレス環境でFC5->FC6のyumによるアップグレ ードについても確認済みです。但しFedora Coreは日々アップデートされるディストリビュ ーションなので、ある日アップグレードに成功したからといって、次の日もアップグレード に成功するとは限りません。 CentOS 4.4(2.6.9-42.0.3.EL)と同等のOS(RHEL4,WBEL4等)にも対応していると思われま す。 その前のVersion0.08の機能を損なわないように修正をおこなっていますので、多分Fedora Core 4以降であれば動作すると思います。 公開前のバージョンではCentOS 4, Fedora Core 3での動作を確認していますが、これらを 公開する予定はありません。 [母艦] カーネル2.4以降のLinuxであれば、ディストリビューションを問わず母艦とすることが可能 だと思います。 私自身は今まで、カーネル2.4系のFedora Core 1と2.6系のCentOS4〜4.4を母艦としてきま した。 SolarisやFreeBSDも母艦にすることは可能だと思います。しかし、その場合にはchroot環境 でのメンテナンスはおこなえません。現実的にはクライアントとリリース時期のあまり変わ らないLinuxディストリビューションが適しています。 制限 運用上の制限等は別途記述します。ここでは当キット独自の話ではなくNFSROOT全般における制 限について、導入前に是非理解しておいて頂きたい点を挙げます。 ・導入前に一旦、クライアントのローカルなHDDにFedora Core ?をインストールしておく必要  があります。  ※ディスクレス環境構築後には、このローカルなHDDのLinu領域は削除することができます。  またローカルなHDDそのものを取り外すこともできます。 ・swapは使えません。現在のLinuxカーネルはswapにブロックデバイスしか用いることができま  せん。用途によってはクライアントに十分なメモリを積んでおく必要があります。  ※余談になりますが、Solaris x/86、FreeBSDの場合はNFS上にswap領域を確保することができ  ます。 ・現在の私の検証環境での母艦はCentOS4.4(カーネル2.6.12.6ほぼvanilla)です。この環境で  は、クライアントがFedora Coreの場合、ディスクレス化後、最初に起動した際に  lockd: cannot monitor IPアドレス  とのメッセージが盛大に出ます。2回目以降にこの問題は発生しません。 著作権 Copyright(C) by disklessfun 2005-2006 ライセンス GPL2とします。 ダウンロード http://wikiwiki.jp/disklessfun/?plugin=attach&pcmd=open&file=disklesslinux-kit-0.09a.tar.gz&refer=disklessfc 導入手順(簡易な説明) 導入の要点だけを記します。(ある程度Linuxに詳しい人向けです。) 母艦上でdhcpサーバ、nfsサーバ、tftpサーバを動作させる必要があります。 (理論上は上記三種のサーバを夫々別のマシン上で動作させても良い筈ですが、私自身も母艦上 で全て動作させるパターンしか検証していません。) また、母艦にはPXEに対応したLinuxブートローダを導入する必要があります。様々な種類がある ようですが、私が普段使用しているのはpxegrubです。ここではpxegrubを自分でコンパイルして 導入する方法を示します。 [pxegrubの導入] grubのtarballは、ftp://alpha.gnu.org/gnu/grub/grub-0.97.tar.gzからダウンロードでき ます。 これを解凍し、./configureし、makeします。私は./configure時に以下のようなオプション を付けました。--enableの個所は重要ですが、--disableの個所は好みです。 ./configure \ --enable-eepro100 \ --enable-3c90x \ --enable-rtl8139 \ --enable-diskless \ --disable-ext2fs \ --disable-fat \ --disable-ffs \ --disable-ufs2 \ --disable-minix \ --disable-reiserfs \ --disable-vstafs \ --disable-jfs \ --disable-xfs \ --disable-iso9660 \ --disable-gunzip \ --disable-packet-retransmission \ --disable-hercules \ --disable-serial makeするとgrub-0.97/stage2にファイルpxegrubが作成されます。これを/tftpbootにコピー しておきます。 [dhcpサーバ導入] 詳しく説明すると長くなるので、dhcpd.confのサンプルを載せます。 以下に記載の数値はもちろん任意です。他に文字列sample.net, dlclient、option-150も任 意です。 ※ "pxegrub"は/tftpbootからの相対パスです。 ※ "/dlclient/grub.conf"は/tftpbootからの相対パスの頭にスラッシュを付けたものです。 ######################################################## # DHCP Server Configuration file. ddns-update-style interim; default-lease-time 172800; max-lease-time 17280; zone sample.net. { primary 192.168.1.1; } zone 1.168.192.in-addr-arpa. { primary 192.168.1.1; } option option-150 code 150 = text; subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.200; option subnet-mask 255.255.255.0; option routers 192.168.1.254; option broadcast-address 192.168.1.255; option domain-name-servers 192.168.1.1; option domain-name "sample.net"; host dlclient { hardware ethernet 00:10:B8:0E:3C:2C; # fixed-address 192.168.1.6; option host-name "dlclient"; filename "pxegrub"; option option-150 "/dlclient/grub.conf"; } } # end of DHCP Server Configuration file. [nfsサーバ導入] /etc/exportsの記述例です。 # /nfsroot 192.168.1.0/255.255.255.0(rw,no_root_squash,async) ※NFSROOTの為にはno_root_squashが必須です。 [tftpサーバ導入] /etc/xinet.d/tftpを修正してenableにします。 環境構築後のファイル配置の一例を以下に示します。 (最後が/の文字列はディレクトリ名です。) dlclient/の部分は実際にはdhcpd.confの記述と合致させます。 /tftpboot/------pxegrub       |       ----dlclient/-----grub.conf              |              ----vmlinuz-xxxxxxx              |              ----initrd-xxxxxxx.NFS.img ※ファイルvmlinuz-xxxxxxx、initrd-xxxxxxx.NFS.imgは、後ほど本キットにより自動的に この場所にコピーされます。 ※ grub.confは後ほど作成します。 ※RedHat系のtftpデーモンはルート権限で動作していませんので、tftpで読み出すファイル はugoのoに読み取り権限を与えて下さい。 [クライアント環境の母艦へのコピー] クライアントのローカルなHDDのLinux領域の/以下の、疑似ファイルシステム以外を全部、 母艦の/nfsroot/dlclientにコピーします。 ※実際にはパスは任意です。但しgrub.conf、exports、後でで記述するconfig.inの内容と 合致させる必要があります。 好きな方法を使ってコピーをおこなって下さい。既に母艦のnfsサーバが構築済みの場合は 、クライアントLinuxから母艦のexportポイントをマウントし、cp -ax /でコピーする方法 が最も簡単でしょう。ただ稼動中の環境をコピーする問題についてよく理解した上で実行し て下さい。 [本キットの導入] disklesslinux-kitのディレクトリにあるconfig.inを自分の環境に合わせて修正して下さい 。最初はSV_IP、NFSROOT、CUR_VER、TFTPPATHを修正する必要があるでしょう。 rootになり(su - したほうが無難)、LANGをja_JP.eucJPに切り替えた上で、all-wrap.sh を実行して下さい。 [grub.confの記述(pxegrub使用の場合)] 最低限、以下のような記述が必要です。 もちろん、タイトル名、フィル名、IPアドレス、パスには適宜正しい値を記述します。 # grub.conf #boot=(nd) default=0 timeout=5 color cyan/blue white/blue title Fedora Core 5 root (nd) kernel /dlclient/vmlinuz-2.6.17-1.2157_FC5 rw nfsroot=192.168.1.1:/nfsroot/dlc lient(実際には1行) initrd /dlclient/initrd-2.6.17-1.2157_FC5.NFS.img このファイルを/tftpboot/dlclient/grub.confに保存した時点でディスクレスLinuxをブー トする環境が全て揃う筈です。クライアントをPXEブートしてみて下さい。 運用のポイント yum等でカーネル等、起動に関するファイルが変更された場合 新しいカーネルで起動する為には、initrdを再作成し、pxegrubやpxelinuxの設定ファイル も修正する必要があります。 クライアントをshutdownした状態で母艦上でconfig.inのCUR_VERを修正後、rootになり(su - したほうが無難)、LANGをja_JP.eucJPに切り替えた上で、initrd-wrap.shを実行して下 さい。 pxelinuxやpxegrubの設定ファイルも適宜修正して下さい。 また、カーネルのアップデートに伴い/etc/rc.d/rc.sysinitが更新される場合がよくありま す。その場合は上記作業に加えて、rootになり(su - したほうが無難)、LANGをja_JP.euc JPに切り替えた上で、filechg.shを実行して下さい。 yum等で/etc/rc.d/init.d/haltが更新された場合 クライアントをshutdownした状態で母艦上でrootになり(su - したほうが無難)、LANGをj a_JP.eucJPに切り替えた上で、filechg.shを実行して下さい。 /etc/rc.d/rc.sysinit、/etc/rc.d/init.d/halt共にinitscriptsパッケージに含まれている ので、initscriptsパッケージが更新された場合はfilechg.shの実行が必要です。 カスタマイズ用に少し詳細な説明 NFSROOTの指定 NFSROOTは、pxegrubやpxelinuxの設定ファイルに記述するカーネル引数で指定します。dhcp d.confのroot-pathでは指定することは出来ませんのでご注意下さい。 NFSサーバはホスト名で指定することは出来ません。必ずIPアドレスで指定して下さい。 カーネル引数nfsrootはNFSROOTと既述しても可ですが設定値は大文字小文字を区別します。 NFSROOTの記述例 nfsroot=192.168.1.2:/nfsroot/disklesslinux NFSROOT=192.168.1.2:/nfsroot/disklesslinux ネットワークコンフィグレーション クライアントのネットワークのコンフィグレーションは、クライアントの/etc以下のファイ ルには関係なく、カーネル引数とdhcpのみによって決定されます。 その決定スキームは以下のようになっています。 カーネル引数に ip=dhcp がある場合 ・・・・・・・・・・・・・dhcpを使用 それ以外の場合で、カーネル引数に nfsaddrs が含まれる場合・・dhcpを使用 それ以外の場合、・・・・・・・・・・・・・・・・・・・・・・固定ipを使用 カーネル引数 ip, nfsaddrsは設定値も含め、大文字小文字の区別はしません。 nfsaddrsのフォーマットは昔ながらのnfsaddrsのフォーマットに準拠します。 本来のnfsaddrsのフォーマットは、 クライアントアドレス:ネームサーバアドレス:ルータアドレス:ネットマスク:ホスト名 ですが、 最後のホスト名の指定は無視します。指定を省いても構いません。 2番目のパートのネームサーバアドレスは指定しても無視しますが、それ以降のパートの値 を指定したい場合はこのパート自体の省略はできません。 最後尾の2パート ネットマスク, ホスト名を省いても構いませんが動作は未確認です。 最後尾の3パート ルータアドレス, ネットマスク, ホスト名を省いても構いませんが動作は 未確認です。 nfsaddrsの設定例 nfsaddrs=192.168.1.10:192.168.1.2:192.168.1.1:255.255.255.0:disklesslinux NFSADDRS=192.168.1.10:192.168.1.2:192.168.1.1:255.255.255.0:disklesslinux nfsaddrs=192.168.1.10:192.168.1.2:192.168.1.1:255.255.255.0 NFSADDRS=192.168.1.10:192.168.1.2:192.168.1.1:255.255.255.0 nfsaddrs=192.168.1.10:192.168.1.2:192.168.1.1 NFSADDRS=192.168.1.10:192.168.1.2:192.168.1.1 nfsaddrs=192.168.1.10:192.168.1.2 NFSADDRS=192.168.1.10:192.168.1.2 nfsaddrs=192.168.1.10 NFSADDRS=192.168.1.10 ホスト名の決定 rc.sysinitから呼び出されるスクリプトによって、 ネットワークのスキームがdhcpで、且つ、dhcpによってホスト名が取得できた場合はホスト 名をdhcpで取得した値に設定し直します。その際、dhcpからドメイン名も取得できた場合は 、ホスト名をFQDNに設定します。 ※dhcpdのoption host-nameを設定する場合には、FQDNを設定しないで下さい。 その他 本キットの記述文字コード 本キットの各スクリプトはeuc-jpで既述されていますが、動作自体は他の言語環境でも可能 です。毎度、LANGを切り替えるのが面倒だったり、console出力の文字化けが気になる人は 自分の環境に合わせて文字コードをコンバートして下さい。 ※実は私自身の環境はutf-8です。 PXE非対応のマシンでの運用 PXE非対応のマシンでもEtherBoot起動フロッピーや起動CDを作成してHDDレスLinuxを実現す ることが可能です。 /etc/rc.d/init.d/haltの修正内容 ローカルなファイルシステムに対するアンマウントをおこなわないように修正しています。 対応NICについて 今のところは 3COM 3c90x, Intel Ether Express 100, Realtek 8139xに対応しています。 適当に足すなり削除して下さい。 必要のないモジュールをinsmodしてもエラーとはならないので、現在のところ対応NICのド ライバを全てロードしてそのままにする仕様となっています。