现状:共有2块硬盘当做数据盘,一块 500G(sda), 另一块 2T(sdb)
要实现的:sda 和 sdb 其中的 500G 组成 raid1, sdb 剩下的当做普通数据盘,
并且当 raid 出现问题的时候,发送邮件通知你

使用 sudo fdisk /dev/sdx 命令进行分区,按照提示操作就可以了
分区之后情况如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Disk /dev/sda: 500.1 GB, 500107862016 bytes
45 heads, 63 sectors/track, 344540 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3184df24

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048   976773167   488385560   83  Linux

Disk /dev/sdb: 2000.4 GB, 2000365289472 bytes
255 heads, 63 sectors/track, 243197 cylinders, total 3906963456 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe0894113

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048   976773167   488385560   83  Linux
/dev/sdb2       976773168  3906963455  1465095144   83  Linux

下面开始将 sda1 和 sdb1 组建成 raid1

创建与配置

  1. 将 sda1 和 sdb1 的分区类型改为 Linux raid autodetect, 以 sda1 为例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ sudo fdisk /dev/sda
    
    Command (m for help): t
    Selected partition 1
    Hex code (type L to list codes): fd
    Changed system type of partition 1 to fd (Linux raid autodetect)
    
    Command (m for help): w
    The partition table has been altered!
    

    修改好之后分区情况如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Disk /dev/sda: 500.1 GB, 500107862016 bytes
    45 heads, 63 sectors/track, 344540 cylinders, total 976773168 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x3184df24
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   976773167   488385560   fd  Linux raid autodetect
    
    Disk /dev/sdb: 2000.4 GB, 2000365289472 bytes
    255 heads, 63 sectors/track, 243197 cylinders, total 3906963456 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0xe0894113
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048   976773167   488385560   fd  Linux raid autodetect
    /dev/sdb2       976773168  3906963455  1465095144   83  Linux
    
  2. 安装 mdadm

    1
    sudo apt-get install mdadm
    
  3. 创建磁盘阵列,raid 设备名称 md0, 指定 raid 级别 1, raid 磁盘数 2 且分别为 /dev/sda1 和 /dev/sdb1

    1
    sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
    

    出现 “mdadm: array /dev/md0 started.”, 就算成功了

    看似创建好了,实际上还没有,还在后台进行同步,同步完成之后才算彻底完工,但是现在就可以正常使用了

  4. 可用 cat /proc/mdstat 命令查看磁盘阵列状态,正在同步中,不过好漫长啊(这机子 IO 性能比较弱),不过对于 24 小时开机的设备来说也算不了什么

    1
    2
    3
    4
    5
    6
    Personalities : [raid1]
    md0 : active raid1 sdb1[1] sda1[0]
          488254336 blocks super 1.2 [2/2] [UU]
          [>....................]  resync =  0.1% (942528/488254336) finish=469.6min speed=17292K/sec
    
    unused devices: <none>
    

    可用 sudo mdadm --detail /dev/md0 命令查看磁盘阵列 md0 的详细信息

  5. 保存配置文件,不保存配置文件也可以,但是可能会出问题

    1
    sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
    
  6. 就像平常使用 sda1 那样使用 md0, 对 md0 进行格式化

    1
    sudo mkfs.ext4 /dev/md0
    
  7. 如果要开机自动挂载磁盘阵列,编辑 sudo vim /etc/fstab, 例如加入如下内容

    1
    /dev/md0    /media/data     ext4    defaults    0   0
    

监控

磁盘阵列出现问题的时候,发送邮件通知你
好心发给你可别忽略了,要不然你会付出代价的

  1. 安装 ssmtp

    1
    sudo apt-get install ssmtp
    
  2. 配置 ssmtp, sudo vim /etc/ssmtp/ssmtp.conf, 以 gmail 邮箱为例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #
    # Config file for sSMTP sendmail
    #
    # The person who gets all mail for userids < 1000
    # Make this empty to disable rewriting.
    root=postmaster
    
    # The place where the mail goes. The actual machine name is required no-
    # MX records are consulted. Commonly mailhosts are named mail.domain.com
    mailhub=smtp.gmail.com:587
    
    # Where will the mail seem to come from?
    #rewriteDomain=
    
    # The full hostname
    hostname=YourHostname
    
    # Are users allowed to set their own From: address?
    # YES - Allow the user to specify their own From: address
    # NO - Use the system generated From: address
    FromLineOverride=YES
    UseSTARTTLS=YES
    UseTLS=YES
    AuthUser=YourUsername@gmail.com
    AuthPass=YourPassword
    
  3. 因为密码是明文存储的,安全起见修改配置文件的权限

    1
    sudo chmod 660 /etc/ssmtp/ssmtp.conf
    
  4. 测试 ssmtp 是否配置正确,若 “mwum@dreamxu.com”(填写你自己的邮箱) 收到邮件,就算成功了

    1
    echo "ssmtp-test" | sudo ssmtp mwum@dreamxu.com
    
  5. 编辑 mdadm 配置文件,sudo vim /etc/mdadm/mdadm.conf, 加入以下内容,若原来存在如下配置,替换就行

    1
    2
    3
    # 填写你自己的邮箱
    MAILADDR mwum@dreamxu.com
    MAILFROM YourUsername@gmail.com
    
  6. 测试 mdadm 配置是否正确,若能收到测试邮件,那就成功了

    1
    sudo mdadm --monitor /dev/md0 --test
    

    到这,你就可以安心睡觉了

