linux软件磁盘阵列命令-mdadm

2018-06-01 19:04:36

linux环境下可以用mdadm来创建软件磁盘阵列,磁盘阵列相关知识请参考文章 磁盘阵列

[root@study ~]# mdadm --detail /dev/md0
[root@study ~]# mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK \
> --raid-devices=N --spare-devices=N /dev/sdx /dev/hdx...
选项与参数:
--create :为创建 RAID 的选项;
--auto=yes :决定创建后面接的软件磁盘阵列设备,亦即 /dev/md0, /dev/md1...
--chunk=Nk :决定这个设备的 chunk 大小,也可以当成 stripe 大小,一般是 64K 或 512K。
--raid-devices=N :使用几个磁盘 (partition) 作为磁盘阵列的设备
--spare-devices=N :使用几个磁盘作为备用 (spare) 设备
--level=[015] :设置这组磁盘阵列的等级。支持很多,不过建议只要用 0, 1, 5 即可
--detail :后面所接的那个磁盘阵列设备的详细信息

上面的语法中,最后面会接许多的设备文件名,这些设备文件名可以是整颗磁盘,例如 /dev/sdb , 也可以是分区,例如 /dev/sdb1 之类。不过,这些设备文件名的总数必须要等于 - -raid-devices 与 --spare-devices 的个数总和才行!

