为了给自己组一台nas,保护里面数据的安全,所以查阅了挺多资料,终于在虚拟机上试验成功了软raid的一些操作,写篇文章记录一下。

还有视频教程请看哔哩哔哩
点击查看【bilibili】
点击查看【bilibili】

创建软raid

我是想创建一个raid5,raid5至少需要3块硬盘,现在主流的nas上应该都有4个硬盘位(除了系统盘之外)。
在创建之前需要将所有的数据盘分区,一个硬盘一个区。

  1. sudo fdisk /dev/sdb
  2. # Welcome to fdisk (util-linux 2.31.1).
  3. #Changes will remain in memory only, until you decide to write them.
  4. #Be careful before using the write command.
  5. #
  6. #
  7. #Command (m for help): d
  8. #Selected partition 1
  9. #Partition 1 has been deleted.
  10. #
  11. #Command (m for help): n
  12. #Partition type
  13. #p primary (0 primary, 0 extended, 4 free)
  14. #e extended (container for logical partitions)
  15. #Select (default p):
  16. #
  17. #Using default response p.
  18. #Partition number (1-4, default 1):
  19. #First sector (2048-10485759, default 2048):
  20. #Last sector, +sectors or +size{K,M,G,T,P} (2048-10485759, default 10485759):
  21. #
  22. #Created a new partition 1 of type 'Linux' and of size 5 GiB.
  23. #Partition #1 contains a linux_raid_member signature.
  24. #
  25. #Do you want to remove the signature? [Y]es/[N]o: Y
  26. #
  27. #The signature will be removed by a write command.
  28. #
  29. #Command (m for help): w
  30. #The partition table has been altered.
  31. #Syncing disks.
  32. sudo fdisk /dev/sdc
  33. sudo fdisk /dev/sdd
  34. sudo fdisk /dev/sde

分好区之后就可以开始创建软raid了

  1. sudo mdadm -C /dev/md0 -a yes -l 5 -n 4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

选项解读:

  • -C 创建
  • -l 级别
  • -n 磁盘个数
  • -a {yes|no} 自动为其创建设备文件
  • -x 指定空闲盘个数,空闲盘可以在工作盘损坏后自动顶替
    注意:创建阵列时,阵列所需磁盘数为-n和-x参数的个数和

创建完成之后我们就可以开始对磁盘进行格式化,并将配置写入文件

  1. # 格式化
  2. sudo mkfs.ext4 /dev/md0
  3. # 写入配置文件
  4. sudo mdadm -Ds /dev/md0 > mdadm.conf
  5. sudo mv mdadm.conf /etc/

我们还可以查看磁盘状态

  1. sudo mdadm -D /dev/md0

linux下使用mdadm组软raid - 图1

然后我们需要重启,重启完成之后,md0可能会变,我的变成了md127,我也不知道这是为什么,但是我们可以使用sudo fdisk -l来进行查看,查看之后就可以使用mount命令或者编辑/etc/fstab对这个raid后的磁盘进行挂载使用了。

模拟数据盘损坏

我在实验之前已经将所有的磁盘都设置为了可以热插拔,所以在虚拟机运行的时候我也可以移除磁盘。现在我们要模拟损坏,然后如何替换新的磁盘上去,我们先在虚拟机上将其中一个数据盘移除。

  1. sudo mdadm -D /dev/md127

linux下使用mdadm组软raid - 图2

现在我们可以看到Active Devices和Working Devices都已经变成了3,最下面的一个磁盘也已经显示removed。然后我使用虚拟机在原来的位置插入一个新的磁盘,模拟我们替换上新磁盘。

使用sudo fdisk -l可以看到,我们的新磁盘已经被认到了,现在要对这个新硬盘进行分区,分区时需要使用t将分区类型选择为fd

  1. # 将新硬盘添加到原有raid中
  2. sudo mdadm /dev/md127 -a /dev/sde1
  3. # 现在再查看raid的状态
  4. sudo mdadm -D /dev/md127

linux下使用mdadm组软raid - 图3

现在我们可以看到新硬盘已经加入raid,并且已经在重建数据了,时间可能比较久,但是不影响系统运行。

模拟系统盘损坏

我们在使用过程中,不光会出现数据盘损坏的情况,也有可能出现系统盘损坏的情况,当系统盘损坏的时候,我们如何让一个新系统识别已有的raid组合。

我在虚拟机上重新安装了系统开机后,发现系统已经直接认到了raid盘,也就是说什么都不用做。

  1. # 我们主动解除raid组合
  2. sudo mdadm -S /dev/md0

当我们主动解除raid盘之后,系统就已经不能认到raid了,这个时候,我们可以使用以下命令再次识别raid,也可以直接将之前的mdadm.conf直接复制到/etc/目录,重启之后,他就会自动帮我们识别好raid了。

  1. sudo mdadm -A /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

损坏通知

我们不可能每天都去查看硬盘有没有损坏,这样非常麻烦,所以我自己写了一个脚本,实现监控硬盘的功能,当它检测到硬盘损坏时,就会发一封邮件通知你。首先要让自己的nas拥有发邮件的功能,邮件的配置请参考以下文章
Linux使用命令行发邮件

  1. #! /usr/bin/python3
  2. import os
  3. import time
  4. while 1:
  5. result = os.popen('mdadm -D /dev/md0')
  6. res = result.read()
  7. active = 0
  8. for line in res.splitlines():
  9. if 'Active Devices : 4' in line:
  10. active = 1
  11. break
  12. else:
  13. continue
  14. active = 0
  15. if active == 1:
  16. time.sleep(600)
  17. else:
  18. os.system("echo '你的raid可能出现了一些问题,请查看一下' | mutt -s 'raid问题报告' pi_sender@163.com")
  19. time.sleep(86400)

最后在终端执行sudo ./raid-monitor.py就好了

参考链接: