Shino's Bar Linux Stuff

走れパピーPuppy Linux core logo


Go to走れパピー 目次 / パピー・リナックスのネットワーク・インストール 後編
8 Apr 2009 initrdgz_editorの紹介 (初出:21 Mar 2009)

パピー・リナックスのネットワーク・インストール

ファイルサーバーを用意して、これからネットワークを通じて別のパソコンにLinuxをインストールする方法です。 CDドライブが無いなど、適当なブートアップ手段が無いが、ネットワークからのブートができる場合に有効です。 私がこの方法を取ったのは、次のようないくつかの理由からです。

  1. CDドライブからのブートに失敗するパソコンがある。

    ASUSのマザーボードP5E(チップセットはIntel X38)とPATAのドライブとの組合せで、 最近のLinuxカーネルだとこれを認識せず、インストールが中断する。 Vine Linux 4.2はインストールできたが、Ubuntu Linux 8.10は アウト。 Puppy Linuxについては後述。

    X38チップセットそれ自体にはPATAのチャンネルは無く、別にに搭載のJmicronのコントローラが橋渡ししています。 最近のLinuxカーネルでは、これがうまく働かないというのが原因のようです。 なので、無理矢理インストールしてもPATAのドライブは使えません。

  2. ふだんはCDドライブを接続していないパソコンがある。

    今回ファイルサーバに使ったパソコンがそれですが、 ハードディスクをめいっぱい積むために、 インストールのときだけCDドライブを接続し、 インストールが終わればそこにハードディスクを繋げるということをしていました。 ちょっと面倒ですよね。

  3. 簡便なレスキュー手段が欲しかった。

    インストールの失敗とかハードディスクの事故などでOSが立ち上がらなくなったとき、 レスキュー用のCDで作業とかするわけだけど、 そのたびにKNOPIXとか立ち上げるのもかったるいし、 できない場合もある。

    じつはこの理由がいちばん大きく、何かコンパクトなLinuxは無いものかと探していましたが...。

    ありました。Puppy Linuxがそれです。インストールに必要なファイルサイズがおよそ100Mバイト。 ハードディスクをまったく使わなくても、128MB以上の実装があればRAM上で動作するとか。

必要なもの

  1. ファイルサーバ(tftpサーバ)となるべきコンピュータ。

    Windowsでも可能だが、ここでは Vine Linux 4.2が走っているものを使う。 ここに必要なソフトは tftp-server

  2. DHCPサーバーとなるべきコンピュータ。

    ルータなどに内蔵されているDHCP機能はたぶんこの用途に使えない。 上のtftpサーバが兼務してよい。 必要なソフトは dhcpd

  3. インストールされる(ターゲット)コンピュータ

    これはネットワークブート(あるいはPXEブートなどと呼ぶ) ができるものでなければならない。

今回は1と2とを兼用。Vine Linux 4.2が走っています。 これをサーバと呼ぶ。 3は中古で入手したノートブックThinkPad X21でメインメモリを320MBに増設してあります。これをターゲットと呼ぶ。 ターゲットにインストールしたいOSは Puppy Linuxです。

もちろん2台をつなぐネットワーク環境は要りますよ。 ルーターとかハブとかいうやつ。と、それぞれのLANケーブルですね。 クロスケーブルで2台を直結なんてこともできなくはありませんが...。

ブートアップの仕組み

- コンピュータ、ソフト無ければただの箱 -

昔のコンピュータは本当に何も入っておらず、電源を入れただけではうんともすんとも言わなかった。 今のパソコンにはROMが内蔵されており、そこに最小限のプログラムが仕組まれていて、 たとえばハードディスクなどに格納された大きなプログラムを読み込むことができる。 ...と、一口に言ってしまえば済んでしまいそうだが、話はもう少し複雑。

建設中のビルの姿を見ることがある。 ずいぶん高いところでクレーンが仕事をしている。 あのクレーン、どうやってあの高いところに上げたのかというと、 それも別のクレーンで上げるわけです。 高層のビルだと、一気にそこまで上げることはできず。 順々にクレーンを使わなければならない。

パソコンにソフトを入れるのも同じで、 ROMにある最小のプログラムから、OSというでかいプログラムをロードするまでに何段階かを経由する。 多くのLinuxの場合、おおむね次のような手順となります。

(0)BOOT-ROM

(1)イニシャル・プログラム・ローダー(IPL)
あるいはローダーの第1ステージ

(2)ローダー
あるいはその第2ステージ

(3)カーネル(vmlinuzなど)

(4)初期システム(initrd.img あるいは initrd.gz など)

(5)OSの残りの部分

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 という名前に変更して納め、 また包み込めばよいということになります。 以下の手順でやります。

  1. Puppy Linux のCDイメージ(ISOファイル)をダウンロードする
  2. パピーリナックス日本語版サイト からダウンロードサイトへ行って、 puppy-4.1.2-retro-JP.isopuppy-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 ファイルは正しくダウンロードできています。

  3. CDイメージを展開する
  4. すでに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の中身がコピーされました。

  5. initrd-large.gz を作る
  6. 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

tftp-serverのインストールと設定

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 を覗いて見れば手がかりが残されているかもしれません。

dhcpdのインストールと設定

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上で動きます。 外していたルーターなどがあればもとに戻して構いません。 ターゲットのハードディスクにインストールするには、もう少し準備が必要です。 それについては、See next後編を。

Puppy Linux のバージョンについて

執筆時点で 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つとも用意することに。

参考ページ