自宅サーバー構築日記: CentOS7でmdadmを使ったソフトウェアRIADを組む

  • 更新日:
  • 公開日:

クリスマスまで6~7日という、12月も中旬にさしかかる最中に当ブログで「アドベントカレンダーやろう!」とは言えず(良いネタも思いつかず)、なので最近ちまちま行っている自宅サーバー構築について少しずつ書いてみようかなと。記してみようかなと。

自宅サーバーを構築して何がしたいかというと、主に以下のものを用意したいのです。

  • ファイル共有サーバー
  • iTunesサーバー
  • ownCloud
  • Gitlab
  • Jenkins
  • その他やってみたいこと(Botさんの召喚とか)

というワケでまずはファイル共有サーバーを用意したいのですが、その前にデータ保存を安全にするためRAIDを組みました。その流れをメモしておきます。(先に述べておきますが、自分はLinuxスーパー初心者です。ので、同じく初心者の方対象の内容にしたつもり…です)

mdadmを使ってソフトウェアRAIDを組む

ソフトウェアRAIDを組むにはいくつか方法(LVMやらZFSやら)があるようで、その中でもインフラに詳しい友達に薦められたmdadmを使うことにしました。

組む手順の前にサーバー環境を載せておきます。

サーバー機N54L PROLIANT-500
OSCentOS 7
RAM4GB
HDD500GB + 2TB * 2

サーバー機はこちらで、

HDDにはこちらを2つ使用しました。

ちなみに今回、主に2つの記事を参考にソフトウェアRAIDを組みました。

参考記事:

CentOSでソフトウェアRAIDの構築 – maruko2 Note.

3TB-HDDでソフトウェアRAID構築 | Scribble

上記2つの記事を見ればある程度作業は進むのですが、自分なりに躓いた点もあったのでそこらへんを書きます。(初心者なので変なところに躓いたのでしょう)

一つ目の参考記事から引用しますと、ソフトウェアRAIDを組む手順はこのようになります。

大まかな手順は次のようになる。

  1. RAID を構成するディスクに RAID 用パーティションを作成 (fdisk コマンドなど)。
  2. mdadm コマンドで RAID アレイを作成。
  3. /etc/mdadm.conf を作成。
  4. RAID アレイをフォーマット(ファイルシステム作成)。

それでは早速作業内容について。(以降の例ではRAID 1を組みます)

0.RAIDを組むデバイスを確認する

パーティションを作成する前に、RIADを組みたいデバイスを確認しておきます。サーバー機に接続されたHDDを確認するには以下のコマンドを実行します。

# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb /dev/sdc

これは自分の例ですが、サーバー機に接続されている500GB、2TB、2TBはそれぞれデバイスドライバを通してディレクトリに割り当てられます。

500GB/dev/sda
2TB一つ目/dev/sdb
2TB2つ目/dev/sdc

sdとは「SCSIディスク」の略で(多分)、後ろにつく”a”、”b”、”c”はサーバー機に接続された順番で振り分けられます。上の例では/dev/sda1/dev/sda2とありますが、この数字がパーティションになります。/dev/sdaはOSをインストールするときにパーティション分けしているので、既に2つも出来上がっているのです。

今回は2TBを2つ使ってRAIDを組みたいので、/dev/sdb/dev/sdcそれぞれにRAID用のパーティションを作成することになります。(間違ってOSのデータを格納しているデバイスを操作するとOSが壊れるので注意です)

1.RAID用パーティションを作成する

partedを使ってパーティションを作成します。似たような機能のコマンドfdiskがありますが、partedの方がより良いそうなのでこちらを使います。

# parted /dev/sdb

GNU Parted 3.1
/dev/sdb を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
(parted)
(parted) unit GB
(parted) mklabel gpt
(parted) mkpart primary xfs 0 2000
(parted) set 1 raid on

この一連のコマンドを行うとパーティションが作成されます。(mkpartの指定の”0 2000”とは「HDDの0~2000GBを使用する」、つまり2TB全てパーティションで使うという意味です)

パーティション情報はprintで見れます。

(parted) print
モデル: ATA WDC WD20EZRX-00D (scsi)
ディスク /dev/sdb: 2000GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前     フラグ
1    0.00GB  2000GB  2000GB                    primary  raid

このパーティション作成手順を他のハードディスクにも行います。全て終わったらquitで終了します。

(parted) quit

最初に使ったコマンドでパーティションが作成されているか確認できます。

# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1  /dev/sdc  /dev/sdc1

ちゃんとsdb1とsdc1が追加されていますね。

2.mdadmコマンドでRAIDアレイを作成

ここで1つ躓いたのは、そもそもmdadmプログラムが入っていないのが原因でした。「mdadmコマンドが使えないよ」みたいなエラーが出た場合、以下のコマンドでプログラムをインストールしましょう。

# yum install mdadm

インストールが終わったら早速RAIDアレイを作成します。自分の例では「RAID 1」「デバイス数2」「/dev/sdb1と/dev/sdc1を使う」という内容なので、このようなコマンドになります。/dev/md0にRAIDアレイを作成します。

# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sd[bc]1
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? y

Continue creating array?」と聞かれるので”y”と入力します。すると、

mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

と出て作成開始されますが、これには結構な時間がかかります。RAIDアレイの構成状況の確認はこのコマンドで行いましょう。

