CentOSでホームサーバを作ろう
データ用HDDの準備
最終更新:
centos-homeserver
-
view
はじめに
インストール時にデータ用HDDを取り外していたので、
それを1台ずつ接続し、順次設定を行っていく。
(※一気に全てのHDDを接続すると
作業手順を間違える恐れがあると思い、1台ずつ行うことにした。)
それを1台ずつ接続し、順次設定を行っていく。
(※一気に全てのHDDを接続すると
作業手順を間違える恐れがあると思い、1台ずつ行うことにした。)
大まかな作業の流れ(手順)
- 起動ディスク(WD3200BEVT)のデバイス名の固定
データ用HDDを接続する過程でデバイス名が変化するのを防ぐため。 - WD20EARSのパーティション作成
※Advanced Format Technologyへの対応を含む - 各HDDのデバイス名の固定
- RAID設定
- フォーマット(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」というファイル名で作成した。
内容は以下の通り。
ここでは後のデータ用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が決定するとそれ以降のルールは適用されないから。)
(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 でヘルプ): pDisk /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/sdbDisk /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に対して実施する。
あとは、同様の作業を全てのRAID対象のHDDに対して実施する。
増設したHDDのデバイス名の固定
接続したポートやBIOSの認識順序でデバイス名(”/dev/sdX1”)は変化するので、
udevを用いてHDDのデバイス名を固定する。(具体的にはデバイスの別名(SYMLINK)を作成する。)
上記でパーティションを設定したHDDのパーティションが/dev/sdb1となったとして、
以下の手順で設定ファイルを記述する。
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のデバイス名の固定方法は全く見つからなかった、、、。(-_-;)
各コマンドのオプションについては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のルールは先頭の数値の少ない方から適用されるので、
ユーザが独自に作成するルールは、デフォルトで存在するファイルを見て適切な番号にすること。
ここでは「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のシリアルキーパラメータを設定していく。)
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個文の別のデバイス名ができる。
/dev/data_hdd_01〜/dev/data_hdd_13、まで13個文の別のデバイス名ができる。
ちなみに、この追加ルールを適用して、
実際にどのようなデバイス名ができるかを事前確認したい場合は、
udevtestコマンドを使用する。例えば、
実際にどのようなデバイス名ができるかを事前確認したい場合は、
udevtestコマンドを使用する。例えば、
# udevtest $(udevinfo -q path -n /dev/sda1)
とすれば、出力されるメッセージから動作確認ができる。
また、実際にルールを適用させるには、start_udevコマンドを使用する。
また、実際にルールを適用させるには、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デバイス名の固定方法はこの情報を参考にしている。)
接続されている親のデバイスも含めた情報を得ることができる。
(ググるとよく見つかるUSBデバイス名の固定方法はこの情報を参考にしている。)
RAIDアレイ作成
mdadm(create)
mdadmを使用する。指定するデバイス名は前段で作成した別名のデバイス名
(ただし、作成後の設定ファイルはUUIDを使用した内容に修正する。)
(ただし、作成後の設定ファイルは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番号が確認可能。
「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アレイを/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”で確認可能。)
「スペアディスク」扱いになっている。(”mdadm -D /dev/md0”で確認可能。)
- HDDをアクティブにする
# mdadm -G /dev/md0 -n <アクティブにした後の合計のドライブ数。例:10>
※ある程度時間がかかる。
- 追加後のRAIDアレイの状態確認
# mdadm -D /dev/md0
Array Size、Active Devices、Spare Devicesなどの情報を確認し、
Arrayサイズが増えていて、アクティブデバイスの数も追加されて上で指定した数に
なった事を確認する。
Arrayサイズが増えていて、アクティブデバイスの数も追加されて上で指定した数に
なった事を確認する。
フォーマット(xfs)
CentOS 5.4以降は技術プレビューとしてXFSファイルシステムの認識がサポートされるようになったので、
(カーネルが標準でファイルシステムを認識可能になった。)
以前のようにカーネルモジュールを別途インストールする必要は無くなった。
(詳細はこちらのリリースノートを参照のこと。)
ただし、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不要
である。
なお、行末の数字が意味するのは
0:dump不要
0:起動時のfsck不要
である。
/dev/md0 /mnt/data xfs defaults 0 0
※参考リンク
- Advanced Format Technologyへの対応についての情報(Linux)
- udevルールの記述について
※残念ながらどれも情報源としては古く、間違いもある。
最新版は記述方法が変わっているので、正確な情報はmanを参照した方が良い。 - mdadm
- mdadmのマニュアルページ(Ver1.5)
※最新版ではないので参考までに。 - mdadmでのRaid構築例1(raid-10のサンプル。参考までに。)
- mdadmでのRaid構築例2(raid-5のサンプル。参考までに。)
- 既存のRaidアレイの拡張(raid-5での参考手順)
なお、本文中に"--raid-disks="という記述があるが"--raid-devices="の間違いではないかと思われる。(未確認) - mdadmを使ったRaidアレイの管理など
- mdadmで作ったRaidの削除方法(作り直したい時などの参考に。)
- raid6の領域拡張についてのフォーラム(海外)
- raid6の領域拡張についてのフォーラム(Vine Linux)]]
- SUSELinuxでのmdadmについてのまとめ
- mdadmのマニュアルページ(Ver1.5)
- xfs