{ 2010.8.28 }

LinuxでUSB外付けHDDを追加 – USBハブ使って倍プッシュ編

    はてなブックマーク - LinuxでUSB外付けHDDを追加 – USBハブ使って倍プッシュ編
    このエントリーをはてなブックマークに追加

    Fusic 平田です。
    とあるお客様のところにLinuxのサーバを納入しているのですが、今回はそのお話を。
    # 倍プッシュ編しかありませんので、そこはご容赦ください。

    このサーバ、普段はファイルサーバとして活用しているものです。
    で、今回別途USBの外付けHDDを2台追加することになりました。
    用途はSambaでアクセスできればいいよーだったのですが、問題がひとつ。
    他にも外付けHDDなどなど挿したりしてて、USBポートに余裕がないと。

    で、USBハブあるよーとのことなので挿してみました。
    さっくり動いてmountできたのでおー動く、と思ったのもつかの間。
    数分たったりUSBハブに他の機器を挿したりした瞬間に動かなくなりました。
    /var/log/messagesを見ると、以下のIO Errorがずらり。

    scsi 9:0:0:0 rejecting I/O to dead device

    これを解消すべく、以下の手順でいろいろやってみました。

    0. 前提

    サーバマシン: Linux(CentOS 5.3)の2Uサーバ
    元からあったUSB外付けHDD: 1台(IO-DATA)
    今回増やすUSB外付けHDD: 2台(IO-DATA)
    問題: USBポートが既にいっぱいいっぱい
    目標: 正常に動かす
    目標2: さらに増やす時に手間がかからないようにする

    1. /dev/***の部分を各HDDで固定する

    現象を見ていると、/dev/sd*の部分がころころ変わるようで。
    と言うか/dev/sd*の部分はudevで勝手に割り当てるので、再起動時なんかに変わってしまう可能性が大。
    これをまずは固定しようということでいろいろ調べたところ、↓を発見。
    fredericiana.com/2006/03/15/writing-udev-rules-short-notes/
    要はudevのruleを作成して、デバイスファイルを固定しようってことです。
    というわけでudevルールの書き方を読んでみると、

    > ユーザ指定のルールは、基本の/devレイアウトを作成するudevの初期設定を、事実上無効にしてしまいます。したがって、ユーザが記述するルールには、実用的である初期設定の名前とユーザ指定の名前両方を得るために、devfs形式の名前やシンボリックリンクも指定することをお勧めします。

    とあったので、/etc/udev/rules.d/98-local.rulesとして以下の内容のファイルを作成。

    BUS=="usb", KERNEL=="sd*", SYSFS{serial}="0010100740AABBCC", NAME="%k", SYMLINK="usbhda\n"
    BUS=="usb", KERNEL=="sd*", SYSFS{serial}="0010100740DDEEFF", NAME="%k", SYMLINK="usbhdb\n"
    BUS=="usb", KERNEL=="sd*", SYSFS{serial}="0010100740ABCDEF", NAME="%k", SYMLINK="usbhdc\n"

    # SYMLINKの値はこちらで決めていいので、”usbhd/****”とかにして別途まとめる形でもいいです。
    serialの調べ方ですが、1つずつ挿して/dev/sdbなりで認識されているのを確認した後に

    udevinfo -a -p $(udevinfo -q path -n /dev/sdb)

    と実行すると

    # udevinfo -a -p $(udevinfo -q path -n /dev/sdb)
     
    Udevinfo starts with the device specified by the devpath and then
    walks up the chain of parent devices. It prints for every device
    found, all possible attributes in the udev rules key format.
    A rule to match, can be composed by the attributes of the device
    and the attributes from one single parent device.
     
      looking at device '/block/sdb':
        KERNEL=="sdb"
        SUBSYSTEM=="block"
    ----- (中略) -----
      looking at parent device '/devices/pci0000:00/0000:00:03.1/usb3/3-1/3-1.4':
        ID=="3-1.4"
        BUS=="usb"
        DRIVER=="usb"
        SYSFS{configuration}==""
        SYSFS{serial}=="0010100740AABBCC"
    ----- (後略) -----

    てな感じでずらずら出てくる中から読み取れます。

    ruleを保存した後に再度挿すと、こんな感じになります。

    # ls -l /dev/usbhd*
    lrwxrwxrwx 1 root root 3  8月 20 17:57 /dev/usbhda -> sdb
    lrwxrwxrwx 1 root root 4  8月 20 17:57 /dev/usbhda1 -> sdb1

    複数台挿して/dev/sd*の順序がずれても、

    # ls -l /dev/usbhd*
    lrwxrwxrwx 1 root root 3  8月 20 17:57 /dev/usbhda -> sdb
    lrwxrwxrwx 1 root root 4  8月 20 17:57 /dev/usbhda1 -> sdb1
    lrwxrwxrwx 1 root root 3  8月 20 18:06 /dev/usbhdb -> sdd
    lrwxrwxrwx 1 root root 4  8月 20 18:06 /dev/usbhdb1 -> sdd1
    lrwxrwxrwx 1 root root 3  8月 20 18:05 /dev/usbhdc -> sdc
    lrwxrwxrwx 1 root root 4  8月 20 18:05 /dev/usbhdc1 -> sdc1

    といった感じできちんとアクセスできます。

    2. USBハブを変える

    使用したハブがそこそこ古いものだったので、外付けHDDを複数台挿すと途端に動かなくなります。
    デバイスファイルの問題は解決しているので、あとは単純にUSBハブの供給電流とかの問題だろうなと。
    # あとusb2.0に対応してなさそうだな、とか。
    # 型番を必死に調べたのですが、外観以外の情報がないので絞り込めませんでした。。。
    というわけで今回使用したのはこちら。
    ELECOM U2H-GM002BK
    PS3用じゃないか!とツッコミをいただいたりもしたのですが。
    > セルフパワー時/7ポート合計3500mA以内
    が非常に強力なので、これにしました。
    # 4ポートのELECOM U2H-TAP3420Sもあったのですが、口に余裕があったほうが困らないので今回は却下。
    # 7ポートのほうはマグネットが付いてたりするので、そういうの困るなって場合は後者がいいと思われます。

    というわけで設置、USBハブ電源スイッチオン、USB外付けHDDをざくざく挿入。
    きっちり稼働して万々歳です。
    以降定期的にちょこちょこ覗いてますが、特に問題も発生していないようです。

    同様の事象で困る例は非常に少ないと思いますが、備忘録がてらということでひとつ。
    何か後日談なんかが出てきた場合は、またこちらで紹介させていただきます。
    まあ後日談=十中八九トラブルなので、なるべく書かなくて済むことを祈りますが。。。

    Comments are closed.