CentOSでホームサーバを作ろう

データ用HDDの準備

はじめに

インストール時にデータ用HDDを取り外していたので、
それを1台ずつ接続し、順次設定を行っていく。
(※一気に全てのHDDを接続すると
  作業手順を間違える恐れがあると思い、1台ずつ行うことにした。)

大まかな作業の流れ(手順)
  1. 起動ディスク(WD3200BEVT)のデバイス名の固定
    データ用HDDを接続する過程でデバイス名が変化するのを防ぐため。
  2. WD20EARSのパーティション作成
    ※Advanced Format Technologyへの対応を含む
  3. 各HDDのデバイス名の固定
  4. RAID設定
  5. フォーマット(xfs)

起動ディスクのデバイス名の固定

大まかな流れは下のデータ用HDDのデバイス名の固定と同様。

HDDのシリアルNO(一意キー)を取得

# scsi_id -g -u -s $(udevinfo -q path -n /dev/sda)
を実行すると、例えば以下のような実行結果が得られる。
SATA_WDC_WD3200BEVT-_WD-WXH0AB949177  <=HDDのシリアル番号が最後に付与されている
これを識別キーとして「/etc/udev/rules.d」以下にHDD用のルールファイルを作成する。
ここでは後のデータ用HDD用のルール記述と、
併せて考慮し「10-hdd.rules」というファイル名で作成した。
内容は以下の通り。
# System Disk
BUS=="scsi", KERNEL=="sd[a-z][1-9]", PROGRAM="scsi_id -g -u -s %p", RESULT=="SATA_WDC_WD3200BEVT-_WD-WXH0AB949177", NAME="sda%n"
後のデータ用HDDの記述と異なり、SYMLINKではなく、NAMEを用いてデバイス名の固定を計っている。
(udevルールはNAMEが決定するとそれ以降のルールは適用されないから。)

WD20EARSのパーティション作成
(Advanced Format Technologyへの対応を含む)

基本的には参考リンクと同様の対応を行う。

fdisk

以下のようにパーティションを作成する
# fdisk -H 224 -S 56 /dev/sdb
+  詳細解説
コマンド (m でヘルプ): n
コマンドアクション
e   拡張
p   基本領域 (1-4)
 p
領域番号 (1-4): 1
 〜
最初と最後のシリンダの指定はデフォルトのまま(1パーティションで使用する)
 〜
コマンド (m でヘルプ): t
Selected partition 1
16進数コード (L コマンドでコードリスト表示): fd   ←パーティションのシステムタイプをRAIDにする。
コマンド (m でヘルプ): p
Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes
224 heads, 56 sectors/track, 311465 cylinders
Units = シリンダ数 of 12544 * 512 = 6422528 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdb1               1      311465  1953508452   fd  Linux raid 自動検出
コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。

# fdisk - l -u /dev/sdb
Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes
224 heads, 56 sectors/track, 311465 cylinders, total 3907029168 sectors
Units = セクタ数 of 1 * 512 = 512 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdb1              56  3907016959  1953508452   fd  Linux raid 自動検出
開始セクタが56になっていてヘッダが224に設定されているのを確認。
あとは、同様の作業を全てのRAID対象のHDDに対して実施する。

増設したHDDのデバイス名の固定

接続したポートやBIOSの認識順序でデバイス名(”/dev/sdX1”)は変化するので、
udevを用いてHDDのデバイス名を固定する。(具体的にはデバイスの別名(SYMLINK)を作成する。)
上記でパーティションを設定したHDDのパーティションが/dev/sdb1となったとして、
以下の手順で設定ファイルを記述する。

HDDのシリアルNO(一意キー)を取得

# scsi_id -g -u -s $(udevinfo -q path -n /dev/sdb1)
を実行すると、例えば以下のような実行結果が得られる。
SATA_WDC_WD20EARS-00_WD-WCAVY2590611  <=HDDのシリアル番号が最後に付与されている

   留意事項:
    各コマンドのオプションについてはmanを参照してください。
    なお、本当はUUIDを一意キーにしたかったが、どうしてもここに記述されている方法では対応できなかった。
    そもそも後述の「# udevinfo -q all -n /dev/sdc1」で取得されるパラメータの中にUUIDが無いので、
    SATA-HDDのデバイス名をUUIDで固定するのは難しいのかもしれない。
    ググってもUSB-HDDのデバイス名の固定方法は多数見つかったが
    通常のSATA接続のHDDのデバイス名の固定方法は全く見つからなかった、、、。(-_-;)

