ファイルサーバーを用意して、これからネットワークを通じて別のパソコンにLinuxをインストールする方法です。 CDドライブが無いなど、適当なブートアップ手段が無いが、ネットワークからのブートができる場合に有効です。 私がこの方法を取ったのは、次のようないくつかの理由からです。
ASUSのマザーボードP5E(チップセットはIntel X38)とPATAのドライブとの組合せで、 最近のLinuxカーネルだとこれを認識せず、インストールが中断する。 Vine Linux 4.2はインストールできたが、Ubuntu Linux 8.10は アウト。 Puppy Linuxについては後述。
X38チップセットそれ自体にはPATAのチャンネルは無く、別にに搭載のJmicronのコントローラが橋渡ししています。 最近のLinuxカーネルでは、これがうまく働かないというのが原因のようです。 なので、無理矢理インストールしてもPATAのドライブは使えません。
今回ファイルサーバに使ったパソコンがそれですが、 ハードディスクをめいっぱい積むために、 インストールのときだけCDドライブを接続し、 インストールが終わればそこにハードディスクを繋げるということをしていました。 ちょっと面倒ですよね。
インストールの失敗とかハードディスクの事故などでOSが立ち上がらなくなったとき、 レスキュー用のCDで作業とかするわけだけど、 そのたびにKNOPIXとか立ち上げるのもかったるいし、 できない場合もある。
じつはこの理由がいちばん大きく、何かコンパクトなLinuxは無いものかと探していましたが...。
ありました。Puppy Linuxがそれです。インストールに必要なファイルサイズがおよそ100Mバイト。 ハードディスクをまったく使わなくても、128MB以上の実装があればRAM上で動作するとか。
Windowsでも可能だが、ここでは Vine Linux 4.2が走っているものを使う。 ここに必要なソフトは tftp-server 。
ルータなどに内蔵されているDHCP機能はたぶんこの用途に使えない。 上のtftpサーバが兼務してよい。 必要なソフトは dhcpd 。
これはネットワークブート(あるいはPXEブートなどと呼ぶ) ができるものでなければならない。
今回は1と2とを兼用。Vine Linux 4.2が走っています。 これをサーバと呼ぶ。 3は中古で入手したノートブックThinkPad X21でメインメモリを320MBに増設してあります。これをターゲットと呼ぶ。 ターゲットにインストールしたいOSは Puppy Linuxです。
もちろん2台をつなぐネットワーク環境は要りますよ。 ルーターとかハブとかいうやつ。と、それぞれのLANケーブルですね。 クロスケーブルで2台を直結なんてこともできなくはありませんが...。
昔のコンピュータは本当に何も入っておらず、電源を入れただけではうんともすんとも言わなかった。 今のパソコンにはROMが内蔵されており、そこに最小限のプログラムが仕組まれていて、 たとえばハードディスクなどに格納された大きなプログラムを読み込むことができる。 ...と、一口に言ってしまえば済んでしまいそうだが、話はもう少し複雑。
建設中のビルの姿を見ることがある。 ずいぶん高いところでクレーンが仕事をしている。 あのクレーン、どうやってあの高いところに上げたのかというと、 それも別のクレーンで上げるわけです。 高層のビルだと、一気にそこまで上げることはできず。 順々にクレーンを使わなければならない。
パソコンにソフトを入れるのも同じで、 ROMにある最小のプログラムから、OSというでかいプログラムをロードするまでに何段階かを経由する。 多くのLinuxの場合、おおむね次のような手順となります。
CDからブートする場合は(0)だけがターゲットのコンピュータ内にあらかじめ存在しており、 (1)〜(5)がCD上にあるという形です。
ネットワーク・ブート(PXEブートなどとも呼ぶ)では、 (0)は同じですが (1)の部分も LANカード内のROMなどの形で、ターゲットのコンピュータ内に存在するものを利用します。 tftpサーバは(2)(3)(4)を供給。 最後の(5)はどうするかというと、 (tftpではなく)FTPであるとか、他の手段で供給するのが一般的です。
サーバが用意すべきローダ(2)ですが、 pxelinux を使います。 Vine Linux 4.2ではsyslinuxパッケージを インストールすると /usr/lib/syslinuxディレクトリ内に pxelinux.0 というファイルがあります。
あとはインストールしたいOS(この場合 Puppy Linux)のインストールCDに揃っています。 (3)に相当するものが vmlinuz, (4)に相当するものが initrd.gz, (5)に相当するものは pup_412retroJP.sfs などというファイル名になっています。
ところで、多くのLinux、そして Puppy Linuxも、この(5)に相当する部分を
tftpからダウンロードできません。
そこでいろいろな方法が採られるのですが、
ここではこういう方法でやります。
...(4)と(5)に相当するファイルを、1つのファイルにまとめてしまいます。
すなわち、initrd.gz + pup_412retroJP.sfs → initrd-large.gz
Puppy Linuxはその起動のとき、 initrd.gzを展開して、 その中に pup_412.sfs という名前のファイルがあれば、それを取り込みます。 なので、initrd.gzをいったん展開し、 その中(のトップディレクトリ)にpup_412retroJP.sfs を pup_412.sfs という名前に変更して納め、 また包み込めばよいということになります。 以下の手順でやります。
パピーリナックス日本語版サイト からダウンロードサイトへ行って、 puppy-4.1.2-retro-JP.iso と puppy-4.1.2-retro-JP.iso.md5.txt とをダウンロードします。
注意! この記事によるネットワーク・インストールが適用できるのは、このバージョンあるいは以前のバージョンだけです。 puppy-4.1.2.1 では後述の理由のために失敗します。
ダウンロードしたディレクトリに入って、次のコマンドでファイルが正しいかチェックします。
md5sum --check puppy-4.1.2-retro-JP.iso.md5.txt
何もエラーが出てこなければ、puppy-4.1.2-retro-JP.iso ファイルは正しくダウンロードできています。
すでにCDに焼いているなら、それをマウントして、その中身をそっくり別の作業用ディレクトリ たとえば ~/puppy に cp -a でコピーしてやるだけです。 ここでは、ダウンロードした CDイメージ・ファイルをループバック・マウントし、取り出す方法を示します。 Puppy Linuxがインストールされたパソコンがすでにあるのなら、ISO MasterというGUIのソフトを使うこともできます。 以下はいずれかのLinux上でコンソールからコマンドを打つ場合です。
rootで作業します。CDイメージ・ファイルはカレントディレクトリ、~/ にあるものとします。
mkdir /mnt/tmp mount -o loop -t iso9660 puppy*.iso /mnt/tmp cp -a /mnt/tmp puppy umount /mnt/tmp rmdir /mnt/tmp
これでディレクトリ~/puppy 内にCDの中身がコピーされました。
initrd.gzを作業用ディレクトリに展開し、そこにpup_412retroJP.sfs を pup_412.sfs という名前でコピー、 これらからinitrd-larg.gzを作ります。
オリジナルのpup_412*.sfsはrootユーザーでないと読めません。 のちのちのために、一般ユーザーからも読めるよう設定しておきます。
cd puppy chmod 644 pup_*.sfs mkdir work cd work zcat ../initrd.gz | cpio -id cp ../pup_412*.sfs pup_412.sfs find . | cpio -oc | gzip -c > ../initrd-large.gz cd .. rm -fr work cd ..
これでディレクトリ~/puppy 内に initrd-large.gz ができました。
Puppy Linux上では isoファイルを1クリックするだけでループバックマウント、中身を取り出せます。 また initrd.gzを編集できる便利ツール initrdgz_editorがあります。
ディレクトリの構成と必要なファイルは次のようになります。
/var/ftp/pxeboot/ -+- pxelinux.0 | +- pxelinux.cfg/ -+- default | +- boot.msg | +- puppy/ -+- vmlinuz +- initrd-large.gz
サーバー上のどこでもいいですが /var/ftp/pxeboot というディレクトリを作り、 これをtftpのトップ・ディレクトリとします。 ここに、さきの pxelinux.0 を置きます。 さきほど作業した puppyディレクトリも、ここへそっくり移します。 また、新たに pxelinux.cfg というディレクトリを作ります。 その中に/var/ftp/pxeboot/puppy の中から boot.msg をコピーしてきます。 /var/ftp/pxeboot/puppy の中から isolinux.cfg をコピーし、 defaut という名前に変えます。
rootユーザーで作業します。
mkdir /var/ftp/pxeboot cd /var/ftp/pxeboot cp /usr/lib/syslinux/pxelinux.0 ./ mv ~/puppy ./ mkdir pxelinux.cfg cp puppy/boot.msg pxelinux.cfg cp puppy/isolinux.cfg pxelinux.cfg/default
/var/ftp/pxeboot/pxelinux.cfg/default を次のように書き換えます。
# /var/ftp/pxeboot/pxelinux.cfg/default default puppy display boot.msg prompt 1 label puppy kernel puppy/vmlinuz append initrd=puppy/initrd-lage.gz timeout 50
Vine Linux 4.2の場合 tftp-server と、 テストのために tftpもインストールしておきます。 またxinetd 、依存性によりtcp_wrappersも入ります。 Ubuntu Linux の場合 tftpにはいろいろありますが、 tftpd-hpa と tftp-hpa が良いようます。
Vine Linux 4.2のtftp-serverは inetdと組み合わせて使うように設定されています。 が、ここでは inetd の代わりに xinetd を使います。
/etc/xinetd.d ディレクトリに、tftpという名前のファイルがあればその内容を次のように変更。 なければ新しいファイルを作ります。 /var/ftp/pxeboot はさきほど作った tftpのトップディレクトリ名です。 192.168.0.0/16 の部分はそれぞれのネットワーク環境に合わせます。
# /etc/xinetd.d/tftp service tftp { protocol = udp port = 69 socket_type = dgram wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/ftp/pxeboot only_from = 192.168.0.0/16 only_from += 127.0.0.1 disable = no }
xinetdをリスタートします。rootユーザーになって、
/sbin/service xinetd restart
少なくとも自分のところからtftpでファイルをゲットできるかどうか試します。 コンソールから、
cd tftp localhost tftp> get pxelinux.0
と打って、カレントディレクトリに pxelinux.0がサイズ0ではなくちゃんとロードできていればOKです。 tftp> からは quit と打てば終了します。 うまくいかないようなら rootユーザーになって /var/log/message を覗いて見れば手がかりが残されているかもしれません。
DHCPサーバはtftpサーバと同じであってもよいし、同じネッワーク上の別のコンピュータであってもかまいません。 dhcpd(dhcpcdではありません)がなければインストールします。Vine Linuxでは dhcp という名前のパッケージになっています。
ネットワークとサーバーおよびターゲットのアドレスを決めます。 すでにネットワーク上で稼働しているならば /sbin/ifconfig コマンドで 現在のIPアドレスが知られるので、そのままにするのが良いでしょう。 たとえば ネットワークは 192.168.11.0/24、サーバーのIPアドレスを 192.168.11.200 とします。 サーバーの(eth0などのネットワークディバイスの)IPアドレスが設定されていないか、 DHCPによる自動取得になっている場合は、これをを固定します。
ターゲットのアドレスは同じネットワーク上で空いているところに取ります。 192.168.11.100 以降あたりにするとすれば、dhcpdの設定ファイルである /etc/dhcpd.conf は最小限で次の太字になります。 インターネットに接続したいときは routers と domain-name-servers の適切な設定も必要です。
ddns-update-style interim; subnet 192.168.11.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.11.100 192.168.11.110; option routers 192.168.11.1; option domain-name-servers 192.168.11.1; next-server 192.168.11.200; filename "pxelinux.0"; }
すでにネットワーク上のLinuxボックスでDHCPサーバーを運用しているならば、 設定ファイルに上記のうち next-server の行と finename の行を適切な位置に追加するだけです。
設定ができれば dhcpd をリスタートします。
/sbin/service dhcpd restart
エラーがあるようなら /var/log/message を覗いて見てください。
同じネットワーク上に DHCPサーバーが複数あっては困るので、 他に DHCPサーバーを動かしているものがあれば停止するか、ネットワークから一時的に切り離します。
ターゲットのパソコンはネットワーク・ブート(PXEブート)機能を持っていなければなりません。 通常この機能は停止されているはずです。 BIOSの設定で、その機能を有効に設定します。 設定の箇所は複数あるかもしれませんので、BIOSの設定画面のあちこちを探し回ってください。
今回のターゲットは ThinkPad X21です。 電源を入れてすぐに [F1]キーを押せば、 BIOS設定画面が現れます。 が、ここで設定する必要はないようでした。 いったん電源を切り、電源を再投入してすぐに [F12]キーを押せば、ブートデバイスの選択画面となります。 ここで Network Boot というので試したところ、動かず。 じつはこれではなく、 Intel(R) Boot Manager というのを選択するのが正解でした。
うまくいけば DHCPを取得後に/pxelinux.cfg 内の設定ファイルを探しに行く次のような感じのメッセージが流れ、 その後 Puppy Linux の起動画面が現れます。
Trying to load: /pxelinux.cfg/01-88-99-aa-bb-cc-dd Trying to load: /pxelinux.cfg/C000025B Trying to load: /pxelinux.cfg/C000025 Trying to load: /pxelinux.cfg/C00002 Trying to load: /pxelinux.cfg/C0000 Trying to load: /pxelinux.cfg/C000 Trying to load: /pxelinux.cfg/C00 Trying to load: /pxelinux.cfg/C0 Trying to load: /pxelinux.cfg/C Trying to load: /pxelinux.cfg/default
Xの設定ではThinkPadの液晶パネルを自動では検出しないので、 手動で LCD Panel 1024x768 を選択してください。
以上で Puppy LinuxはターゲットのRAM上で動きます。 外していたルーターなどがあればもとに戻して構いません。 ターゲットのハードディスクにインストールするには、もう少し準備が必要です。 それについては、後編を。
執筆時点で Puppy Linux 日本語版の最新バージョンは 4121JP ですが、 ここでの方法を採るとインストールに失敗します。 その理由はたぶんシステムが大きくて、展開に失敗する。 例えて言えば小さなクレーンでいきなり大きなクレーンを上げようとするからでしょう。 ここでの方法が使えるのは 412JPまたは 412retroJPです。
412JPと 412retroJPとの違いはカーネルのバージョンです。 ThinkPad X21はどちらもOKですが、 ASUS P5Eで412JPを使うと PATAが認識できません。
というわけで、我が家のネットワーク・インストールは Puppy Linux 412retroJP を標準としました。 その後 4121retroJP にバージョンアップするのですが、その方法ものちほど。
と、思ったら、ASUS P5Q SE マザー(チップセット:Intel P45, PATAコントローラ: Marvell 88SE6102)では逆に retroではPATAドライブが認識できず、 標準カーネルのほうで認識できました。 なので、retroと標準と2つとも用意することに。