zfs 速查手册
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
原文链接:
作者:Benedict Reuschling (benedict@reuschling.org)
原发布时间:2025 年 3 月
单个磁盘
无冗余,挂载为 /mypool
,无需在 /etc/fstab
中添加条目。
条带(RAID-0) 无冗余,任意一块磁盘损坏都会导致数据全部丢失。性能高,可用容量为所有磁盘总和。
镜像(RAID-1)
可承受一块磁盘损坏,VDEV 在 zpool status
输出中显示为 mirror-0
,可并行读取所有磁盘,写入速度较慢,总容量低于 RAID-0。
单奇偶校验(RAID-Z1)
至少需要 3 块磁盘,可承受 1 块磁盘损坏,奇偶校验信息分布在所有磁盘上,读写速度较快,性能相当,容量约为 66%。在 zpool status
输出中显示为 raidz1-0
VDEV。
双奇偶校验(RAID-Z2) 每个 VDEV 可承受 2 块磁盘损坏,比 RAID-Z1 慢,至少需要 4 块磁盘,可用容量约为 50%。
RAID10 至少需要 4 块磁盘,每个 VDEV 可承受 1 块磁盘损坏,读速快,写速为单个磁盘的一半,容量为 50%。是冗余性、容量和性能的良好折中方案。
三奇偶校验(RAID-Z3) 比 RAID-Z2 稍慢,每个 VDEV 可承受 3 块磁盘损坏,至少需要 5 块磁盘,可用容量约为 40%。
显示存储池状态【包括磁盘配置、错误信息、适用的更新、上次 scrub 时间(若有)】
显示存储池容量、已用空间和可用空间
显示存储池 I/O 统计信息
选项:
-v
显示各个设备
-w
显示 I/O 延迟
-r
显示请求大小直方图
-l
显示等待时间统计
-q
显示队列统计
显示存储池的管理命令历史
选项:
-l
详细格式
-i
仅显示事务组等事件
获取存储池属性及其值,并可使用 zpool set
修改默认值
当数据不再适合存储在 ZFS 主内存缓存(ARC:自适应替换缓存)时,L2ARC 充当快速读取缓存。读取请求将由 L2ARC 处理,需使用高速存储设备(如闪存)才能获得显著效果。使用 cache
关键字将设备添加到存储池。
将同步写入转换为异步写入(不影响读取),使应用程序能更快确认数据已写入,类似于数据库事务日志。当写入完成并存储到底层存储介质后,ZIL 将被清除。ZIL 需要快速存储设备,但无需大容量。使用关键字 log
将设备添加到存储池。
备用盘在替换故障磁盘之前不会参与 I/O 操作,可以由手动操作或外部故障管理软件触发替换。使用关键字 spare
添加备用盘。
为单磁盘存储池设备 /dev/nda0
添加镜像磁盘 /dev/nda1
:
将存储池中的故障磁盘 /dev/nda2
替换为设备 /dev/nda3
:
完成所有 I/O 操作后,从文件系统层次结构中卸载存储池。可在其他系统上导入以恢复存储池状态。
将存储池导入当前系统。
扫描 ZFS 存储池标识
通过 ID 或名称导入存储池
重命名存储池
在不同路径下挂载已导入的存储池(防止覆盖现有存储池)
以只读模式导入存储池
尝试恢复最近销毁的存储池
数据集位于存储池之上,并占用其空间。访问方式如下:mypool/data
。每个存储池创建时,都会默认生成一个与其同名的顶级数据集。例如,执行以下命令:
将创建一个名为 test
的存储池和数据集,顶级数据集将挂载为 /test
,并可包含子数据集。
创建一个名为 ds
的新数据集,大部分属性继承自父数据集:
创建多个数据集:
列出已用空间、可用空间和挂载点
按 ZFS 路径显示数据集
列出数据集及其所有子数据集
限制显示数据集的层级深度
仅显示数据集名称
移除输出头部
修改显示顺序
按列排序
倒序排列
列出每个数据集及其子数据集的可用空间和已用空间,包括快照和任何预留空间:
推荐:使用该命令代替 df -h
。
重命名数据集或在存储池层次结构内移动数据集,类似于 Unix mv
命令:
模拟销毁(不会执行实际删除):
输出:
执行销毁并显示结果:
输出:
递归销毁数据集及其子数据集:
数据集通过继承父数据集的大部分属性来提高灵活性。子数据集可根据需要覆盖这些属性。仅可更改 SOURCE
列中的默认属性,存储池的属性规则相同。
多种方式可以查看存储池和数据集的属性:
查看存储池的所有属性
查看数据集的所有属性
查看单个属性(容量)
查看多个属性(容量与健康状态)
禁用访问时间更新(可提高性能):
更改挂载点:
可为数据集定义自定义属性(key=value
),数据集会继承这些属性,但可更改其值。
创建自定义属性:
列出自定义属性:
重置属性值(继承父级值):
删除自定义属性(递归删除):
ZFS 在数据存储时会计算并存储校验和,覆盖整个数据集层次结构。I/O 错误、驱动故障、内存损坏、损坏的电缆等因素可能导致校验和不匹配。
如果存储池具有足够的冗余(如镜像或 RAID-Z),ZFS 可以检测到这些错误并自动修复(自我修复)。
建议每月运行一次 Scrub,重新计算校验和。如果发现数据损坏,ZFS 会从冗余 VDEV 获取正确的数据并修正错误。
启动 Scrub:
查看 Scrub 进度和错误信息:
ZFS 无需 fsck
,因为 ZFS 自带数据完整性检查机制。
ZFS 卷使用连续的存储池空间,并可通过 iSCSI 在网络上导出。当使用非 ZFS 文件系统格式化卷时,该文件系统仍可自动利用所有 ZFS 的底层功能。
创建一个 10GB 的 ZFS 卷:
稀疏卷是超分配的卷,不会立即占用所有预留空间,而是随着数据的增长逐步填充。
创建一个 1PB(1 PB)稀疏卷:
每个数据集默认可以使用整个存储池的空间。配额用于限制数据集的最大存储量。ZFS 严格 执行配额限制,任何超出配额的写入都会被阻止。
ZFS 默认无配额。可使用 zfs set
命令为特定数据集设置配额:
该配额适用于该数据集及其所有子数据集(包括未来创建的子数据集)。这些数据集共享 配额总量。
如果仅想限制父数据集本身,不影响子数据集,则使用 refquota
:
限制特定用户的存储空间:
限制某个用户组的存储空间:
查询数据集的配额:
查询 refquota
:
查询用户配额:
查询组配额:
将数据集的配额取消(refquota
也同样适用):
预留(Reservation)确保存储池中一定量的空间始终可用,不受其他数据集占用。这减少了存储池的可用空间,但可以防止单个数据集占满整个池,有助于容量规划。
使用 reservation
属性设置数据集的预留空间:
预留空间会被子数据集继承。如果只想对该数据集本身生效,而不影响子数据集,则使用 refreservation
:
查看数据集的预留空间:
查看 USEDREFRESERV
列中的预留空间:
将 reservation
或 refreservation
设为 none
:
快照提供了一种快速保存数据集只读状态的方法,可用于恢复数据集到特定时间点的状态。无需回滚整个快照,也可以单独恢复其中的文件。
ZFS 通过 .zfs
目录提供只读访问,可从快照中读取文件。
创建快照:
简写命令:
递归创建快照(包含所有子数据集):
列出所有快照:
列出数据集及其所有子数据集的快照:
written
属性显示自上次快照以来写入的数据量。
配合 used
和 referenced
属性可以直观查看存储池空间使用情况:
使用 zfs diff
比较当前数据集与某个快照之间的更改:
输出说明:
+
新增文件
-
删除文件
M
修改文件
R
重命名文件(应用于目录时表示元数据更改)
对比 两个快照 之间的更改:
回滚操作会丢弃当前数据集的状态,恢复到指定快照的状态。所有在该快照之后创建的数据都会被删除。
如果要回滚到更早的快照,必须先使用选项 -r
删除所有中间快照:
可将快照以只读方式挂载到文件系统:
建议先执行模拟删除(选项 -n
)查看即将删除的内容,配合 -v
显示详细信息:
如果确认无误,去掉 -n
选项执行删除:
删除指定快照及其所有子快照:
假设快照列表如下:
删除快照 @b
至 @d
(含 @d
):
删除 @b
及其后所有快照:
删除 @b
之前的所有快照:
ZFS 能为快照创建保护标记(tag),被标记的快照不能删除。可以对一个快照添加多个保护标记,只有 所有标记都被移除 后,快照才可以删除。
克隆是可写的快照副本,创建的克隆数据集包含原快照的所有数据。
克隆数据集的 origin
属性指向其来源快照:
ZFS 不允许删除 有依赖克隆的快照。要删除原快照,必须先提升克隆为独立数据集(promote
):
此时:
origin
属性消失
该快照成为克隆的新基础
原快照可安全删除
可像删除普通数据集一样删除克隆:
ZFS 支持数据集加密,每个数据集可以有独立的密钥。一些元数据仍然保持未加密状态,以便执行 scrub 等操作。
设置数据集的加密密码:
获取密钥状态:
解锁数据集:
ZFS 允许将 ZFS 命令的权限 委派给非 root 用户。
授予用户 joe
对 atime
属性的修改权限:
移除 joe
的 compression
权限:
授予 mygroup
组 atime
属性权限:
授予 jill
允许其他用户管理数据集权限的权限:
创建权限集合 @myset
,包含 mount
、snapshot
、rollback
和 destroy
权限:
将 @myset
赋予用户 jill
:
ZFS 能以字节流的方式本地和通过网络传输快照,可用于备份。
要恢复快照,可使用 zfs receive
,并通过 -v
选项显示详细信息:
显示传输详细信息:
直接通过管道传输快照数据:
使用 SSH 传输快照到另一台主机的 ZFS 池:
允许 sender
用户发送数据集:
接收方 receiver
需要额外的权限: