软件RAID测试·二

一个逻辑卷组,物理卷是由四块硬盘组成的RAID-10,拿出了一部空间做了个逻辑卷,格式化成了XFS文件系统。
之后我顺手把虚拟机关掉了,没有按LinuxRaidWiki上的说法保存mdadm设置,但是当我再打开虚拟机的时候发现新建的md127安然无恙,看来在最近的某次版本变更里面,已经无需时刻保存设置了。
现在把lvol0的挂载点写到fstab里面去。先找到它的UUID。

# ls -lh /dev/mapper/
total 0
crw------- 1 root root 10, 236 Mar 24 18:08 control
lrwxrwxrwx 1 root root       7 Mar 24 18:08 ubuntu--vg-root -> ../dm-1
lrwxrwxrwx 1 root root       7 Mar 24 18:08 ubuntu--vg-swap_1 -> ../dm-2
lrwxrwxrwx 1 root root       7 Mar 24 18:08 vg0-lvol0 -> ../dm-0

可以看到,vg0-lvol0实际上是个软链。

# ls -lh /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Mar 24 18:08 5486a45b-5131-4f73-9710-8a0910bd91b5 -> ../../dm-2
lrwxrwxrwx 1 root root 10 Mar 24 18:08 c1f59da3-e4b9-49f4-8242-1ea9a0a7c2fe -> ../../dm-0
lrwxrwxrwx 1 root root 10 Mar 24 18:08 cdb31aba-081c-4bca-a110-37451fd5c1ac -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar 24 18:08 eb44bd7c-f9bf-4123-987c-213bbe29eec0 -> ../../dm-1

其实也可以用blkid这个小程序直接查看UUID。
好,UUID拿到手,就顺手把它挂载到/home算了。略过编辑fstab过程。

# mount
(略)
/dev/mapper/vg0-lvol0 on /home type xfs (rw)

接下来,我们试试往已经建好的RAID-10里面再添加一块硬盘作为热备盘,新盘已经分好区了。

# mdadm --manage /dev/md127 --add /dev/sdf1
mdadm: added /dev/sdf1

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md127 : active raid10 sdf1[4](S) sdc1[1] sdb1[0] sde1[3] sdd1[2]
      16766952 blocks super 1.2 4K chunks 2 near-copies [4/4] [UUUU]

显示”sdf1[4](S)”的意思,是指sdf1是这个阵列的第5块盘,属性是Spare,就是备份盘的意思。
现在,试试往已经建好的文件系统里面写入数据。

# pi 1000000 > /home/pi.txt

# md5sum /home/pi.txt
af3c72e86be578c48dca28044333294a  /home/pi.txt

然后让阵列里面的一块盘失效看看。

# mdadm --manage /dev/md127 --fail /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md127

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md127 : active raid10 sdf1[4] sdc1[1] sdb1[0](F) sde1[3] sdd1[2]
      16766952 blocks super 1.2 4K chunks 2 near-copies [4/3] [_UUU]
      [=====>...............]  recovery = 25.2% (2117848/8383476) finish=0.6min speed=151274K/sec

可以看到sdb1这块盘已经被标记Fail,而原本被标记Spare的sdf1已经顶了上去,整个阵列正在进行重建,剩余时间0.6min。

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md127 : active raid10 sdf1[4] sdc1[1] sdb1[0](F) sde1[3] sdd1[2]
      16766952 blocks super 1.2 4K chunks 2 near-copies [4/4] [UUUU]

重建已经完成。由于这块被标记Fail的盘实际上没坏,我们再把它加回去,作为Spare。

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md127 : active raid10 sdb1[5](S) sdf1[4] sdc1[1] sde1[3] sdd1[2]
      16766952 blocks super 1.2 4K chunks 2 near-copies [4/4] [UUUU]

软件RAID测试·一

测试环境:VBox
测试发行版:Ubuntu Server 13.10
这次想要测试的是RAID-10,以及相关的东东。
首先在虚拟机里面添加4块硬盘,并且依次分好区。

# mdadm --verbose --create /dev/md127 --chunk=4 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: size set to 8383476K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md/device started.

“–level=10″这个参数是指明RAID等级为10。
所谓的RAID-10就是把偶数块的硬盘两两分组,组合成数组RAID-1,在上层再把这数组RAID-1组成一个RAID-0。
我这里就是两组RAID-1,组成一个RAID-0。
“–chunk=4″这个参数是指明数据分条的大小为4KB。
设置这样的值是这样一个意思:
假如某此IO的大小是9KB,那么分条后会变成4KB+4KB+1KB这样三组数据条,分别写入到两组RAID-1阵列里面。
废话说完了检验下mdadm的状态。

# mdadm --detail --scan
ARRAY /dev/md/device metadata=1.2 name=ubuntu:device UUID=57394299:2e698d3c:b1a4d9fb:f21b67cf

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md127 : active raid10 sde1[3] sdd1[2] sdc1[1] sdb1[0]
      16766952 blocks super 1.2 4K chunks 2 near-copies [4/4] [UUUU]

于是一个横跨四块硬盘的RAID-10阵列创建成功了。
为方便管理,将这个新建的阵列加入一个新建的卷组中。

# pvcreate /dev/md127
  Physical volume "/dev/md127" successfully created

# vgcreate vg0 /dev/md127
  Volume group "vg0" successfully created

# vgdisplay
  --- Volume group ---
  VG Name               vg0
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               15.99 GiB
  PE Size               4.00 MiB
  Total PE              4093
  Alloc PE / Size       0 / 0
  Free  PE / Size       4093 / 15.99 GiB
  VG UUID               sKRYGY-6dy6-TGI1-O4VN-OQtn-8SEQ-uOGULD

并且创建一个大小为8G的逻辑卷。

# lvcreate -L 8G vg0
  Logical volume "lvol0" created

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg0/lvol0
  LV Name                lvol0
  VG Name                vg0
  LV UUID                hIh4m0-jITD-GMYx-3rz4-g0zW-Xc4D-6AjekD
  LV Write Access        read/write
  LV Creation host, time ubuntu, 2014-03-24 15:52:40 +0800
  LV Status              available
  # open                 0
  LV Size                8.00 GiB
  Current LE             2048
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:2

接下来,将这个卷格式化为XFS文件系统。

# mkfs.xfs /dev/mapper/vg0-lvol0
meta-data=/dev/mapper/vg0-lvol0  isize=256    agcount=8, agsize=262143 blks
         =                       sectsz=512   attr=2, projid32bit=0
data     =                       bsize=4096   blocks=2097144, imaxpct=25
         =                       sunit=1      swidth=2 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

可以看到,这里面有这这样两个数据:
sunit=1,swidth=2 blks
第一个数据是stripe unit的简称,数值等于blocksize/chunksize。
第二个数据是stripe width的简称。
可以看到,这些数值都是与硬盘阵列有关系的。
在硬盘阵列上使用XFS的原因,就是它有这样一些针对性的的东西,有助于更好的使用硬盘阵列。