fc2ブログ

UbuntuでDrobo風なNASを作る

前書き

前のエントリでは、FreeNASでDroboFS風なNASストレージを作りましたが、
Linuxのmd+LVMのほうがより柔軟で簡単に作れるので、Linuxでやり直しました。

繰り返しになりますが、目指すのはこんな条件のNASストレージです:


  1. 異なる容量のHDDを集約して、ひとつの仮想ディスクを作る
  2. 小容量HDDを大容量のものに挿し換えることで、データを保持したまま仮想ディスクの容量を増やせる




準備するもの

  1. HDD 3本以上: 異なる容量でOK。USB,PATA,SATAなどインターフェースが違っても大丈夫。
    今回は80GB,160GB,500GBのディスクを準備しました。

  2. PCサーバ:当然、準備したHDDがすべて挿せる構成である必要があります。
    私は前エントリに引き続き、Proliant MicroServerを使用します。こいつは4本
    ディスクをさすことができます。
  3. Linuxディストリ: ここではUbuntu 10.10 amd64 desktopを使用しました。USBメモリにインストールしています。


原理

これも前のエントリと変わらないのですが、
wikipediaのBeyondRAIDの図が分かりやすいので
同じような書き方をしてみます。


Drives
| 80 GB | 160 GB | 500 GB |
----------
| x | 未使用領域 (340 GB)
----------
-------------------
| sdb2 | sdc2 | RAID 1 (2× 80 GB) -> md2 (80GB)
-------------------
----------------------------
| sda1 | sdb1 | sdc1 | RAID 5 (3× 80 GB) -> md1 (160GB)
----------------------------
計: 240 GB



ディスクをパーティションに分割して、パーティションごとにRAIDを組み、
それらを結合させる形です。mdadmでRAIDを組み、LVMで結合させます。


RAID構築

LVM2とmdadmを使用しますのでそれぞれインストールします。
ubuntu 10.10のmdadmはapt-getで入るmdadmはバージョンが古かったため
最新をソースからmakeしています。partedも使うのでもし
入っていないディストリなら最新を入れておいてください。


$ sudo apt-get update
$ sudo apt-get install lvm2
$ wget http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-3.1.4.tar.gz
$ tar xzf mdadm-3.1.4.tar.gz
$ cd mdadm-3.1.4
$ make
$ sudo make install


手持ちのディスクを確認します。
sdeはブートディスク(USB)ですから触りません。


$ sudo parted /dev/sda print devices
/dev/sda (80.0GB)
/dev/sdb (160GB)
/dev/sdc (500GB)
/dev/sdd (1000GB)
/dev/sde (16.0GB)



使用するディスクをGPTでディスクラベルを作ります。
DOSでなくGPTを使うのは、パーティションの数の制限が緩いためです。

$ sudo parted -s /dev/sda mklabel gpt
$ sudo parted -s /dev/sdb mklabel gpt
$ sudo parted -s /dev/sdc mklabel gpt



RAIDを作るパーティションを切り出します。AFT対応のためか、
partedがアライメントのワーニングを出すので、先頭を64sや34sでなく2048sからはじめています。

$ sudo parted -s /dev/sda mkpart md1 2048s 80GB
$ sudo parted -s /dev/sdb mkpart md1 2048s 80GB
$ sudo parted -s /dev/sdc mkpart md1 2048s 80GB


RAID5なMDデバイスを作成します。

$ sudo mdadm --create --assume-clean /dev/md1 \
--level=5 --metadata=1 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1


同様の方法でもうひとつMDデバイスを作ります。

$ sudo parted -s /dev/sdb mkpart md2 80GB 160GB
$ sudo parted -s /dev/sdc mkpart md2 80GB 160GB
$ sudo mdadm --create --assume-clean /dev/md2 \
--level=1 --metadata=1 --raid-devices=2 /dev/sdb2 /dev/sdc2


できた二つのMDデバイスをLVMのPVとして登録します。

$ sudo pvcreate -Z y -M2 /dev/md1
$ sudo pvcreate -Z y -M2 /dev/md2


PVからVGを作成します。PEが57218個つくられたことが分かります。

$ sudo vgcreate Storage /dev/md1 /dev/md2
$ sudo vgdisplay Storage | grep Free
Free PE / Size 57218 / 223.51 GiB


できたPE全てを使ってLVを作成します。

$sudo lvcreate -l 57218 Storage
Logical volume "lvol0" created


作成されたLVをmkfsしてマウントします。

$ sudo mkfs -t ext4 -T largefile /dev/Storage/lvol0
$ sudo mkdir -p /Storage
$ sudo mount -t ext4 /dev/Storage/lvol0 /Storage
$ df -h
ファイルシステム Size Used Avail Use% マウント位置
/dev/mapper/Storage-lvol0
224G 188M 213G 1% /Storage


あとはsambaで/Storageを共有してやれば、NASになります。


ディスク増設

Proliant MicroServerには4本ディスクが入りますので
もう一本追加増設して、容量を拡張します。
もともと sdd に 1TBのディスクが入っていますので、これをRAIDに組み込みます。
イメージとしてはこんな感じです。md1とmd2にはパーティションを新しく
追加して容量を増加させます。特にmd2は元々RAID1だったのでRAID5に変更します。
sdcにあまっていた340GBもミラー相手ができたので、新しくmd3として作成します。


Drives
| 80 GB | 160 GB | 500 GB | 1TB |
----------
| x | 500GB 未使用領域
----------
-------------------
| sdc3 | sdd3 | RAID 1 (2× 340 GB) -> md3 (340 GB)
-------------------
----------------------------
| sdb2 | sdc2 | sdd2 | RAID 5 (3× 80 GB) -> md2 (160 GB)
----------------------------
-------------------------------------
| sda1 | sdb1 | sdc1 | sdd1 | RAID 5 (4× 80 GB) -> md1 (240 GB)
-------------------------------------
計: 740 GB



新規ディスク(sdd)からパーティションを作成してmd1に追加します。

$ sudo parted -s /dev/sdd mklabel gpt
$ sudo parted -s /dev/sdd mkpart md1 2048s 80GB
$ sudo mdadm --add /dev/md1 /dev/sdd1


追加しただけではスペアディスク扱いになるため
容量拡張を指示します。

$sudo mdadm --grow --level=5 --raid-devices=4 /dev/md1


MDデバイスのステータスを確認します。
reshape中で、現在進捗は0.6%で残り66.4分です。待ち。


$ cat /proc/mdstat
md2 : active raid1 sdc2[1] sdb2[0]
78123960 blocks super 1.2 [2/2] [UU]

md1 : active raid5 sdd1[3] sdc1[2] sdb1[1] sda1[0]
156244992 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
[>....................] reshape = 0.6% (505856/78122496) finish=66.4min speed=19456K/sec


待ちの間に、md2に対しても同様に拡張を行います。
md2の場合はもともとRAID1だったのですが
mdadmコマンドの引数指定で RAID 5に変更しています。


$ sudo parted -s /dev/sdd mkpart md2 80GB 160GB
$ sudo mdadm --add /dev/md2 /dev/sdd2
$ sudo mdadm --grow --level=5 --raid-devices=3 /dev/md2


ステータスを見ると md2 の処理は DELAYEDとなっていて
md1の終了待ちであることが分かります。md1が終われば自動的に始まります。
なんだか終了時間が前より延びてる...


$ cat /proc/mdstat
md2 : active raid5 sdd2[2] sdc2[1] sdb2[0]
78123960 blocks super 1.2 level 5, 8k chunk, algorithm 2 [3/3] [UUU]
resync=DELAYED

md1 : active raid5 sdd1[3] sdc1[2] sdb1[1] sda1[0]
156244992 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
[>....................] reshape = 2.5% (1958912/78122496) finish=76.5min speed=16571K/sec


その間に md3 を作ってしまいます。構築時にmd2でやったことと同じです。

$ sudo parted -s /dev/sdc mkpart md3 160GB 500GB
$ sudo parted -s /dev/sdd mkpart md3 160GB 500GB
$ sudo mdadm --create --assume-clean /dev/md3 \
--level=1 --metadata=1 --raid-devices=2 /dev/sdc3 /dev/sdd3

$ sudo pvcreate -Z y -M2 /dev/md3



作ったPVをVGに追加登録します。

$ sudo vgextend Storage /dev/md3


未使用なPEが増えていることを確認します。

$ sudo vgdisplay Storage | grep Free
Free PE / Size 19073 / 74.50 GiB


数時間放置したところ。md1もmd2もreshape処理は終わりました。

$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md3 : active raid1 sdc3[0] sdd3[1]
332029816 blocks super 1.2 [2/2] [UU]

md2 : active raid5 sdc2[1] sdd2[2] sdb2[0]
156247920 blocks super 1.2 level 5, 8k chunk, algorithm 2 [3/3] [UUU]

md1 : active raid5 sda1[0] sdc1[2] sdd1[3] sdb1[1]
234367488 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]


md1/md2の拡張処理が終わったら、容量が増えたことをLVMに認識させます。

$ sudo pvdisplay /dev/md1 | grep "PV Size"
PV Size 74.50 GiB / not usable 3.93 MiB
$ sudo pvresize /dev/md1
Physical volume "/dev/md1" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
$ sudo pvdisplay /dev/md1 | grep Size
PV Size 149.01 GiB / not usable 3.67 MiB

$ sudo pvresize /dev/md2


VGの余裕が増えたはずなので、LVも増加させます。

$ sudo lvdisplay | grep "LV Size"
LV Size 223.51 GiB

$ sudo vgdisplay Storage | grep Free
Free PE / Size 119207 / 465.65 GiB

$ sudo lvextend -l +119207 /dev/Storage/lvol0

$ sudo lvdisplay | grep "LV Size"
LV Size 689.16 GiB


今度はファイルシステムを拡張します。レイヤーがいくつもあって面倒ですけど、これが最後です。

$ df -h
/dev/mapper/Storage-lvol0
224G 188M 213G 1% /Storage

$ sudo resize2fs /dev/Storage/lvol0

$ df -h
/dev/mapper/Storage-lvol0
689G 197M 655G 1% /Storage


お疲れ様でした。無事に拡張することができました。


ディスク交換

80GB(sda)を交換します。実は2テラのディスクが手元にあるので、これに交換します。


Drives
| 2TB | 160 GB | 500 GB | 1TB |

----------
| x | ----------------------------> 未使用領域 1TB
----------
---------- ----------
| sda4 | | sdd4 | RAID 1 (2x 500 GB) -> md4 (500 GB)
---------- ----------
---------- -------------------
| sda3 | | sdc3 | sdd3 | RAID 5 (3× 340 GB) -> md3 (680 GB)
---------- -------------------
--------------------------------------
| sda2 | sdb2 | sdc2 | sdd2 | RAID 5 (4× 80 GB) -> md2 (240 GB)
-------------------------------------
-------------------------------------
| sda1 | sdb1 | sdc1 | sdd1 | RAID 5 (4× 80 GB) -> md1 (240 GB)
-------------------------------------
計: 1.6 TB



まず sdaが参加しているMDデバイスから切り離します。
現在 sda はmd1のみに組み込まれているので、md1から切り離します。


$ sudo mdadm /dev/md1 --fail /dev/sda1

$ cat /proc/mdstat
md1 : active raid5 sda1[0](F) sdc1[2] sdd1[3] sdb1[1]
234367488 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]


フェイルフラグが立っていますね。
いったんシャットダウンして 80GBディスクを2Tディスクに交換して起動しなおします。
OS起動後、md1からsdaがいなくなりました。


$ cat /proc/mdstat
md1 : active raid5 sdd1[2] sdc1[1] sde1[3]
234367488 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]


交換したディスクは、そのままではRAIDに組み込まれません。手作業でパーティションを切る
ところからはじめなければなりません。
ディスク交換はディスクが壊れたり容量が足りなくなった頃に行いますから
その頃にはきっとパーティション構成は忘れているでしょう。
そのため、現存するディスクの中でいちばん大きいディスクのパーティションを参考にします。
今回の場合は sdeですね。
(OS再起動のタイミングでブートディスクが sdeからsdbになってしまっています)


