「ThinkPad s30」のように,USB1.1対応のノートPCでは,機能強化がなかなか難しい。USB2.0対応のインタフェース・カードを利用して,外付けHDDやテレビ・チューナーを快適に使おう。

  ノートPCをファイル共有などのサーバーとして利用すると,標準のままではハードEディスクの容量が足りなくなってしまう。大容量のハードEディスクへの交換で対処できるが,作業が困難な場合もある。手軽に容量を増やすなら,USB接続でハード・ディスクを増設するのがよいだろう。

 USB端子は,5年以上前に発売されたノートPCでも標準で搭載されているはずだ。ところが,今回使っているThinkPad s30のように,2001年以前の製品は,最大データ転送速度が12Mbpsとかなり遅い規格(USB1.1)にしか対応していないことが多い。現在主流であるUSB2.0は,480Mbpsと高速である。ハード・ディスクや光学ドライブといったストレージ製品だけでなく,今ではプリンタやスキャナなどもデータ転送量が多いため,USB2.0対応になっている。

 USB2.0対応の周辺機器はUSB1.1端子でも利用できるが,これではインタフェースがボトルネックになってしまう。そこで今回は,USB2.0端子をノートPCに増設し,USB接続のハード・ディスクやテレビ・チューナーを使ってみよう。

PCカードでUSB2.0端子を増設する

 ノートPCでUSB2.0対応の端子を増設するなら,PCカード型のインタフェース・カードを利用するとよい。多くのメーカーから販売されている(表1)。製品によって,端子の数やバス・パワード対応機器に十分給電するためのケーブルの有無などの違いがある。価格はいずれも数千円と,手ごろだ。

表1●PCカード型でUSB2.0対応の主なインタフェース・カード
表1●PCカード型でUSB2.0対応の主なインタフェース・カード
[画像のクリックで拡大表示]

 今回はタイムリーが販売する「PCM-U204P」(写真1)を利用した。ほかの製品と比べ,実売価格は約2000円と割安な上に,端子数は4基と多い。

写真1●USB2.0端子を増設できる「PCM-U204P」
写真1●USB2.0端子を増設できる「PCM-U204P」
タイムリーが販売する。実売価格は1980円。

 Windowsパソコン向けに販売されているため,Linuxでの動作が心配になるが,表1のインタフェース・カードはすべて利用できるはずだ。

標準ドライバで動作する

 USB2.0のインタフェース・カードには,EHCI(Enhanced Host Controller Interface)と呼ばれる規格に対応したホスト・コントローラが搭載されている。ほとんどのLinuxディストリビューションに,EHCI対応のドライバが標準で備わっている。そのため,EHCI準拠のカードなら自動的に認識できる。

 実際,ThinkPad s30にPCM-U204Pを挿してみると,きちんと認識できた。そのときのカーネル・メッセージを,図1に示す。ほかのカードでも正しく認識すれば,同じようなメッセージが記録される。

図1●インターフェース・カードを認識したときのカーソル・メッセージ
図1●インターフェース・カードを認識したときのカーソル・メッセージ
「EHCI」といった文字例が確認できる  [画像のクリックで拡大表示]

ストレージ製品を利用する

 USB2.0端子を増設できたら,実際にUSB接続の周辺機器をつなげてみよう。まずは,USB2.0による高速なデータ転送の恩恵を最も受けられるハード・ディスクを接続する。

 今回は,ハードEディスクのドライブ単体を,USBの外付け機器として利用するためのキット,ノバックの「HDDはいーるキット」を利用した。ハード・ディスク・ドライブには,2.5インチ型で20Gバイトの「Travelstar」(IBM製,現在は日立グローバルストレージテクノロジーズのブランド)を搭載した。

 PCM-U204PのUSB端子に接続すると,ドライバなどのソフトウエアを導入することなく自動認識できた。USB接続のストレージ製品は,大抵標準ドライバ(ストレージ・クラス・ドライバ)で利用できる。ほかのドライブでも問題なく動くはずだ。

マウント時の注意点

 このように,ストレージ製品は簡単に認識できるが,実際に利用するにはフォーマットやマウントなどの作業が必要になる。ここでは,ストレージ製品を利用するときの具体的な注意点をいくつか紹介する。

自動マウント

 CentOSでは,HAL(ハードウエア抽象化層)という仕組みを使ってプラグ&プレイ・デバイスに対応している。HALのデーモンである「hald」が,USB接続のストレージ(ハード・ディスクやUSBメモリー)を認識すると,「fstab-sync」というコマンドを呼び出して,マウント時の設定を保存する。具体的には,/etc/fstabファイルにストレージのファイル・システムやマウント・ポイントの情報が追記される。例えば,次のような1行が追加される。

/dev/sda1 /media/usbdisk ext3 pamconsole,fscontext=system_u:
object_r:removable_t,exec,noauto,managed 0 0(実際には1行)

 CentOSではUSB機器はSCSI接続機器として扱われるため,デバイス・ファイルは「/dev/sda1」となる。

 haldによってマウント・ポイントである/media/usbdiskが自動的に作成されるが,マウントはされない。ただし,デスクトップ環境のGNOMEが起動していれば,「gnome-volume-manager」というデーモンによってhaldが認識した機器を/media/usbdiskにマウントしてくれる*1

 GNOMEが起動していなければ,ユーザーが手動でマウントする必要がある。

マウント時に文字化けを防ぐ

 サーバーでファイル共有を行う場合,Windowsパソコンとデータをやり取りするなら,ハードEディスクのファイル・システムは「VFAT」(Virtual File Allocation Table)を利用するのが一般的である。しかし,VFATを利用すると,Windowsで作成した日本語のファイル名やディレクトリ名がLinux側では文字化けを起こしてしまう。

 通常は,mountコマンドのオプションとして「iocharset」と「codepage」を正しく指定することにより,この問題を解消できる。しかし,CentOSでは,前述のhaldが自動的に/etc/fstabファイルを作成するため,hald側の設定でVFAT向けのマウント・オプションを指定する必要がある。

 そこで,/usr/share/hal/fdi/95userpolicyディレクトリの下に図2のような内容のファイルを「vfat.fdi」という名前で作成する。

<?xml version="1.0" encoding="ISO-8859-1"?>

<deviceinfo version="0.2">

<device>
 <match key="block.is_volume" bool="true">
  <match key="volume.fsusage" string="filesystem">

   <match key="volume.fstype" string="vfat">
    <match key="@block.storage_device:storage.bus" string="usb">
     <merge key="volume.policy.mount_option.iocharset=utf8" type="bool">

	 true</merge>
     <merge key="volume.policy.mount_option.codepage=932" type="bool">
	 true</merge>
    </match>

   </match>
  </match>
 </match>
</device>

</deviceinfo>
図2●VFATで文字化けさせないための設定ファイル
/usr/share/hal/fdi/95userpolicyディレクトリの下に「vfat.fdi」として保存する。

 このファイルはXML(Extensible Markup Language)形式になっている。USB接続のストレージで,ファイル・システムがVFATなら,「<merge key=...>」というタグで指定したマウント・オプションを追加するようにしている。

 ファイルが作成できたら,次のコマンドを実行してhaldを再起動する。

# /etc/init.d/haldaemon restart

 再起動したら,VFATファイル・システムでフォーマットされたストレージ製品を接続してみよう。日本語のファイル名やディレクトリ名が文字化けせずに表示されるはずだ。

USB接続のパフォーマンス

 これで,USB接続したハード・ディスクを利用できるようになった。早速,実際にどれくらいのパフォーマンスが出るのか,試してみよう。内蔵ハード・ディスクとUSB接続のハードEディスクのそれぞれで,640Mバイトのファイルを作成するときにかかる時間を測定した。

 図3が,ファイルを作成したときの結果である。最初のコマンドがUSB接続の場合,2番目のコマンドが内蔵の場合である。ファイル・システムはどちらもExt3である。

# time dd if=/dev/zero of=/media/usbdisk/test bs=1024 count=655360
読み込んだブロック数は 655360+0
書き込んだブロック数は 655360+0

real 0m55.722s
user 0m0.941s
sys  0m17.033s

# time dd if=/dev/zero of=/root/test bs=1024 count=655360
読み込んだブロック数は 655360+0
書き込んだブロック数は 655360+0
real 0m37.015s
user 0m0.980s
sys  0m16.082s
図3●timeコマンドを使ってディスクへの書き込み時間を測定した
最初のコマンドがUSB接続のディスクへの書き込み,次が内蔵ディスクへの書き込みである。

 結果を見ると,内蔵ハードEディスクは37秒ほどかかっているのに対して,USB接続は55秒かかった。USB接続と内蔵でテストしたドライブに違いがあるため,その分の差も出ているだろう。差は大きいものの,USB接続でも約11.6Mバイト/秒と十分実用に足る速度が出ることは実証できた。

テレビ録画を試す

 USB2.0端子を増設したので,今度はUSB接続のテレビ・チューナー・ユニットを使ったテレビ録画サーバーを構築してみよう。

 今回利用したのは,プレクスターの「PX-TV402U」(写真2)である。テレビ・チューナー・ユニットは,ストレージ製品と違い,専用のドライバがないとLinuxでは使えないことが多い。PX-TV402Uは,Linux用のドライバがオープンソースとして公開されている数少ないテレビ・チューナー・ユニットの1つだ。実売価格は1万7000円前後である。