これを識別キーとして「/etc/udev/rules.d」以下にデータHDD用のルールファイルを作成する。
ここでは「10-hdd.rules」というファイル名で作成した。
なお、udevのルールは先頭の数値の少ない方から適用されるので、
ユーザが独自に作成するルールは、デフォルトで存在するファイルを見て適切な番号にすること。

データ用HDDは13台接続する予定なので、以下のような内容にした。

# Data HDD-01
BUS=="scsi", KERNEL=="sd[b-z]1", PROGRAM="scsi_id -g -u -s %p", RESULT=="SATA_WDC_WD20EARS-00_WD-WCAVY2590611", SYMLINK="dhd_01"

# Data HDD-02
BUS=="scsi", KERNEL=="sd[b-z]1", PROGRAM="scsi_id -g -u -s %p", RESULT=="SATA_WDC_WD20EARS-00_WD-WCAVY2604370", SYMLINK="dhd_02"

・・・以下同様にHDD-13まで続く。

簡単に内容を解説すると、
BUSが"scsi"で、カーネルがsdb1〜sdz1のようなデバイス名で認識しているディスクデバイスに対して、
"scsi_id -g -u -s %p"というコマンド(%pはブロッックデバイス名を指す。例えば「/block/sda/sdb1」など。)を実行した結果が
"SATA_WDC_WD20EARS-00_WD-WCAVY2590611"だったら、通常のデバイス名の"/dev/sdb1"とは別に
"/dev/data_hdd_01"という別のデバイス名(シンボリックリンク)を付与するという内容。
(RESULT=="〜"の箇所に、それぞれN番目として固定したいHDDのシリアルキーパラメータを設定していく。)

これを13台分記述してやると、全てのHDDを接続した場合には、
/dev/data_hdd_01〜/dev/data_hdd_13、まで13個文の別のデバイス名ができる。

ちなみに、この追加ルールを適用して、
実際にどのようなデバイス名ができるかを事前確認したい場合は、
udevtestコマンドを使用する。例えば、

# udevtest $(udevinfo -q path -n /dev/sda1)

とすれば、出力されるメッセージから動作確認ができる。
また、実際にルールを適用させるには、start_udevコマンドを使用する。

# start_udev

(udevデーモンの再起動が行われる。面倒ならマシンを再起動させても良い。)

なお、参考までに

# udevinfo -q all -n /dev/sdb1

を実行すると、例として以下のような実行結果が得られる。

P: /block/sdc/sdb1
N: sdb1
S: disk/by-id/scsi-SATA_WDC_WD20EARS-00_WD-WCAVY2590611-part1
S: disk/by-path/pci-0000:00:1f.2-scsi-2:0:0:0-part1
E: ID_VENDOR=ATA
E: ID_MODEL=WDC_WD20EARS-00S
E: ID_REVISION=80.0
E: ID_SERIAL=SATA_WDC_WD20EARS-00_WD-WCAVY2590611  ※今回はこれを使用している。
E: ID_TYPE=disk
E: ID_BUS=scsi
E: ID_PATH=pci-0000:00:1f.2-scsi-2:0:0:0
  ※ちなみにPはPATH(ブロックデバイスのPath)、NはNAME、SはSYMLINKのパラメータ、EはENVのパラメータの略。

また、参考リンクにあるように、

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

とudevinfoにブロックデバイス名を引数として渡すことで、
接続されている親のデバイスも含めた情報を得ることができる。
(ググるとよく見つかるUSBデバイス名の固定方法はこの情報を参考にしている。)

RAIDアレイ作成

mdadm(create)

mdadmを使用する。指定するデバイス名は前段で作成した別名のデバイス名
(ただし、作成後の設定ファイルはUUIDを使用した内容に修正する。)
# mdadm --create /dev/md0 --chunk=512 --level=6 --raid-devices=13 /dev/dhd_01 /dev/dhd_02 /dev/dhd_03 /dev/dhd_04 /dev/dhd_05 /dev/dhd_06 /dev/dhd_07 /dev/dhd_08 /dev/dhd_09 /dev/dhd_10 /dev/dhd_11 /dev/dhd_12 /dev/dhd_13
※大きなファイルのコピーの頻度が多そうなのでchunkサイズはデフォルトの64Byteから512Byteに増やしてみた。
現在の状態を知るには、以下のコマンドで確認できる。
# cat /proc/mdstat
※なお、これだけの大容量なので、非常に時間がかかるので注意。半日(12時間ぐらい)は多分必要と思われる。
その間にサーバーの他の設定を行うと良い。