[root@192 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0   17G  0 part /
sdb      8:16   0   20G  0 disk
sdc      8:32   0   20G  0 disk
sdd      8:48   0   20G  0 disk
sde      8:64   0   20G  0 disk

我们拿sdb,sdc,sdd,sde四颗磁盘来做试验,做成raid-5。

mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256K  \
--raid-devices=3 --spare-devices=1 /dev/sd{b,c,d,e}

创建磁盘阵列需要一定时间,想要确定好了没可以查看 /proc/mdstat 文件

#完成了23.8%
[root@192 ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdd[4] sde[3](S) sdc[1] sdb[0]
      41908224 blocks super 1.2 level 5, 256k chunk, algorithm 2 [3/2] [UU_]
      [====>................]  recovery = 23.8% (5004800/20954112) finish=1.2min speed=208533K/sec
      
unused devices: <none>

#代表已经完成
[root@192 ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdd[4] sde[3](S) sdc[1] sdb[0]
      41908224 blocks super 1.2 level 5, 256k chunk, algorithm 2 [3/3] [UUU]
      
unused devices: <none>

查看磁盘阵列信息

[root@192 ~]# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri Jun  1 06:42:45 2018
        Raid Level : raid5
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Fri Jun  1 06:44:30 2018
             State : clean 
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 256K

Consistency Policy : unknown

              Name : 192.168.1.202:0  (local to host 192.168.1.202)
              UUID : d0e84e96:3ede039a:15ad3b1c:6b5642b6
            Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       3       8       64        -      spare   /dev/sde

我们用了4颗硬盘,其中1颗为备用,另外3颗工作,但是由于是raid-5,3颗中有1颗来记录同位检查码,所以可用的存储空间为2颗磁盘的容量(40G)。

接下来格式化磁盘和挂载
1.srtipe (chunk) 容量为 256K,所以 su=256k
2.共有 3 颗组成 RAID5 ,因此容量少一颗,所以 sw=2!
3.由上面两项计算出数据宽度为: 256K*2=512k

格式化相关参数说明请参考 linux磁盘命令-gdisk,fdisk,mkfs,xfs_info,dumpe2fs

[root@192 ~]# mkfs.xfs -f -d su=256k,sw=2 -r extsize=512k /dev/md0
meta-data=/dev/md0           isize=512    agcount=16, agsize=654784 blks
         =                   sectsz=512   attr=2, projid32bit=1
         =                   crc=1        finobt=0, sparse=0
data     =                   bsize=4096   blocks=10476544, imaxpct=25
         =                   sunit=64     swidth=128 blks
naming   =version 2          bsize=4096   ascii-ci=0 ftype=1
log      =internal log       bsize=4096   blocks=5120, version=2
         =                   sectsz=512   sunit=64 blks, lazy-count=1
realtime =none               extsz=524288 blocks=0, rtextents=0
[root@192 ~]# mkdir /var/raid
[root@192 ~]# mount /dev/md0 /var/raid

模拟下磁盘坏了一颗的情况,先来看下指令

[root@study ~]# mdadm --manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备]
选项与参数:
--add :会将后面的设备加入到这个 md 中!
--remove :会将后面的设备由这个 md 中移除
--fail :会将后面的设备设置成为出错的状态

现在我们先拷贝一些数据到刚才挂载的目录,让2颗磁盘里都有数据,然后让/dev/sdb磁盘坏掉,那么由于我们有一颗备用磁盘/dev/sde,所以系统会自动帮助我们重建。

cp -a /var/log/* /var/raid/
dd if=/dev/zero of=/var/raid/tmp.txt bs=1M count=100

[root@192 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/md0         40G  137M   40G   1% /var/raid
[root@192 ~]# mdadm --manage /dev/md0 --fail /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0

[root@192 ~]# mdadm --detail /dev/md0
/dev/md0:
           ...

    Number   Major   Minor   RaidDevice State
       3       8       64        0      spare rebuilding   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       0       8       16        -      faulty   /dev/sdb

当我们模拟指定sdb为坏的磁盘后,立马查看磁盘阵列信息,会发现 spare rebuilding /dev/sde 证明正在重建,而/dev/sdb 则标记为 faulty。过一段时间后,spare rebuilding 就会变为 active sync 证明重建完成,里面的数据完好无缺,但是此时已经没有备用磁盘了。接下来我们应该把坏的磁盘拿掉,换成一颗新的磁盘来作为备用磁盘。

#从磁盘阵列里移除sdb。
mdadm --manage /dev/md0 --remove /dev/sdb
#然后请手动拔掉这颗磁盘

#重新插上一颗新的磁盘
#然后加入新的磁盘到磁盘阵列
mdadm --manage /dev/md0 --add /dev/sdb
[root@192 ~]# mdadm --detail /dev/md0
/dev/md0:
...
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       5       8       16        -      spare   /dev/sdb

开机自动挂载raid

[root@192 raid]# blkid | grep md0
/dev/md0: UUID="de561eff-0d3e-41b4-a74d-693512691aa7" TYPE="xfs"

#在这个文件里加上一行
[root@192 /]# vim /etc/fstab
UUID=de561eff-0d3e-41b4-a74d-693512691aa7 /var/raid   xfs defaults        0 0

#卸载
[root@192 /]# umount /dev/md0

#表明卸载成功,里面没有任何数据。
[root@192 /]# ll /var/raid/
total 0

#通过配置文件自动挂载来测试开机挂载是否生效。
[root@192 /]# mount -a

#又有数据了,证明配置文件正确。
[root@192 /]# ll /var/raid/
total 104064
drwxr-xr-x. 2 root   root         176 May 30  2017 anaconda
drwx------. 2 root   root          23 May 30  2017 audit
-rw-r--r--. 1 root   root        7840 Jun  1 06:29 boot.log
-rw-------. 1 root   utmp           0 May 24 08:40 btmp
-rw-------. 1 root   utmp           0 May 30  2017 btmp-20180524
drwxr-xr-x. 2 chrony chrony         6 Nov 14  2016 chrony
-rw-------. 1 root   root        6376 Jun  1 07:01 cron
-rw-------. 1 root   root        3790 May 24 08:40 cron-20180524
-rw-------. 1 root   root        7865 May 28 03:22 cron-20180528
...

除非你未来就是要使用这颗 software RAID (/dev/md0) ,否则最好将这个 /dev/md0 关闭! 因为他毕竟是我们在这个测试机上面的练习用的!为什么要关掉他呢?因为这个 /dev/md0 其实还是使用到我们系统的磁盘分区,如果你只是将 /dev/md0 卸载,然后忘记将 RAID 关闭, 结果就是....未来你在重新分区 /dev/sdx时可能会出现一些莫名的错误状况啦!

[root@192 /]# umount /dev/md0

#删除这一行
[root@192 /]# vim /etc/fstab
UUID=de561eff-0d3e-41b4-a74d-693512691aa7 /var/raid   xfs   defaults  0 0

#先覆盖掉 RAID 的 metadata 以及 XFS 的 superblock,才关闭 /dev/md0
[root@study ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50

[root@192 /]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0

[root@192 /]# dd if=/dev/zero of=/dev/sdb bs=1M count=10
[root@192 /]# dd if=/dev/zero of=/dev/sdc bs=1M count=10
[root@192 /]# dd if=/dev/zero of=/dev/sdd bs=1M count=10
[root@192 /]# dd if=/dev/zero of=/dev/sde bs=1M count=10

#确实不存在任何磁盘阵列设备
[root@192 /]# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
unused devices: <none>

为啥上面会有数个 dd 的指令啊?这是因为 RAID 的相关数据其 实也会存一份在磁盘当中,因此,如果你只是将配置文件移除, 同时关闭了 RAID,但是分区并没有重新规划过,那么重新开机过后,系统还是会将这颗磁盘阵列创建起来,只是名称可能会变成 /dev/md127! 因此,移除掉 Software RAID 时,上述的 dd 指令不要忘 记!但是dd指令很危险,一定不能指定到系统盘,要不然就GG了。


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.觉得本文有帮助的小伙伴可以关注笔者
3.原文地址http://www.freecls.com/a/2712/44

©著作权归作者所有
收藏
推荐阅读
  • linux命令系列-fuser,lsof,pidof

    fuser 可以借由文件(或文件系统) 找出正在使用该文件的程序。有的时候我想要知道我的程序到底在这次启动过程中打开了多少文件,可以利用 fuser 来观察啦! 举例来说,你如果卸载时发现系统通知:“...

  • linux备份命令-cpio

    cpio可以备份任何东西,包括设备设备文件。不过cpio 不会主动的去找文件来备份!一般来说, cpio 得要 配合类似 find 等可以找到文件名的指令来告知 cpio 该被备份的数据在哪里。[ro...

  • linux备份命令-xfsdump,xfsrestore,dump,restore

    XFS 文件系统备份 xfsdumpxfsdump 的功能颇强!他除了可以进行文件系统的完整备份之外,还可以进行累积备份。第一次备份一定是完整备份。以/boot为例,完整备份在 xfsdump 当中被...

  • linux命令系列-dd

    dd不仅可以原样复制文件,而且可以复制设备。dd指令最大的功效,应该是在于备份! 因为 dd 可以读取磁盘设备的内容,然后将整个设备备份成一个文件!dd if 输入 of 输出 bs b...

  • linux交换空间swapon,swapoff,mkswap

    交换空间swap是磁盘上的一个区域,当内存不够用时,系统会把一部分内存中暂不使用的数据移动到swap中,当使用时又会重新加载到内存。目前由于内存都已经很大了,基本用不到swap,但是最好还是创建。[r...

  • nginx模块 ngx_http_headers_module

    ngx_http_headers_module 模块是用来增加 Expires 和 Cache-control,或者是任意的响应头。Syntax: add_header name value [alw...

  • nginx模块 ngx_http_gunzip_module、ngx_http_gzip_module、ngx_http_gzip_static_module

    ngx_http_gunzip_module 模块将文件解压缩后并在响应头加上 "Content-Encoding: gzip" 返回给客户端。为了解决客户端不支持gzip压缩。编译的时候带上 --w...

  • nginx模块 ngx_http_flv_module、ngx_http_mp4_module

    ngx_http_flv_module模块提供了对 flv 视频的伪流支持。编译的时候带上 --with-http_flv_module。它会根据指定的 start 参数来指定跳过多少字节,并在返回数...

  • nginx模块 ngx_http_fastcgi_module

    ngx_http_fastcgi_module 模块使得nginx可以与 fastcgi 服务器通信。比如目前要使得 nginx 支持 php 就得使用 fastcgi技术,在服务器上装上 nginx...

  • nginx模块 ngx_http_autoindex_module

    ngx_http_autoindex_module 模块可以将uri以 / 结尾时,列出里面的文件和目录。Syntax: autoindex on | off; Default: autoindex ...

简介
天降大任于斯人也,必先苦其心志。