写真2●プレクスターの「PX-TV402U」
写真2●プレクスターの「PX-TV402U」

 PX-TV402Uは,DivX/MPEG-4形式へのハードウエア・エンコードに対応しており,高性能なCPUでなくても十分実用できる。実際,アイ・オー・データ機器の「LANTANK」(通称「白箱」)や玄人志向の「KURO-BOX」(通称「玄箱」)といったネットワーク・ハードEディスク構築キットをサーバー機として利用したときも,PX-TV402Uでテレビ録画やストリーミング配信を十分に楽しめた。ThinkPad s30でも性能面では問題ないだろう。気になるのは,白箱などで利用されているディストリビューションはDebian GNU/Linuxだったのに対し,今回はCentOSであること。結果から言えば,以下のようにして利用できた。

ドライバのインストール

 PX-TV402Uのドライバはソース・アーカイブの形で公開されている。まずは,ビルドするための準備を行う。ビルドには開発環境が必要だ。次のコマンドで開発環境を導入する。

# yum install kernel-devel

 次に,PX-TV402U側のコントローラに対応したファームウエア・ローダー「fxload」をインストールする。こちらはyumコマンドでは導入できない。筆者のサイトにRPMパッケージを用意した。次のコマンドでダウンロードしてから展開しよう。

# wget http://w3.quake3.jp/sushi-k/pool/centos/fxload-2002_04_11-1.i386.rpm
# rpm -ivh fxload-2002_04_11-1.i386.rpm

 これでドライバをビルドする環境は整った。PX-TV402U用のLinuxドライバが置かれているWebページからソース・アーカイブを入手してビルドしよう(図4)。

図4●PX-TV402Uのドライバをビルドする
図4●PX-TV402Uのドライバをビルドする
[画像のクリックで拡大表示]

 無事に終われば,PX-TV402Uのドライバのインストールは完了だ。

利用前の下準備を行う

 CentOSでは,/dev/video*(ビデオ用デバイス・ファイル)や/dev/dsp*(オーディオ用デバイス・ファイル)がrootの権限で作成される。そのため,一般ユーザーからはこれらのデバイスにアクセスしづらい。そこで,udevの設定ファイルを書き換え,一般ユーザーでもビデオやオーディオにアクセスしやすいようにパーミッションを変更する。

 /etc/udev/permissions.d/50-udev.permissionsファイルをテキスト・エディタで開き,図5のように書き換える。変更を終えたら上書き保存すればよい。

図5●/etc/udev/permissions.d/50-udev.permissionsファイルを編集する
図5●/etc/udev/permissions.d/50-udev.permissionsファイルを編集する

録画テストを実行する

 ここまでの準備ができたら,テレビのアンテナ線をPX-TV402Uに接続し,ThinkPad s30につなげてみよう。正しく認識されれば,図6のようなカーネル・メッセージが残るはずだ。

# dmesg
――中略――
usb 4-1: new high speed USB device using address 11
go7007-usb: probing new GO7007 USB board
go7007: registering new Plextor PX-TV402U-JP
wis-saa7115: initializing SAA7115 at address 32 on WIS GO7007SB EZ-USB
wis-uda1342: initializing UDA1342 at address 26 on WIS GO7007SB EZ-USB
wis-sony-tuner: initializing tuner at address 96 on WIS GO7007SB EZ-USB
wis-sony-tuner: type set to 201 (Sony NTSC_JP (BTF-PK467Z))
図6●テレビ・チューナー・ユニットが正しく認識した際のカーネル・メッセージ

 図7は,録画テストを行った様子である。録画コマンドである「gorecord」のオプションの意味は次の通りだ。

$ gorecord -vdevice /dev/video0 -adevice /dev/dsp2 -duration 20
 -mode ntsc-j -input 2 -tvchan ntsc-bcast-jp:1 -width 640
 -bitrate 3000 test.avi
Using input port Tuner
Capturing video at 640x480, 29.97 FPS
 00:20.01 Frames: 601 AVI size: 10944428 Video bitrate: 3089 kbps

  Video data written to file: 7066825 bytes of MPEG4
  Audio data written to file: 3866624 bytes of uncompressed PCM
  AVI file format overhead : 30219 bytes
 Total file size : 10963668 bytes
図7●録画テストを行った例

-vdevice /dev/video0

 ビデオ・デバイスを指定する。/dev/video0が標準だ。

