槻ノ木隆のPC実験室

玄人志向 玄箱を試す
~USB編:USB HDDのHot Plug & Hot UnPlug




玄人志向の自作NASキット「玄箱」

 さて前回は真っ当な使い方のみをご紹介した玄箱だが、敢えて前回触れなかったものの中に、USBポートの存在がある。背面に突き出したUSBポートがどう使えるかについて、当然ながら説明は一切ないし、ただ繋いだだけでは何も起きない。

 しかしながら玄箱の従兄弟(?)にあたるBUFFALOのHD-HLANシリーズはUSBポートを持ち、ここに外部のHDDを繋いで利用できる。USBポートの位置が玄箱と違うので基板はやや異なるのだろうし、であれば全く一緒というわけではないのだろうが、色々共通点は多そうだから出来ても不思議ではない。そんなわけで、今回はこれに挑戦してみた。



●まずは内部構造

 前回は軽く流した内部の基板だが、【写真01】に表面、【写真02】に裏面の様子をそれぞれ示す。CPUとして搭載されているのはMotorolaのMPC8241LZQ200D、200MHz動作のPowerPC 603eである。組み込み向けの低消費電力プロセッサであるが、汎用向けということでI/Oコントローラを多く集積した昨今の組み込み向けプロセッサに比べるとかなりシンプルである。これに繋がっているのがSilicon ImageのSil0680ACL144、PCIバスに直結できるUltraATA/133のコントローラである。

 またCPUの左に位置するのはADMtekのAN983Bで、これはPHY内蔵の10/100BASE-T NICである。一方裏面を見ると、ちょうどCPUを挟み込むようにしてELPIDAのDS2516APTA-75が2つ配置されている。32MBのPC133 SDRAMなので、メモリはトータル64MBになる計算だ。

 その右脇には旧富士通、現SPANSIONの29PL32TM-90PFTNが置かれている。4MB/90nsのフラッシュメモリで、これはブート用だろう。

 更にその右にはNECのD720101GJがある。これはおなじみUSB 2.0のホストコントローラで、つまりこのUSBポートはUSB 2.0対応ということになる。これがUSB 1.1だとHDDを繋いでも転送速度は1MB/sec強でしかないからほとんど意味がないが、USB 2.0なら40MB/sec以上確保できるから、現状の玄箱の転送速度を考えると十分に意味がある。ちなみにuPD720101シリーズの場合、トランザクション間のウェイトがやたらに多いため転送速度が上がらない、という問題を抱えているが、今回搭載されているuPD720101GJは、この対策が施されたものである。

【写真01】表側。割とコンサバティブな構成である 【写真02】裏面。USBコントローラが一際目立つ

●USB HDDを繋いで見る

【写真03】HDDを接続したところ

 では早速USB HDDを繋いでみることにしよう。今回は株式会社センチュリーの「これdo台 expert KD-2/FUL」を利用し、ここに前回使ったMaXLine Plus II 250GBを接続した【写真03】。玄箱の方は、MaXLine II 250GBを使って標準のセットアップを行なっている。

 さて、この状態で玄箱にtelnetでログインしてみよう。以降は下記のファイルを参照しながら読み進めて頂きたい。カッコ内の数字はファイル内のものである。

Linuxログ(PDF版)
Linuxログ(Word版)

 まず /proc/bus の下を見ると(1)、PCIデバイスしか存在しておらず、そもそもUSBのドライバがロードされていない。そこで、EHCIのドライバと、USBのストレージドライバをロードしてみると(2)(3)、usbcoreとかscsi_modなど、必要なドライバが全部自動的にロードされる(4)。ついで、usbfsをロードし(5)、ちゃんとロードされたことを確認する(6)。

 これが確認できれば、もうパーティションが見えるはずである。そこでfdiskを呼び出してパーティションの作成である(7-1)。まず現在のパーティションを見ると(7-2)、Windows XPで作ったパーティションがそのまま見えている。そこで、このNTFSパーティションを削除し(7-3、7-4)、新しいパーティションを作成する(7-5)。指定はプライマリパーティションの1番で(7-6)、サイズはHDD全部を割り当てて差し支えないだろう(7-7、7-8)。その後、作成したパーティションのタイプをLinux用に設定し(7-9、7-10、7-11)、それを書き出して終了である(7-12)。

 パーティションを切り終わったらフォーマットである。別にExt2でも良い様な気もするが、内蔵HDDはExt3でフォーマットされているので、こちらもこれに合わせてExt3でフォーマットする(8)。フォーマットには多少時間を要するので、落ち着いて待っていよう。

 フォーマットが終ったら、いよいよHDDのマウントである。まずマウントポイントを作成し(9)、次いでそのマウントポイントにUSB HDDをマウントする(10)。ちゃんとマウントできている事が確認できたら、まずは1段落である(11)。

 ついでにPCからこれが見える事も確認しておこう。ファイルサービスはsambaで行なわれており、この設定は /etc/samba/smb.conf で記述されている。これは現在、

----- smb.conf (オリジナル)
[global]
  client code page = 932
  coding system = sjis
  workgroup = WORKGROUP
  server string = 玄人志向 玄箱
  socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
  dns proxy = No
  netbios name = KURO-BOX
  os level = 1
  wins server =

  security = user
  encrypt passwords = Yes
  obey pam restrictions = Yes
  pam password change = Yes
  passwd program = /usr/bin/passwd %u
  passwd chat = *New*password* %n\n *Retype*new*password* %n\n *passwd:*all*authentication*tokens*updated*successfully*
  unix password sync = yes
  guest account = nobody
  null passwords = yes
  guest only = no
  username level = 12
  password level = 8
  map to guest = Bad User

  log level = 1
  log file = /var/log/samba/samba.log
  max log size = 10

  browsable = no
  preserve case = yes
  short preserve case = yes
  veto files = /.AppleDesktop/Network Trash Folder/TheVolumeSettingsFolder/.AppleDouble/
  delete veto files = yes

  invalid users = @wheel, mail, deamon, adt
  admin users = root
  username map = /etc/samba/smbusers

  getwd cache = yes
[share]
  comment = KURO-BOX Share Folder
  path = /mnt/share
  browsable = yes
  printable = no
  writable = yes
  guest ok = yes
  force create mode = 777
  force directory mode = 777
###share###
#####END#####
----- smb.conf (オリジナル) ココまで ---->

となっている。これを、

----- smb.conf (変更後) <---- ココから
[global]
  client code page = 932
  coding system = sjis
  workgroup = WORKGROUP
  server string = 玄人志向 玄箱
  socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
  dns proxy = No
  netbios name = KURO-BOX
  os level = 1
  wins server =

  security = user
  encrypt passwords = Yes
  obey pam restrictions = Yes
  pam password change = Yes
  passwd program = /usr/bin/passwd %u
  passwd chat = *New*password* %n\n *Retype*new*password* %n\n *passwd:*all*authentication*tokens*updated*successfully*
  unix password sync = yes
  guest account = nobody
  null passwords = yes
  guest only = no
  username level = 12
  password level = 8
  map to guest = Bad User

  log level = 1
  log file = /var/log/samba/samba.log
  max log size = 10

  browsable = no
  preserve case = yes
  short preserve case = yes
  veto files = /.AppleDesktop/Network Trash Folder/TheVolumeSettingsFolder/.AppleDouble/
  delete veto files = yes

  invalid users = @wheel, mail, deamon, adt
  admin users = root
  username map = /etc/samba/smbusers

  getwd cache = yes
[share]
  comment = KURO-BOX Share Folder
  path = /mnt/share
  browsable = yes
  printable = no
  writable = yes
  guest ok = yes
  force create mode = 777
  force directory mode = 777
###share###
[usbdisk]
  comment = External USB HDD
  path = /mnt2
  browsable = yes
  printable = no
  writable = yes
  guest ok = yes
  force create mode = 777
  force directory mode = 777
###usbdisk###
#####END#####
----- smb.conf (変更後) ココまで ---->

と書き換える。要するに最後の[usbdisk]から###usbdisk###までを追加するだけだ。ちなみに書き換えはviエディタを使うことになる(12)。ここでは使い方までは説明しないので、各人viエディタの使い方を探して欲しい。完了したらsambaを再起動する(13)。

 この状態で、玄箱に接続したPCからusbdiskが見えればまずは一段落である【写真04】。ちなみにドライブ名を割り当てた上でプロパティを見てみると、こんな具合になっている【写真05】。

【写真04】“kuro-box”というホスト名ではなく“\\192.168.1.66”というIPアドレスを使っているのは、ちょっと筆者の環境が変則的なため。普通はホスト名で見えるはずだ 【写真05】Ext3ファイルシステムのために多少領域を取られるが、一応この程度は空く

●Hot Plug & Hot Unplugの設定

 さてここまで来れば出来たも同然……と言いたいところだが、メインとなるのはここからである。実はここまでの記述は、玄人志向の玄箱HELP ME! BBSのあるスレッドにも既に話題が出ており、ちょっと慣れた人ならば割と簡単である。問題はここからだ。

 あれこれ設定を変えながら、とりあえずUSB HDDを繋いだ状態で玄箱の電源を入れると、自動的にマウントしてsambaでサービスを開始するようにしたかったのだが、

[1] usb-storageクラスだから当然 /dev/sd* のデバイス名となるが、このデバイスは /etc/fstab にオートマウントの指定を付けて記述してもマウントしてくれない

[2] autofs がないので、オートマウンタを使うわけにもいかない。勿論 AMD(Auto Mount Daemon)も無い

[3] /etc/samba/smb.conf は、玄箱の設定Web画面で勝手に書き換えられる。しかも念の入った事に、リブートのたびに書き直す様である。したがって、smb.conf を毎回リブートの度に書き換える必要がある(!)

という問題が発覚した。特に厄介なのは[3]で、これは要するにsmb.confの編集は全部Web画面側で行なわなければならない、という事だ。従って、HD-HLANシリーズとはまた異なったアプローチが必要になる。

 さてそれでは解決編を説明してゆこう。まず最初に[3]の解決だ。設定のWeb画面から「共有フォルダ設定」→「新規フォルダ追加」を選び【写真06】、ここで必要なパラメータを入れて設定ボタンを押す【写真07】。一覧に表示されたらここでの仕込みは完了である【写真08】。

【写真06】設定画面。「共有フォルダ設定」→「新規フォルダ追加」を選ぶ 【写真07】パラメータを入力 【写真08】一覧に表示されれば設定完了

 次いで /etc/fstab の設定である。usbdiskという共有フォルダを作成した場合、実体は /mnt/usbdisk というディレクトリになる。そこで、この /mnt/usbdisk というディレクトリをマウントポイントとして、USB HDDをマウントしてしまえばいいことになる。現在 /etc/fstab は、

----- fstab (オリジナル)
# /etc/fstab: static file system information.
#
# < file system > < mount point > < type > < options >      < dump > < pass >
/dev/hda1     /        ext3   defaults,noatime,errors=remount-ro   0 0
none       /dev/pts    devpts  gid=5,mode=20          0 0
proc       /proc      proc   defaults            0 0
/dev/hda2     swap      swap   defaults            0 0
/dev/hda3     /mnt      ext3   defaults,noatime        0 0
----- fstab (オリジナル) ココまで ---->

となっている。これを、

----- fstab (変更後) <---- ココから
# /etc/fstab: static file system information.
#
# < file system > < mount point > < type > < options >      < dump > < pass >
/dev/hda1     /        ext3   defaults,noatime,errors=remount-ro   0 0
proc       /proc      proc   defaults            0 0
none       /dev/pts    devpts  gid=5,mode=20          0 0
/dev/hda2     swap      swap   defaults            0 0
/dev/hda3     /mnt      ext3   defaults,noatime        0 0
/dev/sda1     /mnt/usbdisk  ext3   defaults,noatime        0 0
----- fstab (変更後) ココまで ---->

に変更する。追加したのは最後の1行で、/dev/sda1を /mnt/usbdisk にマウントする設定だ。こうすると、

・USB HDDを接続している時:usbdiskとしてUSB接続HDDのルートディレクトリが見える
・USB HDDを接続していない時:usbdiskとして、内蔵HDDのusbdiskディレクトリが見える

といった形で整合性が取れるわけだ。なお、設定で作られた /mnt/usbdisk は何故かパーミッションが755になっているので、これを777にしておこう(14)。

 [3]が解決したら、次いで[1]と[2]を解決しよう。必要となるのはmurasakiの設定だ。murasakiの説明はコチラを見ていただくのが早いが、要するにHot Plug/Hot Unplugの管理をするツールで、Vine Linuxの2.5以降でも標準採用されているものだ。

 玄箱もやはりmurasakiを使っており、これを利用して管理を行なっている。というか、HD-HLANシリーズは積極的にmurasakiを使って細工をしているようだが、玄箱ではそうした設定がほとんど無くなってしまっているので、手探りしながらの解決に随分時間を取られてしまった。

 さてまず必要なのはmurasakiを起動することだ。/etc/rc.d/rc2.d/ で、/etc/init.d/murasaki を一番最初に起動するようにシンボリックリンクを張る(15、16)。S01murasakiが ../init.d/murasaki を指している事を確認しておこう(17)。

 次はmurasakiの設定の変更である。murasakiの設定は /etc/murasaki にまとめられている(18)。まずは murasaki.call の変更である。このファイルは、Hot Plug/Hot Unplugが発生したときに呼び出すべきスクリプトを定義している。そこでUSBのPlug/UnPlugが発生したときに、USB HDDのマウント/アンマウントを行なうスクリプトを呼び出せば、[1]と[2]が解決できるわけだ。そこで、murasaki.call を、

----- murasaki.call (オリジナル)
[net]: net
----- murasaki.call (オリジナル) ココまで ---->
から、
----- murasaki.call (変更後) <---- ココから
[net]: net
[usb]: mount.sh
----- murasaki.call (変更後) ココまで ---->

に書き換える。

 さらに、murasaki.preload というファイルを作成しよう。これはmurasakiを使ってHot Plug/Hot Unplugを行なう際に必要となるドライバをあらかじめロードするためのものだ。今回の場合、ehci-hcd と usb-storage の2つのドライバをロードする必要がある。そこで、

----- murasaki.preload (新規作成) <---- ココから
ehci-hcd
usb-storage
----- murasaki.preload (新規作成) ココまで ---->

という2行を記述しておく。

 最後にもう1つ、行なう事がある。先ほど murasaki.call の中で mount.sh というスクリプトを指定したが、このスクリプトは存在しないのでこれを作らねばならない。murasaki の場合、Plug時には "start" が、UnPlug時には "stop" がそれぞれ引数として渡されるので、この引数を見て /mnt/usbdisk をマウントするか、アンマウントするか決めれば良い。このスクリプトは /etc/murasaki/bin の下に置かれるので(19)、viを使ってこんな具合の mount.sh を作成する。

----- mount.sh (新規作成) <---- ココから
#!/bin/sh
case "$1" in
start)
    /bin/mount /mnt/usbdisk
    ;;
stop)
    /bin/umount /mnt/usbdisk
    ;;
esac
----- mount.sh (新規作成) ココまで ---->

 完了したら、最後に実行モードをつけておくことを忘れないようにしよう(20)。

 以上で変更は完了である。再起動すると、外部USB HDDのHot Plug/Hot Unplug対応の玄箱に生まれ変わる。

 さて、ではどの程度に使えるか? ということで、前回と同じく4種類のベンチマークを実施してみた。結果は表1~表4に示す通りである。ちなみに表4、前回のデータはうっかり3回分の転送速度であることを勘案し忘れ、性能が3分の1になっていた。今回示すのが正しい結果であるので、お詫びして訂正したい。

