底下是 ZFS
能得到什么
- 一台虚拟机一个数据集,布局照 SmartOS。配置就是磁盘旁边的一个
config.json。 - 磁盘是 raw 文件(默认)或 zvol,稀疏分配,lz4 压缩。
- 虚拟机看到的是 virtio-blk、NVMe 或 AHCI;老系统可以用 IDE。
- 每台虚拟机有自己的一份 UEFI 固件,恢复出来的虚拟机不会碰上中途换过的固件。
- TRIM 一路打通:虚拟机里删掉的空间会还给存储池。
快照
快照就是对这台虚拟机的数据集树做一次 zfs snapshot -r。ZFS 原子地拍下整棵树,几块盘、配置、固件变量都是同一时刻的。拍快照不拷数据,虚拟机不用停。运行中拍的快照是崩溃一致的,相当于那一刻拔了电:现代文件系统都能起来,数据库可能要回放日志。
回滚要逐个数据集做,因为 ZFS 没有递归回滚:实测中只用 rollback -r,zvol 没有回去。keelOS 对每个数据集分别回滚。
实测
- recordsize 为 16K 的 raw 文件和 zvol 性能相当:随机读写相差 10% 以内。
- virtio-blk 和 NVMe 相差 10% 上下,选 NVMe 不吃亏。
- 影响最大的是 recordsize:128K 时 4K 随机写只有约 4000 IOPS,16K 时是 1 万到 1.6 万。
- TRIM:虚拟机里写 4 GiB、删掉、执行
fstrim之后,宿主上的磁盘镜像回到 1.5 MB 以下。文件或 zvol、virtio-blk 或 NVMe,四种组合都一样。 - 拍快照、改数据、回滚:根盘和另加的 zvol 都回到了拍快照的那一刻。
还没做的
- 快照只有磁盘。带内存、恢复后原地接着跑的快照在计划中;它要用的检查点,宿主重启时已经在用。
- 带直通设备的虚拟机,快照只包括 keelOS 管的磁盘:直通出去的控制器后面的盘,宿主回滚不了;设备的状态也没法和内存一起存下来。
- 用
zfs send把虚拟机搬到另一台机器、定时备份,都还是计划,没写代码。