0%

Ubuntu 22.04 环境 zfs raid1 mirror配置,在线无损替换故障硬盘

家里的NAS服务器目前是1个512 SSD + 4T HDD +1T HDD,系统装的Win10, hyper-v开虚拟机。但是发现hyper-v效率不高,i5 8400处理器分了2个核,4g内存,装ubuntu空载甚至有卡顿的感觉,决定试试linux下的kvm虚拟机。

同时数据安全起见,打算用zfs on linux,4T硬盘分1个T的分区和1T硬盘组RAID1(zpool mirror模式), 重要数据放这里,非重要数据放另外的3T分区。以后1T不够用了,再买新硬盘扩容。

先在虚拟机上测试。

创建磁盘、挂载

宿主机上执行

1
2
3
4
qemu-img create -f qcow2 ubuntu-1.qcow2 1G
qemu-img create -f qcow2 ubuntu-2.qcow2 4G
virsh attach-disk --domain ubuntu --source ~/vm/ubuntu/ubuntu-1.qcow2 --target vdb --subdriver qcow2 --persistent
virsh attach-disk --domain ubuntu --source ~/vm/ubuntu/ubuntu-2.qcow2 --target vdc --subdriver qcow2 --persistent

分区

虚拟机里执行sudo fdisk -l 查看刚挂载的磁盘

image/20221125164547_aa6c7c94de97fc41e1870fedf67a9ec3.png

可以看到4g硬盘挂到了/dev/vdc下,下面给/dev/vdc分成1G+3G

使用fdisk给硬盘分区,下面的图里分两区分了两次执行

image/20221125164829_f9f84d9b6ff27a7d5e6b42280f8c38d8.png

分完区后,再用sudo fdisk -l查看:

image/20221125165028_ca7098f415d7984598c062547c232cc6.png

我们要把 /dev/vdb和/dev/vdc1组成RAID1, 在zfs中,叫mirror。

/dev/vdc2 格式化,挂载到 /data目录下直接使用

image/20221125165614_aa9fc5be61f0baa609748dc7ebbb9ec9.png

创建mirror

1
sudo zpool create tank mirror /dev/vdb /dev/vdc1

执行完后sudo zpool status查看zpool状态,df -H查看分区

image/20221125170034_408c51d0dbe5eea0f5258817ed8d6953.png

破坏测试

下面我们试试,把文件放到/tank/目录下,卸载一个硬盘,会不会丢数据。

先用dd命令创建一个512M的测试文件

1
sudo dd if=/dev/zero of=/tank/test.data bs=1M count=512

md5sum计算文件md5值,并记录,如果文件没有被破坏,md5值一定不会变

image/20221125170553_927dddb70c86a71111afb8fc3c4afc91.png

aa559b4e3523a6c931f08f4df52d58f2 test.data

宿主机上执行卸载磁盘命令

1
virsh detach-disk ubuntu ~/vm/ubuntu/ubuntu-1.qcow2 --persistent

虚拟机上sudo fdisk -l /dev/vdb 马上看不到了,但是sudo zpool status 不能马上显示异常,测试过程中大概过了几分钟,才显示vdb UNAVAIL

image/20221125171245_cc951e845f1593b7e8e6c8de5a735d7f.png

此时重新计算md5, 没有变化,再试试把刚卸载的ubuntu-1.qcow2挂回来,卸载另一个磁盘,也就是ubuntu-2.qcow2

1
2
3
virsh attach-disk --domain ubuntu --source ~/vm/ubuntu/ubuntu-1.qcow2 --target vdb --subdriver qcow2 --persistent

virsh detach-disk ubuntu /home/fhp/vm/ubuntu/ubuntu-2.qcow2 --persistent

image/20221125171507_963c35decce1e46b9acbd2656ed80403.png

正常情况下,应该也不会有问题,但我此次出了意外,可能是因为上面的操作太快,挂载后马上卸载,zpool没反应过来,这时我执行了md5sum 然后一直卡着不动,ctrl+c也取消不了。

新开了个ssh窗口,执行sudo zpool status 提示I/O异常,建议执行zpool clear试试。

执行完以后,再md5sum 文件没有变化:

image/20221125172828_89cfbaa51bf8639f67c4ae72d9189623.png

说明我们的raid1冗余方案没问题,但提示设备有错误,试着把卸载的磁盘挂回去。

1
virsh attach-disk --domain ubuntu --source ~/vm/ubuntu/ubuntu-2.qcow2 --target vdc --subdriver qcow2 --persistent

发现/dev/vdc没回来,变成了/dev/vdd,virsh edit ubuntu查看了下配置文件,确定我没配错,可能是kvm虚拟机的bug, 那就重启下虚拟机吧。

重启后,/dev/vdc回来了, zpool status状态也是online,但还是提示有错误,执行下 zpool clear, 清除错误

image/20221125174156_f474f8155d458beb799bd4bc8bc8d500.png

换硬盘

上面的破坏测试模拟的是拔插硬盘,下面试试模拟硬盘坏了换个硬盘,以及换大硬盘升级空间.

先看看当前容量:

1
sudo zpool list

image/20221125175544_1a85c5f73c9b6ecc88ad38f1fce763a1.png

当前总大小是960M,因为创建了一个512M的文件,可用448M。

宿主机上创建两个8G的硬盘文件并挂载, 目的是把1G的升级成8G

1
2
3
4
5
qemu-img create -f qcow2 ubuntu-3.qcow2 8G
qemu-img create -f qcow2 ubuntu-4.qcow2 8G
virsh attach-disk --domain ubuntu --source ~/vm/ubuntu/ubuntu-3.qcow2 --target vdd --subdriver qcow2 --persistent
virsh attach-disk --domain ubuntu --source ~/vm/ubuntu/ubuntu-4.qcow2 --target vde --subdriver qcow2 --persistent

虚拟机上用sudo zpool replace tank vdb vdd命令把vdb替换成vdd

image/20221125174957_3f336b05d9b6dc4a561fd6bcad334517.png

替换完以后,zpool status会显示替换状态,上图因为才512M文件,又是在ssd中,1s就完成了。

再换另一个 sudo zpool replace tank vdc1 vdd

默认情况下,自动扩展功能是关闭的,下图可以看到EXPANDSZ有7G

image/20221125180700_62f0f5bfcb7e9465e0cf1ff854d4685f.png

可以通过sudo zpool set autoexpand=on tank 开启自动扩展。

两个盘都执行扩展:

1
2
3
sudo zpool online -e tank vdd
sudo zpool online -e tank vde

image/20221125181119_ddc9d2e159d917553417debe063a5ede.png

完成扩容,再看看test.data文件还在不在

image/20221125181243_b194f04d43d8998b6ccbe9b0bedb7182.png

文件没有任何变化