# cat /proc/mdstat

Personalities : [raid1]
md0 : active raid1 sdc1[1] sdb1[0]
      1953382208 blocks super 1.2 [2/2] [UU]
      [>....................]  resync =  0.5% (10811072/1953382208) finish=236.0min speed=137128K/sec

unused devices: <none>

おおよその終了時間は6行目の「finish=236.0min」という箇所です。236分なので約4時間ですね。気長に待ちましょう。終わるとこんなメッセージが表示されます。

$cat /proc/mdstat

Personalities : [raid1]
md0 : active raid1 sdc1[1] sdb1[0]
      1953382208 blocks super 1.2 [2/2] [UU]

unused devices: <none>

 3.mdadm用の設定ファイルを作成

mdadm用の設定ファイルを作成し、そこにRAIDアレイ情報を書き込みます。mdadm --detail --scanとするとアレイ情報が出るのでこれを標準出力でファイル(mdadm.conf)に追記します。

ですが、ここでまたもや躓きました。参考記事の通りに実行すると、

# mdadm --detail --scan >> /etc/mdadm.conf
-bash: /etc/mdadm.conf: 許可がありません

というエラーが出るんですね。sudoを利用して権限を持っていたのですが上手くいかず。ので、まず先に設定ファイルを作成しておきました。

# touch /etc/mdadm.conf

そして標準出力&gt;&gt;を使った方法ではなく、パイプ|teeを使った方法に切り替えるとコマンドが通りました。(以下では念のためsudoコマンドを追加しておきます。root権限を持っていれば必要無いでしょう)

# sudo mdadm --detail --scan | sudo tee -a /etc/mdadm.conf

catで見てみると、ちゃんと内容が追記されていました。

# cat /etc/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=サーバーのホスト名:0 UUID=6106ce10:58f6dece:3b11655e:67fb9e82

 4.RAIDアレイにファイルシステムを作成しマウントする

いよいよ最終ステップです。構成したRAIDアレイ/dev/md0にファイルシステムを作成した後、マウントをします。

まずは以下のようにmkfsを使ってファイルシステムを作ります。

# sudo mkfs -t xfs /dev/md0

meta-data=/dev/md0               isize=256    agcount=4, agsize=122086388 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=488345552, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=238449, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

(ちょっと時間がかかるので待ちます)

ファイルシステムの作成が終わったら、特定のディレクトリにマウントします。今回自分の例で言えば、/dataというディレクトリを作ってここにマウントしました。/etc/fstabにマウント情報を追記します。(このファイルに追記すると、以降サーバー起動時に自動的にマウントしてくれるようになります

ただ、このマウントの記述にはディレクトリ指定(/dev/md0)よりもUUIDという識別子で指定したほうが無難のようです。ので、先にRAIDアレイのUUIDを確認してみましょう。

# ls -l /dev/disk/by-uuid/
lrwxrwxrwx 1 root root  9 12月 18 23:56 ec8338de-460a-49f8-a53d-06ee2829e285 -> ../../md0

他にもデバイスは出ますが、今回確認したいのはRAIDアレイ(md0)です。確認したところ「ec8338de-460a-49f8-a53d-06ee2829e285」がRAIDアレイのUUIDでした。こちらを利用してマウント指定します。

viなどのエディタで/etc/fstabを開いて以下のように1行追加します。

UUID=ec8338de-460a-49f8-a53d-06ee2829e285 /data xfs defaults 1 2

これで自動的にマウントされるようになります。保存が終わったら、

# mount -a

を行い、/etc/fstabで指定されているファイルシステムを全てマウントします。もし、

mount: can't find UUID=uuid

と出た場合はUUIDが間違っているので、打ち間違いがないか確認してみましょう。マウントがちゃんとできているかはmountで確認できます。

# mount
(一番下が新しいです)
/dev/md0 on /data type xfs (rw,relatime,attr2,inode64,noquota)

以上でmdadmによるソフトウェアRAID構築は完了です。

2014年12月21日追記:

mdmonitorの起動ができていたので追記。

5.RAIDアレイを監視

障害が発生した場合に知らせたいメールアドレスを設定ファイル/etc/mdadm.confに書き込みます。

MAILADDR sample@example.com

そしてmdmonitorの起動ですが、systemctlコマンドでできました。

# systemctl start mdmonitor.service
# systemctl enable mdmonitor.service
# systemctl is-enabled mdmonitor.service
enabled

enableオプションで自動起動の設定をし、is-enabledでシステム起動時の状態を調べます。メールの送信テストは以下のコマンドで行います。(自分は迷惑メールに入っていました)

# mdadm --monitor --test --oneshot --scan

余談ですがサーバー機とHDDの費用は合計3万円ほど。冬ですし身体も財布の中も寒いです。ついでに今回の主な参考書籍はこちら。勉強になりましたし助かりました。

photo credit: Andrew Abogado via photopincc

書いた人

Symbol Mark

Ryoichi(しつ)

除菌ティッシュを買い込んで使いきれずによく乾かす人。

療養目的で退職し、どうやって生きていくか模索中。最近は勉強目的でLaravelやVue.js弄ったり、趣味で音で遊んでます。

※2019年10月16日現在ブログリニューアル中です。崩れなどが発生していたらすみません。

うぇぶ: @s_ryone