-adevice /dev/dsp2

 オーディオ・デバイスを指定する。ThinkPad s30では/dev/dsp0,/dev/dsp1が内蔵サウンドに利用されているため,PX-TV402Uの音声は/dev/dsp2に割り当てられる。ノートPCによってデバイス名が変わるので,/dev/dsp0~3までを試して,テレビの音が正常に録画されるデバイス・ファイルを使用する。

-duration 20

 録画時間を秒単位で指定する。今回はテストなので20秒にした。

-mode ntsc-j

 テレビ・モードを指定する。「ntsc-j」は,日本仕様のNTSCを指す。

-input 2

 入力を選択する。PX-TV402Uは2系統のビデオ入力とテレビ・チューナーを備える。「0」がコンポジットのビデオ入力,「1」がS-Video入力,2はテレビ・チューナーを指す。

-tvchan ntsc-bcast-jp:1

 テレビのチャンネルを指定する。日本の地上波は「ntsc-bcast-jp」を指定し,ケーブル・テレビを利用している場合は「ntsc-cable-jp」とする。チャンネル番号は,「:」(コロン)の後に指定する。例では1チャンネルにした。

-width 640

 録画する画面の横サイズを指定する。ドット単位で,640ドット,720ドット,320ドットなどが指定できる。

-bitrate 3000

 録画する映像のビット・レートをkbps単位で指定する。画質を考えると1500(1.5Mbps)以上を指定した方がよい。

test.avi

 保存するファイル名を指定する。PX-TV402Uは標準で,DivX/MPEG-4圧縮を用いたAVIフォーマットのファイルを出力する。拡張子は「.avi」。

 これで,録画できているはずだ。CentOSはサーバー用ディストリビューションのため,動画再生ソフトが用意されていない。サーバーに接続できるクライアントでファイルを再生して確認しよう。

ストリーミング・サーバーを作成する

 ビデオ録画ができたら,次はビデオ・ストリーミング・サーバーを作成してみよう。放送中のテレビ番組を自宅LANにストリーミングし,LAN内の別のPC上で視聴してみよう。

 ストリーミング・サーバーを構築するには「Spook」を利用する。公式サイトからアーカイブを入手してビルドしよう。次のコマンドを順に実行すればよい(図8)。

# wget http://www.litech.org/spook/dist/spook-20050207.tar.bz2
# bzip2 -dc spook-20050207.tar.bz2 | tar xvf -
# cd spook-20050207
# ./configure
# make
# make install
図8●Spookの導入手順

 Spookはユーザー権限で実行してほしい。また,実行するためにはカレント・ディレクトリにspook.confという設定ファイルが必要だ。設定ファイルの例を筆者のサイトと収録メディアに用意した。これを利用しよう。

$ wget http://w3.quake3.jp/sushi-k/pool/centos/spook.conf

 このファイルはサンプルとして作成したので,読者のシステムに合わせて変更してから使用する。図9を参考にして書き換えよう。

――中略――

Input V4L2 {
 Device /dev/video0;
 InputType NTSC;
 InputPort 2;
 Format "mpeg4";
 Bitrate 4000;        # ビットレートをkbps単位で指定する
 FrameSize 640 480;   # ストリーミングの画面サイズを指定する
 Output "compressed";
}

――中略――
Input OSS {
 Device /dev/dsp2;    # システムに合わせたデバイス・ファイルに書き換える
 SampleRate 48000;
 Output "pcm";
}
――後略――
図9●Spookの設定ファイルを変更する

 次に,あらかじめチャンネルを合わせておく。gorecordで録画時間(-duration)を0に指定して実行すれば,指定したチャンネルに変えられる。

 最後に次のコマンドを実行してSpookを起動する。

$ spook

 Spookが起動したら,LAN内の別のPC上でQuickTimeを起動しよう。メニューから「ファイル」-「URLを開く」を選択し,

rtsp://サーバーのIPアドレス:7070/webcam

を入力する。これでテレビ画面が表示される(写真3)。

写真3●LAN内のパソコンでテレビが見られる!?
写真3●LAN内のパソコンでテレビが見られる!?

 ちなみにThinkPad s30は,動作周波数が600MHzのPentium!)を搭載しており,今となってはかなり非力だ。それでも,3Mbpsまでのストリーミングなら駒落ちもさほど気にならない程度に視聴できた。だが,4Mbpsになるとオーディオ・ストリームを若干取り落とす(音声が途切れる)などの不具合が現れた。3Mbpsでも普通に見る分には十分な画質が得られるので,家庭用のビデオ・サーバーとして実用性は十分といって良さそうだ。

 次回は最終回として,これまで取り上げなかったサーバー・アプリケーションをいくつか紹介する予定である。