知能工学科のdiskless Linuxに関するメモ

松元隆二
1999年9月
(追記2000年4月)
(文字コードをUTF-8に修正2022年6月)
KEYWORD: Linux, diskless, etherboot, cs89x0

知能工学科の共通の計算機室では、35台のWindowsNT4.0でXエミュレータを立 ち上げUNIXにloginして使っていました。構成は次の通りです。

しかし管理者がWindowsNTを管理するのを嫌い(^^;;、またWindowsNTが必要な 講義はほとんど無かったため、Linuxを使ってX端末化する事にしました。

具体的には、起動用フロッピーに起動時に最低限必要な設定だけをしておき、 ファイルシステムの大部分をNFSで共有し、HDD無し(diskless)でLinuxが起動 するように設定し、X端末化しました。いわゆるdiskless Linuxというもので す。

このdiskless Linuxについては、次のHOW TOに詳細に述べられています。

次に、ホームページ「日本のLinux情報」にある、 リンク集の 「ディスクレスシステム」の項も参考になります。

一般的な事は、上記を参考にしてもらうとして、ここでは、知能工学科固有の 事について述べます。


(0)NFSサーバー

diskless LinuxのNFS/bootp/xdmサーバーとしてIBM AIX 4.1を使用。他に SunOS4.1.4での設定経験あり。

(1)使ったソフトウエア

(2)Linuxのdistributionの選択

Linuxのdistributionの選択で悩みましたが、最近一番メジャーなLASER5製「日本語RedHat 5.2Rel2」をイ ンストールする事にしました。「日本語RedHat 5.2 Rel2」ですが、大まかにわ けて3種類あります。値段が10,800円の「製品版」と、4,200円の「インストー ルキット版」と、雑誌の付録に添付されている「フリー版」があります。今回 は、サポートの面を考え、サポート権ありの製品版を入手しました。以降、製 品版を基に記述しています。

(3)NICの認識

RedHat5.2 Rel2の標準カーネルは、Linux-2.0.36です。カーネルは、 NICの「IBM EtherJet ISA」に対応していません。インストール段階では、 NICの認識は不可能です。

NICの「IBM EtherJet ISA」は、ホームページ「Linux PCMCIA-driver for CS89x0 based PC-Cards」に置いてあるドライバ 「cs89x0.c」で認識可能です。もしくは、カーネルLinux-2.2.*では標準でサ ポートされています。私はカーネルをLinux-2.2.12にバージョンアップする事 により認識させました。カーネルのバージョンアップについては、日本語 RedHat5.2 Rel2製品版に添付されている書籍を参考ください。

(4)NFSサーバーへルートファイルシステムをコピー時の注意

私はtarを使い、HDDにあるRedhatの全ファイル・全ディレクトリをNFSサーバー へコピーしました。

(以降「ルートファイルシステム」という表現を使った場合は、このNFSサーバー にコピーしたRedHatの全ファイル・全ディレクトリを指します。)

RedHatのtarはGNU tarです。解凍する時にも必ずGNU tarを使用してください。 tarのオプションには「p」を忘れずに。パーミッションが復元されません。

ディレクトリ/proc以下はカーネルが管理しているディレクトリですので、コ ピーする必要はありません。空のディレクトリを掘ればいいです。/devについ ては、異種OSだとtarでは正常に解凍できません。NFS mountして同一OS間で コピーしてください。

(5)ルートファイルシステムの位置の変更

Linuxの標準カーネルでは、ルートファイルシステムはNFSサーバーの 「/tftpboot/``ip-address''」(例: /tftpboot/192.168.1.2 等)に固定されて います。ip-addressはdiskless Linuxのip-addressです。都合によって、これ を変更するには、次のパッチ を参考にして修正してください。このパッチは「/home/tftpboot/root」に変 更します。

(6)カスタムカーネルの構築

詳細はHOWTOを参照していただいて、付け加えるとすると、後でめんどくさい 事になるのでモジュールは使わない。次に、デバッグをしやすくするため、 localのHDDを認識しないカーネルを作ってください。デバッグ中に、一見正常 にdiskless起動したと思いきや、内臓HDDで起動していたりします。具体的に はIDE/SCSIすべて無効化。ext2 ファイルシステム無効化。

後は通常の方法で、make zdisk/make bzdiskでフロッピーに書き込んでくださ い。

次にカーネルのドキュメント「Mounting the root filesystem via NFS (nfsroot)」(/usr/src/linux/Documentation/nfsroot.txt)を参考にして、 /usr/sbin/rdevで起動デバイスをNFSにしてください。

私が今回のdiskless Linuxで使ったLinux-2.2.12用のカーネル設定ファイル /usr/src/linux/.configの設定 例。NICの設定とCPUの設定のみを変更すれば、他の環境でも使える「かも」 しれませんね。運が良ければですが。

このカーネルのdmesg。内容を編集し てます。また、後述の謎のパッチを適用しているので、標準的なLinuxのカー ネルと表示が異なります。

NFS サーバーは誰がなる?

上記で示したカーネル設定ファイルを使て作成したカーネルは、bootpを使い ネットワーク情報を引きだし、初期化します。bootpサーバーは同一subnet内 に存在する必要があります。またbootpサーバーが自動的にNFSサーバーになり ます。

もし同一subnet内に二つbootpサーバーが居たらどうなるのかな??

早く返事したもの勝ちです(^^;;。場合によってはセキュリティホールになり かねません。対策が必要ですが、今回は、特に行なっていません。

(7)RedHatの起動スクリプトの動作順序

詳しくは日本語RedHat5.2Rel2に含まれる「ドキュメントCD」に含まれる 「RedHat Boot Process Tips」(/redhat/support/index.html)を参考にして欲 しいのですが、簡単に書くと、 の順序です。「runlevel」とは、/etc/inittabで指定された数字でして、環境 によって異なります。詳しくはman initを参照ください。

(8)デバックしたいぞ。「sulogin」

さて、disklessとして起動できたとしても起動時にエラーがでたり、途中で止 まってしまってしまう事があります。デバッグ用に「sulogin」というコマン ドが用意されています。起動スクリプトの適当な所に書き加えれば、そこで login出来るようになります。

(9)diskless化して問題になりそうな点

NFSのルートファイルシステムに「fsck」をかけようとしてエラーになります。 swapパーティションの設定でエラーになります。他にもあるでしょう。

(10)NFS lockの問題

パーティションを分割している場合、"/"以外をNFSマウントした段階で次のエ ラーがでました。
  kernel: lockd_up: makesock failed, error=-13
ファイルシステムのlock関係でエラーを出しているようです。色々試してみた のですが、マウント時にオプション「-o nolock 」を追加する事により、エラー がでなくなりました。ですが、これが正しい解決法かはしりません。

(11)shutdown時のネットワークインターフェースの無効化

色々細工する事により、起動はできるようになったのですが、 shutdown/rebootが正常にできません。途中で止まってしまいます。調べてみ た所、shutdownのプロセス中で、ネットワークインターフェースを無効化して いるようです。無効化した段階でNFSが使えなくなったわけですね。shutdown 時に無効化しないようにしました。 /etc/rc.d/init.d/networkのパッチ。同様の問題で、NFSを無効化しても らっては困ります。 /etc/rc.d/init.d/nfsfsのパッチ

(12)シングルユーザーモードのセキュリティ的問題

UNIXには「シングルユーザーモード」というのがあります。起動時にオプショ ン「-s」を渡すと後はroot権限で何でもしほうだいです。最近のSolarisでは、 パスワード入力を求められるのですが、RedHat5.2はパスワード不要です。こ れを解決する方法を考えたのですが、安直に/sbin/initを改造して、「-s」オ プションを無視するようにしました。パッチは誤って消しました(^^;;。

なお、この修正を行うと、何者もシングルユーザーモードにできなくなります。

追記(2000年4月): この問題は他でも問題視されているようで、一般的な解決 法を雑誌で読みました。(たしか日経なんとか。。) 私の方法では何者もシン グルユーザーモードにできなくなりますので、何かと困るでしょう。 /etc/inittabにこの修正 を行うと、シングルユーザーモードになる時にパスワード入力を求めてき ます。

(13)少しぐらい遊んでしまえ(1)

謎のパッチ。/etc/redhat-releaseのパッチ

(14)不必要なデーモンは止めてしまいましょう

diskless Linuxは基本的にメモリだけで動作します。不必要な デーモンは止めてしまいましょう。

X端末化し、remote login 不可にするなら、次までデーモン数を減らせます。 ps の出力例をあげておきます。 デーモンの起動・非起動の操作はlinuxconfで変更可能です。

(15)時計は合ってないと。

ネットワークで時計を合わせるシステムは、NTPが有名です。でもdisklessシステム だと、頻繁に電源のOn/Offされるし、メモリが不足が問題になりますので、起動時 に一度だけ時計を合わせましょう。「 /etc/rc.d/rc.local」のパッチ。(注:「ルートファイルシステムread onlyにす る事によって起きる問題点」に関するパッチも含まれます。)

(16)X端末にするには?

X端末にするにはXのサーバー「/usr/X11R6/bin/X」を次のようなオプションで、 xdmサーバーを指定し、起動すれば良いです。
   /usr/X11R6/bin/X -query xdm-server
問題は誰にこのコマンドを実行させるかです。私は/sbin/initに実行させる 事にしました。設定ファイルは/etc/inittabです。なおX端末のrunlevelは、 5と規定されているので、runlevelを5に変更しています。/etc/inittabの 設定例

(17)loginプロンプトの削除

LinuxやFreeBSDなどにはloginプロンプトが複数あります。「Ctl+Alt+F1」/ 「Ctl+Alt+F2」などと操作すると、loginプロンプトがでて来ます。環境によっ ては、X端末専用化し、login不可にしたい場合があります。その場合は、 loginプロンプトを止めてしまいましょう。loginプロンプトは、/sbin/initが 起動しています。設定ファイルは/etc/inittabです。 設定例

rlogin/telnetは、デーモンのinetdが担ってます。設定ファイルは /etc/inetd.confです。inetdは他のサービスも担当していますが、 /etc/inetd.confを吟味し、不必要なサービスを止めてしまいましょう。 全部必要なければ、デーモンinetdを止めてしまいましょう。

(18)フォントの追加

xdmサーバーがLinuxやFreeBSDの場合は、標準的に提供されているフォントで、 99.9%問題なく動作します。ですが、xdmサーバーが商用UNIX(Solaris/AIX等) の場合、フォントが足りなくて化け化けになる場合があります。フォントを追 加しましょう。

まず、正常に表示できているマシンで、「xset -q」を実行し、「Font path」 を確認します。フォントパスを元に足りないフォントを探してください。そし て、xdmサーバーで、font サーバーを立ち上げるか、ルートファイルシステム にコピーして、/etc/XF86Configにフォントパスを追加してください。なお、 フォントをコピーする場合は、ライセンス的にコピー可能かをメーカーに確認 してください。

なお、フォントの拡張子が、「.pcf」以外の場合は、Xのサーバーが対応して いない場合があります。

(19)root権限でread/writeを許可する事の危険性

通常diskless Linuxでは、root権限でread/write可能の状態でNFS mountして います。

そこで、次の事実があります。

Linuxはフロッピー2枚にOSから何から入れてしまう事ができる。

という事は、誰にでもdisklessマシンのroot相当の権限は簡単に手に入れる事 はできます。すなわち、誰にでも自由にNFS mountし、ファイルを操作する事 ができます。すると、次のような事ができてしまいます。

   cd /tmp
   cp /bin/rm .
   chown root.root rm
   chmod ug+s rm
もし、NFSサーバーに悪意を持ったユーザーがloginできるなら。。。

前記の問題を簡単に回避するには次の方法が考えられます。「ルートファイル システムをread onlyにする。」しか思いつきません。

MACアドレスは書き換え可能です。

(20)ルートファイルシステムをread onlyにする事によって起きる問題点

(当然ですが)OS動作時に書き込みが起こるファイルがあります。それが障害に なります。調べた限りでは次のファイルが問題になります。
   /etc/issue.net
   /etc/issue
   /etc/ioctl.save
   /etc/adjtime
   /etc/mtab
   /etc/ntp.drift
   /dev/*tty*
   /dev/console
   /dev/printer
   /dev/log
   /dev/urandom
   /dev/initctl
   /var/*
   /tmp/*
   /root/.history
   /usr/X11R6/lib/X11/xkb/compiled/*
以上のファイルがread onlyでもエラーがでるだけで、立ち上がる事は立ち上 がりますが、loginできません。どうやら/dev/*tty*がread onlyだとloginで きないようです。

(21)書き込めるようにRAM diskを使う

上記の問題をどう解決するかですが、Linuxには「RAM disk」というのが用意 してあります。
   kernel: RAM disk driver initialized:  16 RAM disks of 40
これを使う事にします。

OS動作時に書き込まれる可能性のあるファイルをboot時に、RAM diskに格納し、 shutdown/reboot時にRAM diskを廃棄します。

私の構成では、/var、/devのみをRAM disk化し、/etc以下のファイルは/var以 下に適当なディレクトリを作成しsymbolic linkで対応しました。但し /etc/mtabだけはsymbolic linkすると正常に動作しなくなるようです。このファ イルが存在しないと、少なくともdfが動作しません。解決策がなかったので、 無視しました。なお、df相当の情報は/proc/mountで得る事ができます。/tmp は/var/tmpへsymbolic linkしました。

この方法の問題点として、メモリが少ないマシンでは、/var/tmp等に割り当て る事が出来る容量が限られてしまうという事です。/tmp・/var/tmp等に巨大な 作業ファイルを作るアプリケーションを走らせたらすぐに限界が来ます。です が、X端末専用としてなら、ほとんど/var/tmpに作業ファイルを作らないので、 特に問題にならないでしょう。

Thanks: このアイディアはの一部は、次のホームページ「 Linuxでルートファイルシステムを共有する方法」によります。

(22) logサーバー

上記のRAM diskを使う方法には、問題点があります。システムのログが shutdown時にすべて廃棄されてしまいます。気休めですが、syslogの設定 を変更し、別のマシンにログを転送する事にしました。「/etc/syslog.conf」の設定例。 もちろんsyslogが関与しないシステムのログは残りません。改善の余地あり。

(23) 最低必要な/devはどれかな?

/dev/以下は、Linuxで使用可能なデバイスすべてが置かれているため、実際に は、必要無いデバイスも多数あります。HDDが大量にある環境なら良いですが RAM diskに/devを格納すると、すぐに容量(i-mode)が不足します。

必要無いのは消してしまいましょう。選択時には、Linuxのカーネルのドキュメント 「Linux Allocated devices」(/usr/src/linux/Documentation/devices.txt)が参考に なります。

私は最初に挙げた計算機の構成で、この 一覧のまで減らしました。まだ減らせると思います。

(24) 少しぐらい遊んでしまえ(2)

謎のパッチ /usr/src/linux/Makefile謎のパッチ /usr/src/linux/init/main.c

(25)設定ファイルを共有化してしまおう

大学の計算機センターの場合は、計算機が100台あっても珍しくありません。 それぞれのdiskless Linuxに対して、NFSサーバーでルートファイルシステム を用意するとディスク容量がいくらあっても足りません。

また、大学は、入札で同時期に大量に購入するため、同じ構成の計算機が多数 ある事が多いです。そうなると、それぞれの設定で異なるのはネットワーク周 りだけです。

ネットワークの設定ファイルをRAM diskに格納し、起動時に書き換えてしまえ ば、ルートファイルシステムは共有できます。

(26)設定例

上記のような設定を行った例をあげます。次のようなフォーマットの 「/etc/conf.diskless」を用意します
     HOSTNAME:IP-ADDRESS:MAC-ADDRESS:X-Server:XConfig
例:
     diskless:192.168.1.2:00-11-22-33-44-55:/usr/X11R6/bin/XF86_SVGA:/etc/X11/XF86Config
MAC-ADDRESSはifconfigの出力とほぼ同じ形式でにしてください。ifconfigの 種類によっては、先頭の0を省略する場合があります。そして":"を"-"に変え て記入してください。(最後の「X-Server:XConfig」は実装してません(^^;;)

この設定を基に/etc/rc.d/rc.sysinitが初期化します。詳しくはサンプルを読んでね。

/etc/rc.d/rc.sysinitで使われるファイルを説明します。

さらに次のファイルを書き換えます。 間接的に、/var/etc/NETMASK, /var/etc/IPADDR /var/etc/HOSTNAMEを参照し ます。

(27)その他、セキュリティ関係

ルートファイルシステムにあるsetuidのスクリプト/プログラムには、どんな のがあるか確認し、必要無いのはsetuidを外してしまいましょう。

ルートファイルシステムの誰でも書き込めるディレクトリをチェックし、必要 なければ書き込み不可にしてしまいましょう。

X端末専用化するなら、/etc/passwdのrootのパスワードを"*"で置き換えて、 潰してしまいましょう。

(28)少しぐらい遊んでしまえ(3)

xdmサーバー向けの、謎の設定ファイル謎の設定

(29)カーネル読み込み時間を短縮しよう

Linuxのカーネルは、最低でも400kbyteはあるため、フロッピーでは、読み込 みに時間がかかります。これを短縮するアイデアです。

UNIXには、tftpというプロトコルがあり、誰でも無許可でファイルを転送でき ます。起動フロッピーにはtftpでファイル転送を行えるだけの機能を提供し、 tftpを使ってカーネルを転送すれば短縮できます。

上記の事はetherbootを 使用すれば可能です。約16kbyte程度の大きさで実現されています。

ですが、対応しているNICは限られているため、すべての環境で使用可能では ありません。etherboot-4.2.6現在では、「IBM EtherJet ISA」は対 応していますが、不完全なため、使用できませんでした。「IBM EtherJet ISA」 固有の問題点として、次のものがあげられます。

tftpの設定でコメントしておくと、tftpのサーバーの設定は/etc/inetd.confで 行います。次に、ディレクトリ/tftpbootのパーミッションを確認してくださ い。またtftpテスト用に「tftp」というコマンドがあります。このコマンドで ファイルの取得可能かテストしてください。同時に必要無いファイルまで転送 できたりしないか、書き込めたりしないかのテストも行ってください。

(30)設定変更時に確認すべきファイル一覧

思いついたもののみ。抜けがあるかもしれません。

(31) 最後に

設定中にルートファイルシステムのファイルを書き換えているつもりで、間違っ てNFSサーバーのファイルを書き換えないようにね!

(32)著作権について

Copyright(C) 1999 Ryuji Matsumoto.
E-mail: matumoto@pluto.ai.kyutech.ac.jp