コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2006年5月14日 >>> 2006年5月14日
link もっと後

2006年5月14日

外付けUSB HDDでSoftware RAIDを構築する全ての方へ。
※私自身よくわかってないので、間違いなどあるかもしれません。ご指摘は大歓迎です。

LinuxではUSB Mass Storage(USB HDDやUSBフラッシュメモリ)をSCSIエミュレーションによりあたかもSCSIデバイス(sda, sdb, ...)であるかのように扱います。ところがどのSCSIデバイスに割り当てられるかが不明瞭で、ただ差し直しただけで対応が入れ替わったりします。/dev/sdaがどのデバイスと関連付けられるかは、やってみるまでわからず、これではとてもRAIDを構築できそうにありません。

USBデバイスを固定する(?)方法としてudevがあります。scsiバス上にある(エミュレーションなのでそう見える)「○○社」製のデバイスなら、usbhdaに割り当てる、などの設定が可能です。区別に使える情報はudevinfoというプログラムで得ることができます(udev使うなら /sys以下の情報(sysfs)が必要かも)。

udevinfoの使用例
# aptitude install udev

# udevinfo -a -p /sys/block/hda
(... 略 ...)
follow the class device's "device"
  looking at the device chain at '/sys/devices/pci0000:00/0000:00:1f.1/ide0/0.0':
    BUS="ide"
    ID="0.0"
    DRIVER="ide-disk"
    SYSFS{drivename}="hda"
    SYSFS{media}="disk"
    SYSFS{modalias}="ide:m-disk"

たとえば ○○社製のhogehogeという名前のHDDが一台だけある、という環境でしたら、以下のように書くことができます。/etc/udev/rules.d/ 以下に .rulesで終わる名前のファイルを適当に作ります。例ではlocal.rulesとしています。
モデル名は大抵スペースが入っているので、udevinfoで確認することをお勧めします。

udevのルールの例
BUS="scsi", SYSFS{model}="hogehoge   ",  NAME="sda%n", SYMLINK="usbhda%n"

NAMEならデバイスファイルが、SYMLINKならデバイスファイルではなくシンボリックリンクが作られます。%kという文字列を指定すると、カーネルが作成したデバイス名(sdaとかですね)に置換されます。詳しくはudevのドキュメントを見てください。

ところがこれで解決しない場合があります。私のように同じメーカーの同じ製品を2台使っている場合です。USBの機器にはシリアル番号を提供するものもあり(私の所持するIO-DATA製の外付けディスクなどがそう)ますが、SCSIエミュレーションのデバイスが提供してくる情報からは得られず、全く区別がつきません。

そこでLinux 2.6で最近登場した ubを使います。カーネルをリコンパイルしてubを有効にします。そのさいusb-storageドライバとSCSIエミュレーションによる方法は勝手に無効化されます。たぶん…。
私の環境ではカーネル構築だけDebian流にやってません、ご容赦ください。

ubを有効にする(Linux 2.6.16)
# cd /usr/src/linux
# make menuconfig
(Device Drivers -> Block devices -> Low Performance USB Block driver)
(.configならCONFIG_BLK_DEV_UB = yにする)

再起動すると /devの下にubaとかubbというブロックデバイスができていると思います。このデバイスに対してudevinfoするとIDという項目があると思います。これはおそらくUSBバス上の物理的なポートの位置ではないかと思います。

ubの情報
# udevinfo -a -p /sys/block/uba
(... 略 ...)
follow the class device's "device"
  looking at the device chain at '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0':
    BUS="usb"
    ID="1-1:1.0"
    DRIVER="ub"
    SYSFS{bAlternateSetting}=" 0"
(... 略 ...)

差し替えたり、抜いてみたりして観察してみた限り、IDは私の環境では同じポートに接続する限り不変な値のようです。この性質を利用して区別します。
先ほどのlocal.rulesに対して、以下のように書きました。

IDで区別するudevルールの例
BUS="usb", ID="1-1:1.0", NAME="usb1-1_hd%n"
BUS="usb", ID="1-2:1.0", NAME="usb1-2_hd%n"
BUS="usb", ID="1-3:1.0", NAME="usb1-3_hd%n"
BUS="usb", ID="1-4:1.0", NAME="usb1-4_hd%n"
BUS="usb", ID="1-5:1.0", NAME="usb1-5_hd%n"
BUS="usb", ID="1-6:1.0", NAME="usb1-6_hd%n"

これでmount /dev/usb1-1_hd1 /mnt/usb1-1-1などとすると、ポート1に接続されているデバイスの先頭パーティションをマウントできます。
肝心のポート1がどれなのかは、実際に機器を接続してudevinfoをして調べます。私にはIDを調べるうまい方法がわかりませんでした。ごめんなさい。

外付けUSB HDDでSoftware RAIDを構築する全ての方へ。
※しつこいですが私自身よくわかってないので、間違いなどあるかもしれません。ご指摘は大歓迎です。

Software RAIDについては、先日(2006年5月7日参照)紹介したので mdadmの使い方、cat /proc/mdstatの意味など基本的なことはそちらを見ていただくとしましょう。
さて、当方の環境ですが /homeを担っていたhda7とUSB HDD 3台でRAID 0+1を構築し、/homeにマウントしようと思います。容量は160GB(RAID1)+160GB(RAID1) のストライピング(RAID0) で320GBとなります。信頼性と容量が今までの倍になるわけです。そのぶんHDDが4倍ですが…。

まずはRAID1を2つ作成します。RAID1をいきなり作ってしまうと、ディスクの同期処理が始まり何もできなくなるので、いったん縮退モードで作成してデータのコピーを済ませ、その後ディスクを追加します。

RAID1アレイを二つ作成
# mdadm --create /dev/md0 -l1 -n2 missing /dev/usb1-1_hd

# mdadm --create /dev/md1 -l1 -n2 missing /dev/usb1-3_hd

次に2つのRAID1をまとめるRAID0アレイを作成します。この構成はRAID1+0と呼ぶのかもしれませんが、ここでは一貫してRAID0+1と呼びます。
RAIDを作成するときデバイスファイルがないと言われたら、-aを付けてください。

RAID0+1アレイを作成
# mdadm --create /dev/md3 -a -l0 -n2 /dev/md0 /dev/md1

間違ってmd2ではなくmd3にしてしまいましたがそのままいきます…。/proc/mdstatを見て作成されたかどうか確認します。確認したらmd3をreiserfsでフォーマットします。

アレイの確認とフォーマット
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] [raid4] [raid6]
md3 : active raid0 md0[0] md1[1]
      317127104 blocks 64k chunks

md1 : active raid1 ubc[1]
      156290816 blocks [2/1] [_U]

md0 : active raid1 uba[1]
      160836416 blocks [2/1] [_U]

unused devices: <none>

# mkreiserfs /dev/md3
(... 略 ...)

ブート時に自動的に構成されるように /etc/mdadm/ にある mdadm.confにRAID構成の設定を保存します。

アレイの設定を保存する
# cd /etc/mdadm
# echo DEVICE /dev/usb* /dev/md* > mdadm.conf
# mdadm --detail --scan >> mdadm.conf

# cat mdadm.conf
DEVICE /dev/usb1-1_hd /dev/usb1-2_hd /dev/usb1-3_hd /dev/md0 /dev/md1 /dev/md3
ARRAY /dev/md3 level=raid0 num-devices=2 UUID=bxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxx2
   devices=/dev/md0,/dev/md1
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=0xxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxx9
   devices=/dev/usb1-3_hd
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=9xxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxx7
   devices=/dev/usb1-1_hd

catした結果を見るとmd3, md1, md0の順番でスキャンされています。このままで良いはずなのですが、私の環境では md3の設定を一番後ろに書かないと、起動時にコケてしまいます。md3がmd0とmd1に依存しているからかなあ?よくわかりません。
データをコピーして、再起動したらディスクを追加します。同期処理にしばらくかかるので放置しておきましょう。

アレイにディスクを追加する
# mdadm --manage /dev/md0 -a /dev/usb1-2_hd

# mdadm --manage /dev/md1 -a /dev/hda7

mdadm.confの設定を更新するのもお忘れなく。あとはfstabを修正して再起動してみて、動作を確認したら終わりです。

編集者:すずき(2006/11/19 16:16)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2006年5月14日 >>> 2006年5月14日
link もっと後

管理用メニュー

link 記事を新規作成

<2006>
<<<05>>>
-123456
78910111213
14151617181920
21222324252627
28293031---

最近のコメント5件

  • link 24年4月22日
    hdkさん (04/24 08:36)
    「うちのHHFZ4310は15年突破しまし...」
  • link 24年4月22日
    すずきさん (04/24 00:37)
    「ちゃんと数えてないですけど蛍光管が10年...」
  • link 24年4月22日
    hdkさん (04/23 20:52)
    「おお... うちのHHFZ4310より後...」
  • link 20年6月19日
    すずきさん (04/06 22:54)
    「ディレクトリを予め作成しておけば良いです...」
  • link 20年6月19日
    斎藤さん (04/06 16:25)
    「「Preferencesというメニューか...」

最近の記事3件

  • link 24年2月7日
    すずき (04/24 02:52)
    「[複数の音声ファイルのラウドネスを統一したい] PCやデジタル音楽プレーヤーで音楽を聞いていると、曲によって音量の大小が激しく...」
  • link 24年4月22日
    すずき (04/23 20:13)
    「[仕事部屋の照明が壊れた] いきなり仕事部屋のシーリングライトが消えました。蛍光管の寿命にしては去年(2022年10月19日の...」
  • link 24年4月17日
    すずき (04/18 22:44)
    「[VSCodeとMarkdownとPlantUMLのローカルサーバー] 目次: LinuxVSCodeのPlantUML Ex...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 04/24 08:36