fc2ブログ

Building DroboFS like storage with Ubuntu


Goal
Using Ubuntu to building a drobo like NAS storage, which can
use some different sized drives together as one large storage tank with 1 drive fault tolerance
expand total capacity by adding drives with data stored.

Idea

Basic idea, BeyondRAID , key technology of Drobo
is described in wikipedia
and following figure is suitable to understand.


Drives
| 100 GB | 200 GB | 400 GB | 500 GB |

----------
| x | unusable space (100 GB)
----------
-------------------
| A1 | A1 | RAID 1 set (2× 100 GB)
-------------------
-------------------
| B1 | B1 | RAID 1 set (2× 100 GB)
-------------------
----------------------------
| C1 | C2 | Cp | RAID 5 array (3× 100 GB)
----------------------------
-------------------------------------
| D1 | D2 | D3 | Dp | RAID 5 array (4× 100 GB)
-------------------------------------




We have two open source technology, mdadm and LVM. We can

  1. Make partitions from drives. These partitions make role as A1, B1, C1,C2,Cp D1,D2,D3,Dp.
  2. Build RAID array/set with mdadm. We can get md devices.
  3. Concatinate md devices to one large storage with LVM.


the original idea is ZFS_and_FreeNAS_expansion.
I've succeeded with ZFS/FreeNAS, but It seems to be more flexible
when building with mdadm and LVM.




Prepare

  1. Three or more disks which can be different size and interface. I have 80GB,160GB,500GB SATA disks.

  2. PC server. I have proliant Microserver.

  3. Installed Linux distro. I installed "Ubuntu 10.10 amd 64 desktop edition" to USB stick memory.


How to build

On Ubuntu 10.10, when I use apt-get to install mdadm, the installed binary is not up to date,
so I installed from source code. Parted is also necessary to make partition.

$ 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


At first, I confirmed my drives. Drive sde is boot disk.

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



There are three drives, we will finaly get following structure.


Drives
| 80 GB | 160 GB | 500 GB |
----------
| x | unusable space (340 GB)
----------
-------------------
| sdb2 | sdc2 | RAID 1 (2× 80 GB) -> md2 (80GB)
-------------------
----------------------------
| sda1 | sdb1 | sdc1 | RAID 5 (3× 80 GB) -> md1 (160GB)
----------------------------
Total: 240 GB





Initializing drive as GPT label.

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


Making partitions.

$ 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



Building RAID5 array

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



Repeat on md2

$ 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


Make md devices as PV. Makeing VG from PV

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



Confirm how many PEs we have. Build LV with all PEs.

$ sudo vgdisplay Storage | grep Free
Free PE / Size 57218 / 223.51 GiB
$sudo lvcreate -l 57218 Storage
Logical volume "lvol0" created


Making fs on LV and mount.

$ sudo mkfs -t ext4 -T largefile /dev/Storage/lvol0
$ sudo mkdir -p /Storage
$ sudo mount -t ext4 /dev/Storage/lvol0 /Storage
$ df -h
/dev/mapper/Storage-lvol0
224G 188M 213G 1% /Storage


Now we can share /Storage with samba. It looks Drobo FS, isn't it?


Adding a drive to expand capacity

Proliant MicroServer I have can drive four internal drives,
I am going to add a 1TB drive and expanding /Storage as following:


Drives
| 80 GB | 160 GB | 500 GB | 1TB |
----------
| x | 500GB unusable space
----------
-------------------
| 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)
-------------------------------------
Total: 740 GB




Creating partition and adding to md1

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


When adding partiton, its role is "spare".
So expanding md1 using all drives.

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



Above operation take large time.
Confirming when it finish.

$ 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


While rehaping, repeat to md2.

$ 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



Confirming how reshapring. md2 is DELAYED. When finishing md1, md2's resharpe will work.

$ 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


While rehaping, making md3. It's same way when we make 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



Now we already have VG, so created PV should be add to the VG

$ sudo vgextend Storage /dev/md3


Confirming we got new free space

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


Few hour later, all resharpes have finished.

$ 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]


Telling LVM md1 and md2 are expanded.

$ 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


Expanding 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


Finaly, expanding filesyste.

$ 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


Now we got expanded capacity.


Replacing drive to larger one

I am going to replace 80GB drive to 2TB drive. Arrays will be following:


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

----------
| x | ----------------------------> unusable space 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)
-------------------------------------
total: 1.6 TB




At first detach sda from md devices.
now only md1 contains sda, sda1 should be detached.

$ 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]


Shuting down server and replacing sda as 2TB drive.
Already md1 device has no 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]
$ 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)


Now we have new drive sda.
Checking 2th large drive to decide the new (largest) drive's partition size.


$ 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 空き容量


Just make partions same size of 2th large drive to new drive.


$ 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


Adding partitions to md devices.

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


md1 is degrade mode, so as soon as adding, rebuild is started.

$ 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


Expanding md2 and md2 like when we add a drive.

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


When resharp has finished, telling lvm md's were expanded.

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


As we have unused capacity on sdd and sda, they should be used as mirrored device.

$ 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


Expanding LV as we have new free PEs.

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


Finally, expanding file system.

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



conclusion

I know above operation is quite complex than Drobo.
If you want easy storage, you should buy Drobo. It may be good storage.
But you can also get Drobo-like storage cheaper.
And it is important the storage far from blackbox and vendor-lock-in.

スポンサーサイト



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