すでに作ってから日付が経過しているのでログなどはあまり残っていませんが、
残っている記憶や参照にしたURLなどを書いておかないと次に作成できなくなるのが痛いのでとりあえず書いておきます。
その途中に起こっていることに関してはファイルサーバー製作日記に記述されていますが、今回はインストールとRAID構築だけです。
作成に使用するハードウェア
NAS Linux構築予定だったものを少し変更した物を使います。
HDDがちゃんと6つすべて搭載されていると言う状態です。
問題なのは
- SATA6つをすべてHDDで使用する(System HDDx1+RAID HDDx5)のでインストールはUSBブートを考える必要が
- 結局OSはDebianLinuxだと今現在のバーションでは問題ありとしてCentOSを使うことに
でした。
Linuxのインストール
というわけで、結局CentOSを使うことになりました。
SATAはすべて埋まっているのでUSBにDVD-ROMドライブをつなぐなり、USBにCentOSのイメージを書き込んで起動できるようにしてインストールをすればOKです。
Linuxのインストール自体はメディアの指示に従えば問題になるようなことはないでしょう。
各種パッケージのインストール
LinuxをNASとして使うためには必要なサービスがいくつかあります。よく使う物としては
http | Apache,MySQL |
---|---|
ftp | vsftpd |
firewall | iptables |
Windows共有 | samba |
ソフトウェアRAID | mdadm |
DLNA | Mediatomb(MySQL) |
リモート管理 | vncserver(tigervnc-server) |
仮想マシン | KVM(qemu,libvirtd) |
があります。RAIDに関しては以降に書きますが、他のもの追加に関しては別の機会があれば。
RAID構築について
チップセットにもRAIDの機能はありましたが、結局ソフトウェアRAIDを使うことにしました。そのため、mdadmでの構築を行います。
ソフトウェアRAIDを作成するときにはこちらを参考に。すべて英語ですが。
RAID領域を確保
まずは各HDDにRAID用の領域を確保することに。使用するのはpartedです。ない場合はyumでとってきます。
例として、/dev/sdbにRAID用領域を確保するときのコマンド例です。
> select /dev/sdb > mklabel gpt > mkpart primary 2048s -1s > set 1 raid on
さすがに3TBもあるHDDでAFTではない、と言うことはないでしょうからGPTに変更します。また、先頭セクタが4KB境界なるように調整するのも必要ですね。
ちなみに、すべてが同じHDDでない(と言うか、総セクタ数が異なるHDDが混じっている)時はちゃんとすべてが同じサイズになるように構築した方がいいです。
RAIDを構築
sdbからsdfまで同じように領域を確保した後はRAIDを構築します。今回はRAID5で構築します。
# mdadm -C /dev/md0 -l5 -n5 -c64 /dev/sd[bcdef]1
RAIDレベルを5(-l5)、有効となるデバイス数を5(-n5)、RAIDチャンクサイズを64kB(-c64)、デバイスをsdb~sdfで設定します。
なお、チャンクサイズについては速度が気になる人は変化させて調べてみるといいと思います。
RAID内にファイルシステムを構築
で、最後にファイルシステムを構築します。初めはbtrfsを使っていたのですが、どうもCentOS上では微妙に相性が悪かったようで、後にext4に変えています。
ext4で構築するときには以下のように入力します。
# mke2fs -t ext4 -m 0 -b 4096 -E stride=16,stripe-width=64 /dev/md0
なお、オプションはかなり注意が必要です。RAIDの状態とかみ合わなくなるととたんに速度が遅くなります。
パラメータは以下のように定めます。
パラメータ引数 | 意味 | 値 |
---|---|---|
-t | ファイルシステム名 | ext4 |
-m | 管理領域サイズ(rootが使用できる専用領域サイズをパーセントで) | 0 |
-b | ブロックサイズ | 4096(4kB) |
-E stride=16 | ストライド幅 | 16 |
-E stripe-width=64 | ストライプ長 | 64 |
strideおよびstripe-widthはRAIDとの絡みで以下のように設定されます。
stride = チャンクサイズ / ブロックサイズ (上記の場合64kB / 4kB = 16)
stripe width = ストライド幅 * (本来のデータが保存されるデバイス数) (上記の場合 16 * (5 – 1 – 0) = 64)
RAID5の場合、各チャンクごとに本来のデータが保存されるデバイス数=全デバイス数-冗長デバイス(パリティ保存デバイス)-スペアデバイス=(デバイス数-1-0)となるので、上のようになります。
スペアデバイスを増やしたすると変わりますし、冗長デバイス(RAID1系であればミラーデバイス、RAID456系であればパリティ保存デバイス)の数を間違えないようにしましょう。
mdadm.confの更新
mdadm.confにARRAYの指示を追加します。すでに/etc/mdadm.confにある場合はその行を一度削除して
# mdadm --detail --scan >> /etc/mdadm.conf
を実行します。
作成されたパーティションのUUIDを取得
今回はext4で作っていますので
# dumpe2fs /dev/md0
でファイルシステムのUUIDを取得します。この場合、Filesystem UUIDが指している物がそうです。
汎用的には
# ls -l /dev/disk/by-uuid
で、各パーティションのUUIDが出ますので、md0を指している物のシンボリックリンク名がそれになります。
fstabにmount指示を追加
RAID領域をデータ領域(/data)として扱います。特に無駄な書き込みやらext4のトランザクションを簡略化した設定します。
UUIDを(12345678-abcd-abcd-9876-fedcba987654)とすると、fstabに
UUID=12345678-abcd-abcd-9876-fedcba987654 /data ext4 defaults,nobh,nobarrier,relatime 1 2
と言う列を追加します。
あとは一度HDDを取り外したりしてRAIDが保てなくなったときの準備を
データが保存されていないうちに再構築の実験はしておいた方がいいかもしれませんね。
特にRAIDが維持できなくなったときにメール連絡やらの通報が動くかもテストしておかないとひどい状況になると思われますので。