$ sudo parted -s /dev/sda print devices
/dev/sda (2000GB)
/dev/sdb (16.0GB)
/dev/sdc (160GB)
/dev/sdd (500GB)
/dev/sde (1000GB)
/dev/mapper/Storage-lvol0 (740GB)
/dev/md1 (240GB)
/dev/md2 (160GB)
/dev/md3 (340GB)

$ sudo parted -s /dev/sde print free
モデル: ATA SAMSUNG HD103UJ (scsi)
ディスク /dev/sde: 1000GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt

番号 開始 終了 サイズ ファイルシステム 名前 フラグ
17.4kB 1049kB 1031kB 空き容量
1 1049kB 80.0GB 80.0GB md1
2 80.0GB 160GB 80.0GB md2
3 160GB 500GB 340GB md3
500GB 1000GB 500GB 空き容量


これに準じて、交換したsdaにもパーティションを切ります。


$ sudo parted -s /dev/sda mklabel gpt
$ sudo parted -s /dev/sda mkpart md1 2048s 80GB
$ sudo parted -s /dev/sda mkpart md2 80GB 160GB
$ sudo parted -s /dev/sda mkpart md3 160GB 500GB


切ったパーティションをMDデバイスに組み込みます。
先ほどのディスク追加と同じです。

$ sudo mdadm --add /dev/md1 /dev/sda1
$ sudo mdadm --add /dev/md2 /dev/sda2
$ sudo mdadm --add /dev/md3 /dev/sda3


もともと md1 は sda1が外された縮退状態だったため、リビルドが始まりました

$ cat /proc/mdstat
md3 : active raid1 sda3[2](S) sdd3[0] sde3[1]
332029816 blocks super 1.2 [2/2] [UU]

md2 : active raid5 sda2[3](S) sdd2[1] sde2[2] sdc2[0]
156247920 blocks super 1.2 level 5, 8k chunk, algorithm 2 [3/3] [UUU]

md1 : active raid5 sda1[4] sdd1[2] sdc1[1] sde1[3]
234367488 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]
[>....................] recovery = 4.3% (3367748/78122496) finish=19.6min speed=63416K/sec


残りのmd2/md3も、以前と同様に容量拡張を行います。

$ sudo mdadm --grow --level=5 --raid-devices=4 /dev/md2
$ sudo mdadm --grow --level=5 --raid-devices=3 /dev/md3


resharpが終わるのを待ってから、lvmに拡張されたことを通知します。
md1は縮退状態からの復旧ですので拡張はありません。

$ sudo pvresize /dev/md2
$ sudo pvresize /dev/md3


あまっていたディスク容量を使ってミラーデバイスmd4を作成し追加します。

$ sudo parted -s /dev/sdd mkpart md4 500GB 1000GB
$ sudo parted -s /dev/sda mkpart md4 500GB 1000GB
$ sudo mdadm --create --assume-clean /dev/md4 --level=1 --metadata=1 --raid-devices=2 /dev/sda4 /dev/sdd4
$ sudo pvcreate -Z y -M2 /dev/md4
$ sudo vgextend Storage /dev/md4


増加したVG上のPEを確認してLVを拡張します。

$ sudo vgdisplay Storage | grep Free
Free PE / Size 119208 / 465.66 GiB
$ sudo lvextend -l +119208 /dev/Storage/lvol0
$ sudo resize2fs /dev/Storage/lvol0


最後、ファイルシステムを拡張してようやく完了です。
速そうだったのでアンマウントしてやってみました。

$ sudo umount /Storage
$ sudo e2fsck -f /dev/mapper/Storage-lvol0
$ sudo resize2fs /dev/mapper/Storage-lvol0
$ sudo mount /Storage
$ df -h
/dev/mapper/Storage-lvol0
1.6T 197M 1.5T 1% /Storage


無事、大きくなってますね。

まとめ
Droboっぽいものを作りたいという目的は達しました。
1.6Tもあればしばらく足りなくなることはないはずですが
足りなくなったら160GBディスクをそのとき一番コストパフォーマンスのよい
ディスクに買い換えます。
スポンサーサイト



コメントの投稿

非公開コメント

プロフィール

nakanote

Author:nakanote
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR