Linux 2.6.0でUSBストレージをRAIDにしてしまう

外部HDDをUSBで接続し、さらにRAID1に設定する方法を説明する。ここではHDDを2つ使うかわりにUSBメモリを使って試す。

USBストレージを加える

[PR] USB接続の外付HDD
iconicon
アフリエイトについて

[PR] USBメモリ
iconicon
アフリエイトについて
カーネルでUSBマスストレージの設定を行いコンパイルしている。USBメモリを接続するとSCSIデバイスとして認識されるようになる。

hub 3-0:1.0: new USB device on port 2, assigned address 2
scsi0 : SCSI emulation for USB Mass Storage devices
  Vendor: BUFFALO   Model: ClipDrive         Rev: 1.88
  Type:   Direct-Access                      ANSI SCSI revision: 02
SCSI device sda: 64000 512-byte hdwr sectors (33 MB)
sda: Write Protect is off
sda: Mode Sense: 00 06 94 00
sda: assuming drive cache: write through
 sda: sda1
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
Attached scsi generic sg0 at scsi0, channel 0, id 0, lun 0,  type 0
WARNING: USB Mass Storage data integrity not assured
USB Mass Storage device found at 2

問題は、USBをさしたままブートしたときに、どちらがsdaで、どちらがsdbなのかということである。既にブートした後にUSBをさせば、先に挿したたほうがsdaになるのは当たり前である。優先がわからない。そこで、次の作戦を考える。
  1. 両方とも挿したままブートする。
  2. いきなりUSBのどちらかを抜く
  3. すると"USB disconnect, address 数字"が出るはず。数字がアサインされたアドレスである

忘れないうちにUSBポートのアドレス番号が何番だったかをメモしておこう。
追記: scsidevというコマンドを使えば/dev/scsi以下にデバイスファイルが作成され、SCSIデバイスが固定的な名前でアクセスできるようになる。 SCSI-2-4-HOWTO 3.4scsidevにおけるデバイス名

次にcfdiskを使い両方のパーティションのFSタイプをLinuxにしておく。


Debian WoodyでSoftware RAIDを使いraid1を作る Debian Woodyでのソフトウェアraidの設定
(2003年11月)


1) apt-get で必要なツールをインストール


# apt-get install raidtools2

2) /etc/raidtabのraid1用設定
raiddev /dev/md0
   raid-level         1
   nr-raid-disks       2
   nr-spare-disks     0
   chunk-size        4
   persistent-superblock 1
   device    /dev/sda1  <-- ここ
   raid-disk   0
   device    /dev/sdb1  <-- ここ
   raid-disk  1

3) セットアップ

 # mkraid /dev/md0

これでraidのセットアップはすべては終了。/dev/md0 が使えるようになる。USBメモリでも出来てしまうのが、ちょっと驚きだ。USB マスストレージでSCSIデバイスとして見えているので、当たり前といえば当たり前なのだが...
4) 確認 # cat /proc/mdstat
  Personalities : [raid1]
  read_ahead 1024 sectors
  md0 : active raid1 sdb1[1] sda1[0]
        31872 blocks [2/2] [UU]
  unused devices: <none>
5) ファイルシステムを作る
# mkfs /dev/md0

総容量32MBのファイルシステムが出来てしまう
6) マウント
# /dev/md0 /mnt

マウントする。マウント出来てしまうのが怖い。


Raid1でHDDが故障した時の対処練習をする HDDがクラッシュした時の対処練習を行う。

1)実際にUSBメモリを引っこ抜いてみる sdb側のUSBメモリを引っこ抜く。するとデバイスのエラーを示すメッセージが腐るほどでる。その後、次のようなメッセージが現れる。

--- wd:1 rd:2
 disk 0, wo:0 o:1 dev:sda1
 disk 1, wo:1 o:0 dev:sdb1
RAID1 conf printout:
--- wd:1 rd:2
 disk 0, wo:0 o:1, dev:sda1

ここで/proc/mdstatを見てみる
# cat /proc/mdstat
  Personalities : [raid1]
  read_ahead 1024 sectors
  md0 : active raid1 sdb1[2](F) sda1[0]
        31872 blocks [2/1] [U_]
  unused devices: <none>

どうやらちゃんと片っ方のHDDだけで動いているようだ。ここでファイルを読み書きしてもちゃんと動いていて問題はない。期待通りの動作だ。

2)ディスクの修理(のつもり) 引っこ抜いたUSBメモリをWindows XPに接続すると、何も中身のないFATフォーマットのリムーバブル見え、読み込み書き込みが出来た。Windows上での扱いは主旨ではないので、ここまでにするが、念のためFATフォーマットで再フォーマットをかけて、取り外す。

さて、これで新しいUSBストレージが用意されたこととして先を進める。何にも考えず、動作中にUSBメモリを挿してみるとSCSI3、sdc:sdc1として認識される。他の機会ではsdb1に見える場合もある。この辺はタイミングの問題かと思われる。

差し込んだUSBメモリに対応しているデバイスに対してcfdiskをかけてパーティションをlinuxタイプにしておく。

気持ちも新たにリブートする。
3) raid1のアレイに加える さて、現在/dev/md0として/dev/sda1が使われており、補助のデバイスが存在しない状態である。この状態から、/dev/sdb1を加える作業を行う。

# raidhotadd /dev/md0 /dev/sdb1

リカバーの状態を見てみる
# cat /proc/mdstat

処理が終わるとディスクの状態を意味するメッセージが出る。そこで/proc/mdstatを参照してみると、正しくraid1が動作していることが表示される。


md: md0: sync done.
RAID1 conf printout:
--- wd:1 rd:2
 disk 0, wo:0 o:1 dev:sda1
 disk 1, wo:1 o:0 dev:sdb1
# cat /proc/mdstat
  Personalities : [raid1]
  read_ahead 1024 sectors
  md0 : active raid1 sdb1[1] sda1[0]
        31872 blocks [2/2] [UU]
  unused devices: <none>



目次へ

すずきひろのぶ hironobu at h2np dot net 更新日: