槻ノ木隆のPC実験室

Gigabit Ethernet対応「玄箱」(Part2)
~USBを使えるようにする




●安直な方法はやめましょう

 さて、Part2ではUSBポートで色々遊んでみたいと思う。前回のレポートにも書いた通り、玄箱/HGのボード裏面にNECのD720101GJ)が搭載されており、そのUSB 2.0ポートがフロントパネルとバックパネルに1つずつ用意されている。前回の玄箱の時も、murasakiを色々いじる事で最終的に解決したので、さて今回も...と思った矢先に、玄人志向のHELP ME! BBSにものすごく気になる情報が投稿された。「USB設定メニューを表示する」と題されたGan氏の投稿によれば、perlのスクリプトを1カ所書き換えるだけで、USB設定メニューが出現するという。これが事実なら、全然murasakiと格闘する必要なんぞないわけで、「この通り動きました。終わり」になってしまう。

 ということで、早速検証してみた結果がコレである(写真01)。サイドバーこそ変わっていないが、設定メニューに「USB設定」項目が出現している。USB設定を選ぶと(写真02)、サイドバーまで出現しているのはご愛嬌として、ここでUSB情報を選ぶと、試しに付けてみた「これdo台 expert KD-2/FUL」もちゃんと見えている。ならば早速これをUSBディスクとして使用する設定(写真04)を、とやってみても、残念ながら全く反映されない。写真04には「USBディスクのフォーマットは『メンテナンス』-『フォーマット』から行うことが出来ます」とあるが、フォーマットもディスクチェックも、どちらもUSBディスクが選択肢に出てこないから、事実上使うのは無理である。

【写真01】サイドバーは変わらないが、設定画面に「USB設定メニュー」が 【写真02】それなりに動きそうに見える
【写真03】「これdo台 expert KD-2/FUL」が見えているのが【写真04】なんとなくそれなりに全部使えそうな雰囲気なのだが

 「やはり中途半端な改造だからダメなんであって、全メニューを書き換えないとマズイか?」と思ったが、玄箱の/www/cgi-bin/ の下を見てみると、こうした条件分岐が行われているのは

hdd-check.pl
mellib.pl
mellib_html.pl
top.pl

の4つで、全部で30個以上ある。しかも、単純に条件分岐をひっくり返せば済むというものではなく、ちゃんとソースを読んで判断しなければならない。1個1個は大した難易度ではないのだが、これだけあるとちょっと面倒である。

 ちなみに内部では変数の値を見て条件分岐をしているわけだが、そうした変数の値を設定しているのは、mellib.plというファイルである。ちょっと先頭を示すと

#!/usr/bin/perl
#use strict;
########################################
# 設定 #
########################################
########################################
# Link Station Model Name設定
# このFWを搭載するモデル名を入力。
# 空の場合、$fileASCONFよりモデル名を自動取得する
$defMODEL = 'KURO-BOX';

# 状態判定用のモデル名宣言(変更禁止)
$defModelLAN = 'HD-LAN';
$defModelHLAN = 'HD-HLAN';
$defModelHGLAN = 'HD-HGLAN';
$defModelKUROBOX = 'KURO-BOX';
########################################
(以下略)

てな事になっている。玄箱/HGの場合はdefMODELがKURO-BOXに設定されているが、他のモデルであればまた別の値(HD-LANだったりHD-HGLANだったり)になるわけで、PerlのスクリプトはこのdefMODELの値を見て判断しているわけだ。「なら、いっそdefMODELを"HD-HGLAN"に書き換えてしまえ!」というのは割と安直だが効果的な解決法である。HD-HGLANシリーズは、GbEと2ポートのUSBを持つ、要するに玄箱/HGの基になったモデルだから、これを書き換えればちゃんと動作しても不思議ではないわけだ。で、このmellib.plの先頭をviなどで

#!/usr/bin/perl
#use strict;
########################################
# 設定 #
########################################
########################################
# Link Station Model Name設定
# このFWを搭載するモデル名を入力。
# 空の場合、$fileASCONFよりモデル名を自動取得する
$defMODEL = 'HD-HGLAN';
(以下略)

に書き換えた結果がコチラ(写真05)である。サイドバーには“USB設定”が出現したし、画面左上には“BUFFALO”、左上には“Link Station”の文字が出てくることからもわかる通り、間違いなくHD-HGLANとして動作している。では、USB HDDのハンドリングができるようになったか? というと、相変わらずこの状態(写真06)である。そこで、HD-HGLANのスペックを再確認してみると、このあたりの説明を読む限りは普通にUSB HDDを利用できるように見えるのだが、こちらには対応USB HDDはバッファローの製品のみであることが明記されている。どうも、バッファローのUSB HDD以外は未対応ということらしい。

【写真05】ついにメーカー名も製品名も変わってしまった 【写真06】選べるのは内蔵HDDだけ

 ざっとcgiのソースを読んだ限りでは、起動の際に対応HDDが接続されているかどうかを判断して、それをパラメータとして持っているようで、従ってその他のUSB HDDを接続しても動作しないのは仕様の模様だ。逆にいえば今のままでも、バッファローのUSB HDDを接続すれば使えるのかもしれないが、残念ながら筆者は持ち合わせがないし、どうせだったら好きなUSB HDDを接続出来るほうが便利である。やはり、cgiをちょろっとだけいじってOK! というのは考えが甘かったようだ。

●USB HDDを使えるようにする

 というわけで、もう少し真面目に、USB HDDを使える方法を説明したい。基本的には前回玄箱で行なった手順と同じであるが、前回から玄箱側のファームウェアでいろいろ対策されているので、まずはこのあたりからちょっと説明しておこう。まずはUSB HDDのマウントとフォーマットである。以降は下記のログを参照しながら読み進めて頂きたい。カッコ内の数字は下記ファイル内のものである。

Linuxログ(PDF版)
Linuxログ(word版)

 まず起動した直後に/proc/busを見てみると(リスト1の1)、既に /proc/bus/usb が作成されているのがわかる。同ようにmount状況を見てみると(リスト1の2)、すでにusbdevfsで/proc/bus/usbがロードされていることもわかる。このあたり、メインメモリが128MBに増強されたから、初代玄箱の時ほどケチケチする必要がないと判断されたのかもしれない。

 こういう事であれば、話は早い。早速fdiskを起動して、Partitionの作成を行う(リスト1の3-1)この例では、NTFSフォーマットされたDiamondMax Plus IIを接続したので、一覧を見てみると(リスト1の3-2)NTFS Partitionが見えている状態である。そこでまずNTFSパーティションを削除し(リスト1の3-3,3-4)、改めてHDD全体にPrimary Partitionを作成した後(リスト1の3-5~3-8)、Partition IDをLinuxに変更する(リスト1の3-9~3-11)。間違いなく設定できたことを確認したら(リスト1の3-12)、変更を反映して(リスト1の3-13)パーティション操作は終了である。次いで、Ext3でフォーマットし(リスト1の4)、マウントポイントを作ってから(リスト1の5)、そこに今フォーマットしたUSB HDDをマウントする(リスト1の6)。dfの結果で、ちゃんと/mnt2が見えていれば大丈夫だ(リスト1の7)。

 さて、次なるはsambaの設定であるが、実はここが玄箱のファームウェア Version 1.01から大きく変更された(玄箱/HGだけでなく、以前の玄箱もである)。詳しくはココにあるが、要点は

・murasakiを自動起動するようになった。
・sambaの設定ファイルが2つに分けられ、片方はユーザー書き換え可能になった。

という2点である。まず前者に関しては、前回のように/etc/rc.d/rc2.dを書き換えたりシンボリックリンクを張ったりする必要が無くなったわけで、これは手間が省けて楽である。次いで後者であるが、現在の玄箱や玄箱/HGの場合、/etc/sambaの下に

smb.conf
smb.conf.kuro

という2つの設定ファイルが置かれるようになっている。このうち smb.conf は玄箱のWeb設定画面に応じて変更されてしまうので、ユーザーが変更しても上書きされてしまう。これに対し、smb.conf.kuro はユーザーが変更したものがそのまま維持される。sambaはこの両方の設定ファイルを参照してサービスを行うので、要するにユーザーが新規に作る共有フォルダは、全部 smb.conf.kuro に記述しておけば良いということになる。初期状態におけるsmb.confはリスト2、smb.conf.kuroはリスト3のようになっている。そこでsmb.conf.kuroを、今マウントしたUSB HDDにあわせてリスト4のように書き換えてみる。書き換え終わったら、sambaだけ再起動してみよう。

root@KURO-BOX:~# /etc/rc.d/init.d/smb restart
Stop services: smbd nmbd
Start services: smbd nmbd
root@KURO-BOX:~#

 残念ながらこのsmb.conf.kuroに記述した項目は、Web設定画面には一切反映されないが、ネットワークをブラウズすると、ちゃんとUSB HDDが出現しているのがわかる。ルートディレクトリに“lost+found”なんていうUnixのファイルシステム特有のフォルダが見えているのが気になるのであれば、例えばUSB HDDを/mnt2にマウントした後で

root@KURO-BOX:~# mkdir /mnt2/share
root@KURO-BOX:~# chmod 777 /mnt2/share
root@KURO-BOX:~#

とした上で、smb.conf.kuroで指定するpathを“/mnt2”から“/mnt2/share”に書き換えれば良いだろう。いずれにせよ、以前に玄箱のUSB HDD対応を行なったときよりも、格段に容易にUSB HDD対応ができるようになったわけだ。

【お詫びと訂正】写真07/08はありませんでした。お詫びして訂正いたします。

●USB HDDをHot Plug & Playにする

 上の手順でとりあえずUSB HDDが利用できるようにはなったはずだ。ただ、このままではHot Plug & Playには対応してくれない。前回玄箱の時にはmurasakiの設定を行ない、ついでにオートマウント/アンマウントのスクリプトを作って対応したわけだが、玄箱/HGではこのあたりがもう少し簡単になっている。というのは、玄箱についてもファームウェアバージョン1.01からmurasakiが使えるように変更されており、これは玄箱/HGでも継承されているからだ。実際普段は全く動いていないが、既にある程度Plug & Playの機構が用意されているため、多少設定を変えるだけでPlug & Playが実現できる。

 いきなり手順を説明しても動きがよくわからないと思うので、まずは全体の流れを説明しよう。USBデバイスのHot plugした場合

カーネルでUSB Hotplugイベントが発生→hotplug.murasakiが呼ばれる→murasaki.usbが呼ばれる

という順で起動される。このmurasaki.usbは内部で

(1) カーネルから渡されたUSBデバイスに関する情報を取得する
(2) この情報と、murasaki.usbmap に記載された情報を比較し、デバイスを特定する。ここで一致しないと何もおきない。
(3) デバイスが特定できた場合、そのデバイスを利用するするのに必要なドライバを、murasaki.dependから読み取ってロードする。
(4) ドライバのロードが終わったら、murasaki.callを呼び出してモジュールに対応したスクリプトを実行する

といった形の動作をする。(本当は他にもmurasaki.blacklistやmurasaki.stickylist、murasaki.precallなどのファイルも関係してくるが、このあたりの詳細はmurasaki.usbの説明を参照されたい)また玄箱/HGでは、このmurasakiに対応したオートマウント/アンマウントのスクリプトであるmursaki_mountもあらかじめ用意されている。このmurasaki_mountはmurasaki.callもしくはmurasaki.precallから呼ばれる事を前提としたスクリプトで、murasakiのパッケージには含まれていないが、Vine Linuxの追加パッケージとしてrpm形式で配布されている。このmurasaki_mountは、murasaki.mnttabの情報に従ってHot Plugされたデバイスのマウントを行ったり、あるいはアンマウントするという仕組みだ。

 そんなわけで、行うべき作業は

(a) murasaki.usbmapにUSB HDDの情報を追加する
(b) murasaki.dependに必要な情報を記載する
(c) murasaki.callを修正
(d) murasaki.mnttabにUSB HDDの情報を追加する
といったことになる。そこで、順に説明してゆこう。

【1】murasaki.usbmapの変更

 まだ修正を施す前の状態でいきなりUSB HDDを装着すると、当然見た目には何も起きないわけだが、/var/log/messages の最後にリスト2のようなログが追加される。この最後の行(リスト2の2重下線の部分)が、今回接続したUSB HDDのmurasaki.usbmapのパラメータである。そこで、まずviなどをつかい、/etc/murasaki/murasaki.usbをリスト3のように変更する。上が変更前、下が変更後だが、要するに“alias-usbhdd”という新しいエントリを作り、その後ろにリスト2に出てきたパラメータを追加する形だ。なおこのファイルは異ように横幅が広いのでリストでは折り返されているが、実際は1行で記述するので注意してほしい。

【2】murasaki.dependの変更

 リスト4が/etc/murasaki/murasaki.dependの内容だが、「変更する」とか書いておいてこーいうのも何だが、実は一切変更の必要がない。というのは、USB HDDを使うためにはusb-storageというドライバのロードが必要なのだが、これはあらかじめロードされている(murasaki.preloadというファイルでこれが規定されている)からで、わざわざロードしなくてもいいからだ。

【3】murasaki.callの変更

 次は/etc/murasaki/murasaki.callである。これをリスト5に示すように、USBのHotplug/Unplugが発生したら、murasaki_mountを呼び出すように指定する。

【4】murasaki.mnttabの変更

 最後がmurasaki.mnttabの変更である。さてここに何を指定するか? という話だが、玄箱/HGからUSB HDDがどのように見えているかをまず確認する必要がある。具体的にはリスト7のように、/proc/scsi/scsiに、接続されているHDDの情報が示される事になる(ちなみに内蔵HDDの方は、/proc/ide/ide0の下に色々な情報が格納される)。murasaki_mountは、この/proc/scsi/scsiのデータからVendor情報とType情報を引っ張り出し、これをキーにマウント先を決定している。今回の場合、Vendorは“Maxtor”、Typeは“Direct-Access”となっているが、この“Direct-Access”に関してはデフォルトでハンドリング方法が記述されているので、特に何もする必要がない。そんなわけで、このUSB HDD(/dev/sda1)を/mnt2にExt3フォーマットでマウントする場合は、/etc/murasaki/murasaki.mnttabをリスト7のように変更すればよい。2番目の項目の“1”は、/dev/sda1をマウントするという意味で、例えば/dev/hda2なら“2”を指定することになる。

 以上で作業は一応完了であるが、実はこの方式だとHotPlugはできてもHot Unplugができない。というのは murasaki_mount の最後の部分、実際にHot Plug/Unplugに対応してマウント/アンマウントを行う部分はリスト8のようになっている。“start”というのはHot Plugの場合で、この場合にはmurasaki_mount内部のdo_mountというルーチンを呼び出すが、“stop”つまりHot Unplugの際には“You have to run 'umount' by hand”(手でumountコマンドを実行しなければならない)なんて書いてあるだけで、何もしないからだ。これはこのバージョンのmurasaki_mountを使う場合の仕様のようで、ちょっと不便な感じである。一応対策としては、このstop)の下をリスト9のように書き換えることで、10秒後に自動的にumountされるので、とりあえずの役には立つと思う。(なぜ10秒待つかというと、Unplug直後にumountを発行すると、たまに“Device Busy”と怒られるためである。10秒のsleepを入れた後は、こうした現象は全く起きていない)

 ところでこの方式の厄介な点は、この記述方法だとMaxtorのHDDしか接続できないわけで、SeagateやWDC/HDSGの製品や、昔のMaxtorの製品などは、/etc/murasaki/murasaki.mnttabに個別にエントリを追加してやる必要がある。また、/etc/murasaki/murasaki.usbmapへ追加すべき値はUSB HDDアダプタ毎に異なっているようで、試しに別のUSB HDD(こちらは2.5inch HDD対応の製品)を接続したら、全く異なるデータを加える必要があった。このあたりはいまいち汎用性に欠けるわけであるが、どのみちHDDのフォーマットの際などはtelnetで接続して作業する必要があるので、それを考えれば大幅に手間が増えるというほどの事でもないだろう。

●ということで

 玄箱/HGを色々もてあそんでみたが、初代玄箱よりは動作も機敏だし、色々いじくりまわすにはいいかもしれない。ただ、更に手を加えてメディアサーバーとかを目指すのであれば、玄箱そのままよりも、Debian化キットを入れたほうが、使えるソフトやモジュールとかも増えて便利だろう。ちなみにこの玄箱Debian化は、さまざまな人がトライしておられるようで、「玄箱」と「Debian」をキーワードに検索すれば山ほど出てくるので、ここではリンクはしない事にする。

 しかし、「そこまでやる必要があるのか?」と聞かれれば正直よくわからない。もちろん、玄箱の小ささが良い! という人も多いのだろうが、速くなったとはいってもPowerPCの266MHzだから限界はある。難易度の点でも、これからLinuxを勉強しようという人には正直荷が重いだろう。ある程度Linuxの事が判っている人のお遊び用、というところだろうか? こう書いてはなんだが、今回の筆者の記事が普通に理解できる人でないと、玄箱であれこれやらすのは無理だと思う。それをわかった上で、この小さな構成をしゃぶり尽くそうというのなら、それはそれで面白い遊びだと思える。

□関連記事
【11月24日】【槻ノ木】Gigabit Ethernet対応「玄箱」試用レビュー(Part1)
http://pc.watch.impress.co.jp/docs/2004/1124/pclabo27.htm
【10月22日】玄人志向、Gigabit Ethernet対応の「玄箱」
http://pc.watch.impress.co.jp/docs/2004/1022/kurouto.htm
【3月17日】【槻ノ木】玄人志向 玄箱を試す
~USB編:USB HDDのHot Plug & Hot UnPlug
http://pc.watch.impress.co.jp/docs/2004/0317/pclabo23.htm

バックナンバー

(2004年12月28日)

[Reported by 槻ノ木隆]


【PC Watchホームページ】


PC Watch編集部 pc-watch-info@impress.co.jp
個別にご回答することはいたしかねます。

Copyright (c) 2004 Impress Corporation, an Impress Group company.All rights reserved.