/etc/mdadm.confの修正

現在の状態を/etc/mdadm.confに設定する。(反映)
# vim /etc/mdadm.conf
編集内容は以下の通り。
MAILADDR root
DEVICE partitions
次に、"mdadm -D --scan"の出力結果を末尾に追加する。
# mdadm -D --scan >> /etc/mdadm.conf
最終的に以下のようになる。(最後の行は各マシンごとに「mdadm -D --scan」の出力内容により変化する)
MAILADDR root
DEVICE partitions
ARRAY /dev/md0 level=raid6 num-devices=13 UUID=022f87c6:0b798a1e:60166cf0:b618fda3
※この「DEVICE partitions」の指定がポイントになるらしい。
 「DEVICE partitions」を指定すると/proc/partitionsを参照して動作するようになるので、
 RAIDを構成するパーティションが変わってもRAIDを認識してくれる。
 例えば「DEVICE /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1」でも動作はするが、
 RAIDを構成するパーティションが変わった場合にRAIDを認識しなくなる可能性があるため。
 ちなみに、cat /proc/partitionsを実行すれば、パーティションごとに一意に振られたmajor&minor番号が確認可能。

補足事項(HDDの管理についてのメモ)

RAIDを構成する一部のディスクが故障

  • 対象のディスクに不良のマークを付ける。(縮退状態になる。)
  • 対象のディスクを取り外して新しいディスクを取り付ける。
  • 新しいディスクを縮退状態のアレイに参加させる。

RAIDの領域拡張

今回は13台もの新しいディスクで一気にアレイを作成したが、最初は少数のディスクでアレイを作成し、
順次アレイを拡大していく方法を以下に紹介する。
(追加対象のRAIDアレイを/dev/md0とし、追加するデバイスを/dev/sdw1とする。)
注:領域拡張が可能なのは、カーネルのバージョンが2.6.21以降である。(Raid6の場合)
  CentOSは比較的古いバージョンのカーネルを使用しているので(2.6.18-xxx)
  以下の方法を用いるには事前にカーネルのバージョンをあげておく必要がある。
  詳しくは「その他」〜「カーネルのバージョンアップ」を参照。
  • 追加前のRAIDアレイの状態確認
# mdadm -D /dev/md0
Array Size、Active Devices、Spare Devicesなどの情報を確認。
  • アレイへのHDD追加
# mdadm /dev/md0 -a /dev/sdw1
※この状態ではまだ「参加」しているだけなので有効(active)になっていない。
「スペアディスク」扱いになっている。(”mdadm -D /dev/md0”で確認可能。)
  • HDDをアクティブにする
# mdadm -G /dev/md0 -n <アクティブにした後の合計のドライブ数。例:10>
※ある程度時間がかかる。
  • 追加後のRAIDアレイの状態確認
# mdadm -D /dev/md0
Array Size、Active Devices、Spare Devicesなどの情報を確認し、
Arrayサイズが増えていて、アクティブデバイスの数も追加されて上で指定した数に
なった事を確認する。

フォーマット(xfs)

CentOS 5.4以降は技術プレビューとしてXFSファイルシステムの認識がサポートされるようになったので、
(カーネルが標準でファイルシステムを認識可能になった。)
以前のようにカーネルモジュールを別途インストールする必要は無くなった。
(詳細はこちらのリリースノートを参照のこと。)
ただし、xfsのフォーマットツールや管理用ツールは無いので、別途インストールが必要。

各種ツールのインストール

# yum -y install xfsprogs xfsdump

フォーマット

# mkfs.xfs /dev/md0

マウント

ここでは/mnt/dataというマウントポイントにマウントしてみる。
# mount -t xfs /dev/md0 /mnt/data
マウントされたかをdfコマンドで確認する。
# df --si
以下のように表示されれば問題無し。
Filesystem Size Used Avail Use% マウント位置
/dev/md0 xxT xxM xxT 1% /mnt/data

fstabへの記述

以下の行を追記して、起動時に自動的にマウントされるようにする。
なお、行末の数字が意味するのは
0:dump不要
0:起動時のfsck不要
である。
/dev/md0 /mnt/data xfs defaults 0 0



※参考リンク