【表1】HDBench
 直接接続玄箱USB接続
MaxLine Plus IIMaxLine IIMaxLine Plus IIMaxLine IIMaxLine Plus II
Read(KB/sec)52,872.3 40,682.0 7,842.7 7,975.0 3,928.3
Write(KB/sec)61,427.0 41,903.7 6,036.7 5,963.3 4,046.3
Copy(KB/sec)39,405.3 29,440.0 4,889.0 5,012.3 4,936.7

【表2】FDBench
 直接接続玄箱USB接続
MaxLine Plus IIMaxLine IIMaxLine Plus IIMaxLine IIMaxLine Plus II
ReadWrite(KB/sec)43,564.3 30,176.0 6,733.7 6,645.7 4,151.3
Read(KB/sec)55,053.0 40,683.0 7,969.3 7,997.3 4,008.0
Write(KB/sec)62,738.0 41,373.7 5,971.3 5,959.0 3,978.0
RandomRead(KB/sec)26,743.7 19,857.0 7,008.3 6,659.3 4,488.0
RandomWrite(KB/sec)29,690.0 18,791.0 5,986.0 5,973.7 4,131.7
Copy(Operations/sec)46,100.3 6,096.7 7,445.0 7,845.7 7,752.0
2K(Operations/sec)107,322.0 7,916.0 16,758.0 17,946.0 17,664.0
32K(Operations/sec)53,208.0 7,784.0 10,026.0 10,428.0 10,374.0
256K(Operations/sec)19,182.0 6,281.3 2,348.0 2,358.0 2,346.0
Variable(Operations/sec)4,692.0 2,404.0 648.0 646.0 630.0

【表3】Sandra 2004 SP1
 直接接続玄箱USB接続
MaxLine Plus IIMaxLine IIMaxLine Plus IIMaxLine IIMaxLine Plus II
Drive Index(MB/sec)51.0 36.0 7.0 7.0 4.0
バッファの読み込み(MB/sec)49.7 32.3 9.0 9.0 9.0
順次読み込み(MB/sec)58.0 40.7 8.0 8.0 4.0
ランダム読み込み(MB/sec)41.0 30.0 7.0 7.0 3.8
バッファの書き込み(MB/sec)64.0 47.0 9.0 9.0 8.0
順次書き込み(MB/sec)58.0 40.7 7.0 7.0 4.0
ランダム書き込み(MB/sec)45.7 30.0 7.0 7.0 4.0
アクセスタイムの平均(ms)7.0 8.7 11.0 12.3 27.0

【表4】731MBのコピー
 直接接続玄箱USB接続
MaxLine Plus IIMaxLine IIMaxLine Plus IIMaxLine IIMaxLine Plus II
HDDにコピー(MB/sec)31.0629.295.785.784.05
HDDからコピー(MB/sec)37.3831.027.677.673.58

【お詫びと訂正】初出時、ベンチマークテスト結果を掲載しておりませんでした。お詫び致します

 さて数字からも明らかなように、「更に遅くなっている」。まぁUSB経由のオーバーヘッドがあるわけで、いかんともしがたいところではあるが。このあたり、便利さと性能のどちらを取るか、というあたりだ。流石にこれだけ遅いと体感ではっきり「遅い」事が感じられるものであった。

●FAT32 HDDのマウント

 一応ここまでで話は終わりだが、ついでにFAT32/NTFSのHDDをそのままマウントできるかという話をしておきたい。よく「昔のマシンで使っていたHDDをそのままマウントできないか?」という話は出てくるからだ。結論から言うと「無理ではないが、止めたほうが無難」という所になる。

 まずNTFSについてだが、これは簡単でLinuxではNTFSパーティションをマウントできるが、ただしRead Onlyとなっているためだ。現在LinuxでNTFSをRead/Writeでマウントする方法はない。従って、「Read Onlyでもいいからマウントしたい」という場合を除き、NTFSパーティションをそのまま繋ぐのはあまり意味がない。

 ついでFAT32であるが、こちらは普通にRead/Writeでマウントする事ができる。ので、原則としてはそのまま繋げられるのであるが、ここで問題になるのが日本語ファイル名の問題である。通常sambaでFAT32ドライブを公開する場合、/etc/fstabの設定を、

