家里的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 | qemu-img create -f qcow2 ubuntu-1.qcow2 1G |
分区
虚拟机里执行sudo fdisk -l
查看刚挂载的磁盘
可以看到4g硬盘挂到了/dev/vdc下,下面给/dev/vdc分成1G+3G
使用fdisk给硬盘分区,下面的图里分两区分了两次执行
分完区后,再用sudo fdisk -l
查看:
我们要把 /dev/vdb和/dev/vdc1组成RAID1, 在zfs中,叫mirror。
/dev/vdc2 格式化,挂载到 /data目录下直接使用
创建mirror
1 | sudo zpool create tank mirror /dev/vdb /dev/vdc1 |
执行完后sudo zpool status
查看zpool状态,df -H
查看分区
破坏测试
下面我们试试,把文件放到/tank/目录下,卸载一个硬盘,会不会丢数据。
先用dd命令创建一个512M的测试文件
1 | sudo dd if=/dev/zero of=/tank/test.data bs=1M count=512 |
md5sum
计算文件md5值,并记录,如果文件没有被破坏,md5值一定不会变
aa559b4e3523a6c931f08f4df52d58f2 test.data
宿主机上执行卸载磁盘命令
1 | virsh detach-disk ubuntu ~/vm/ubuntu/ubuntu-1.qcow2 --persistent |
虚拟机上sudo fdisk -l
/dev/vdb 马上看不到了,但是sudo zpool status
不能马上显示异常,测试过程中大概过了几分钟,才显示vdb UNAVAIL
此时重新计算md5, 没有变化,再试试把刚卸载的ubuntu-1.qcow2挂回来,卸载另一个磁盘,也就是ubuntu-2.qcow2
1 | virsh attach-disk --domain ubuntu --source ~/vm/ubuntu/ubuntu-1.qcow2 --target vdb --subdriver qcow2 --persistent |
正常情况下,应该也不会有问题,但我此次出了意外,可能是因为上面的操作太快,挂载后马上卸载,zpool没反应过来,这时我执行了md5sum
然后一直卡着不动,ctrl+c也取消不了。
新开了个ssh窗口,执行sudo zpool status
提示I/O异常,建议执行zpool clear
试试。
执行完以后,再md5sum
文件没有变化:
说明我们的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
, 清除错误
换硬盘
上面的破坏测试模拟的是拔插硬盘,下面试试模拟硬盘坏了换个硬盘,以及换大硬盘升级空间.
先看看当前容量:
1 | sudo zpool list |
当前总大小是960M,因为创建了一个512M的文件,可用448M。
宿主机上创建两个8G的硬盘文件并挂载, 目的是把1G的升级成8G
1 | qemu-img create -f qcow2 ubuntu-3.qcow2 8G |
虚拟机上用sudo zpool replace tank vdb vdd
命令把vdb替换成vdd
替换完以后,zpool status
会显示替换状态,上图因为才512M文件,又是在ssd中,1s就完成了。
再换另一个 sudo zpool replace tank vdc1 vdd
默认情况下,自动扩展功能是关闭的,下图可以看到EXPANDSZ
有7G
可以通过sudo zpool set autoexpand=on tank
开启自动扩展。
两个盘都执行扩展:
1 | sudo zpool online -e tank vdd |
完成扩容,再看看test.data文件还在不在
文件没有任何变化