彻底删除

删除需谨慎,都是满满的数据

  1. 首先停止正在运行的 raid 设备,如果挂载了,那么先卸载了

    1
    sudo mdadm --stop /dev/md0
    
  2. 清除磁盘中的 raid 信息,也就是清除 super block 中的信息。执行之后数据也就没有了,请谨慎操作

    1
    2
    sudo mdadm --zero-superblock /dev/sda1
    sudo mdadm --zero-superblock /dev/sdb1
    
  3. 清除添加到 /etc/mdadm/mdadm.conf 中的信息
    如果设置了 fstab, 那么删除其中关于 raid 的信息
    重新分区格式化来使用磁盘

故障处理

对一些情况进行处理

  • 如果其中的一块磁盘损坏了,比如说 sda1

    1
    2
    3
    4
    5
    6
    7
    $ cat /proc/mdstat
    
    Personalities : [raid1]
    md0 : active raid1 sdb1[1] sda1[0](F)
          488254336 blocks super 1.2 [2/1] [_U]
    
    unused devices: <none>
    
    1. 从磁盘阵列 md0 中移除损坏的设备 sda1

      1
      sudo mdadm /dev/md0 --remove /dev/sda1
      
    2. 更换新磁盘,对其进行分区并标记分区类型为 Linux raid autodetect, 例如为 sda1, 也可能是其它的

    3. 添加 sda1 到磁盘阵列 md0 中,系统会自动重建数据的

      1
      sudo mdadm /dev/md0 --add /dev/sda1
      
  • 想更换一个新磁盘,比如说把 sdb1 给替换掉

    1. 标记 sdb1 损坏

      1
      sudo mdadm /dev/md0 --fail /dev/sdb1
      
    2. 接下去的步骤和上一种情况一样,就不赘述了

  • 如果不幸操作系统崩溃了或者主机坏了怎么办?不急,咱有的是办法

    1. 重装系统之后或者将两个磁盘接到其它的电脑上,在这个系统上装好 mdadm

    2. 使用 sudo fdisk -l 命令查看磁盘信息,原来的磁盘在新的系统上分别为 sdd1, sde1

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      Disk /dev/sdd: 500.1 GB, 500107862016 bytes
      45 heads, 63 sectors/track, 344540 cylinders, total 976773168 sectors
      Units = sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disk identifier: 0x3184df24
      
         Device Boot      Start         End      Blocks   Id  System
      /dev/sdd1            2048   976773167   488385560   fd  Linux raid autodetect
      
      Disk /dev/md127: 500.0 GB, 499972440064 bytes
      2 heads, 4 sectors/track, 122063584 cylinders, total 976508672 sectors
      Units = sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disk identifier: 0x00000000
      
      Disk /dev/md127 doesn't contain a valid partition table
      
      Disk /dev/sde: 2000.4 GB, 2000365289472 bytes
      255 heads, 63 sectors/track, 243197 cylinders, total 3906963456 sectors
      Units = sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disk identifier: 0xe0894113
      
         Device Boot      Start         End      Blocks   Id  System
      /dev/sde1            2048   976773167   488385560   fd  Linux raid autodetect
      /dev/sde2       976773168  3906963455  1465095144   83  Linux
      
    3. 测试的时候,我将两个磁盘插到新的电脑上,它自动重组成磁盘阵列 md127 了,但是是只读的
      先停止其运行

      1
      sudo mdadm --stop /dev/md127
      

      然后执行这个命令,如果没有自动重组,那么直接执行这个命令即可

      1
      sudo mdadm --assemble /dev/md0 /dev/sdd1 /dev/sde1
      
    4. 保存配置文件,配置 fstab,上面都有就不讲了

  • 如何使用其中的一块盘来读取数据?

    1. 强行用其中的一个磁盘来组成磁盘阵列 raid1, 例如使用磁盘 sde1

      1
      sudo mdadm --create --verbose /dev/md0 --level=1 --force --raid-devices=1 /dev/sde1
      
    2. 挂载 md0 并读取数据即可

      1
      sudo mount /dev/md0 /mnt
      

参考
https://raid.wiki.kernel.org/index.php/RAID_setup
http://en.wikipedia.org/wiki/Mdadm
man mdadm