/dev/sda1 /mnt/usbdisk vfat noatime,owner,rw,codepage=932,iocharset=euc-jp,umask=000 0 0

 などにすればちゃんと日本語ファイル名をサポートしてくれるのだが、このためにはsambaもEUC-JPで動作しなければならない。ところが上に示した /etc/samba/smb.conf の先頭で、

coding system = sjis

などと指定しているため、このままだと日本語ファイル名を作ろうとするとエラーで弾かれる。しかたなく /etc/fstab の記述を、

/dev/sda1 /mnt/usbdisk vfat noatime,owner,rw,codepage=932,iocharset=sjis,umask=000 0 0

としてみたところ、ちゃんと日本語ファイル名は通る様になったのだが、今度はDOS/Win 9x環境で作成した日本語ファイル名が正しく扱えない(例えば「新規フォルダ」が、ディレクトリではなく単なるファイルエントリと認識される、など)状況に陥ってしまった。

 日本語を使わない分には問題なく利用できるが、そうでなければ無理にFAT32ドライブをそのままマウントしない方が無難だろう。

●ということで

【写真09】猫は付属品ではありませぬ(笑)

 なんとかUSB HDDに関しては片がついた。次なる課題として編集長から頂いているネタは複合機。既にPIXUS MP710が部屋に鎮座しており【写真09】、とりあえずは玄箱をプリントサーバーとして動かす事を命じられているわけであるが、こちらはHDDよりももうちょっと細工が要るようで、そう簡単には出来そうもない。一応成功したらまたレポートしたいが、そもそも成功するかどうか、現時点では何とも言えないというのが正直なところだ。(特に smb.conf をいじれないのが非常に痛い)。

 それとは別に、玄箱にはftpサーバーだのpcastサーバーだの、色々と入っており、これで色々遊べそうな予感がある。その一方、現在流通しているVersion 1.00ではパスワードが平文で保存されているとか、簡単にクラックできるといった話も出ており、このあたりが今後どういう動きになるか、現時点では判然としない。KernelのフルソースがあればパッチをあてるとかKernel Updateを掛けるといった事もできるが、現状ではそこまでの環境もないので、とりあえず玄箱を外部公開サーバーとしない事を強くお勧めする。このあたりについてもまた進展があったらまたレポートしたい。


■■ 注意 ■■

・この記事を読んで行なった行為(分解など)によって、生じた損害はPC Watch編集部および、メーカー、購入したショップもその責を負いません。
・内部構造などに関する記述は編集部が使用した個体に関してのものであり、すべての製品について共通であるとは限りません
・PC Watch編集部では、この記事についての個別のご質問・お問い合わせにお答えすることはできません。

□製品情報
http://www.kuroutoshikou.com/products/kuro-box/kuro-boxfset.html
□関連記事
【3月12日】【槻ノ木】玄人志向「玄箱」を試す
~NAS編:搭載HDDの選択とベンチマーク
http://pc.watch.impress.co.jp/docs/2004/0312/pclabo22.htm
【2月18日】玄人志向、ファイルサーバー組み立てキット「玄箱」
http://pc.watch.impress.co.jp/docs/2004/0218/kurouto.htm
【2003年6月4日】メルコ、USBプリントサーバー機能搭載の低価格NAS
http://pc.watch.impress.co.jp/docs/2003/0604/melco.htm

バックナンバー

(2004年3月17日)

[Reported by 槻ノ木隆]


【PC Watchホームページ】


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

Copyright (c) 2004 Impress Corporation All rights reserved.