FreeBSD中zpool的属性

以前看到运行 sudo rm -rf /* 的相关文章和视频,想最大限度地减小类似操作造成的损失。
主要思路是先看看zfs文件系统是否有规避类似风险的属性设置。
另一个思路是用flag来锁定重要数据。

此篇参考FreeBSD Manual Pages的 zpoolpros(7)

每一个池都有一系列的与之相关的属性值。有些属性是只读的,有些属性是可配置的。

只读属性

只读属性多数只是用来显示当前池的状态,不可更改,所以应该无法用来防范数据丢失。
默认排位 属性名称 说明
16 allocated(分配的) 池使用的存储量。参阅fragmentationfree
2 capacity(容量) 已使用的池空间百分比。可使用短名称cap
20 expandsize(扩展尺寸) 池或设备中可用于增加池总容量的未初始化空间量。
在整个磁盘vdevs上,这是GPT a结束后的空间,通常在动态扩展LUN或用较大的磁盘替换磁盘后时发生。
在分区vdevs上,这是在将分区添加到池a后附加到该分区的空间,很可能是通过就地(in-place)调整分区的大小。
通过设置属性autoexpand=on或使用zpool online -e命令使池联机并扩展容量。
正常情况下,此属性的值为“-”。
22 fragmentation(碎片) 池中的碎片量(百分比)。
随着allocated空间量的增加,定位free空间变得更加困难。
过多的碎片会导致更低的写入性能。
15 free(可用量) 池中可用空间的量。
相比之下,zfs(8)availabel属性描述了可以将多少新数据写入zfs文件系统/卷。
free属性通常不用于此目的,其值可能远大于zfs可用空间。这种差异由以下几个因素造成:
  • raidz配置
  • zfs的属性,例如reservation(保留)、quota(配额)、refreservation(最小预留)、refquota(配额硬限制)
  • spa_slop_shift设定的zfs空间预留设置
21 freeing(正在释放的) 销毁文件系统或快照后,它使用的空间将异步返回到池中。
freeing是要回收的剩余空间量。随着时间的推移,freeing将减少,而free将增加。
23 leaked(泄漏) 由于损坏,freeing期间未释放空间,现在永久泄漏到池中。
4 health(健康) 池当前健康状况。可以是以下值之一:
  • ONLINE
  • 在线
  • DEGRADED
  • 降级
  • FAULTED
  • 故障
  • OFFLINE
  • 离线
  • REMOVED
  • 移除
  • UNAVAIL
  • 不可用
5 guid 池的唯一标识符。
26 load_guid 池的唯一标识符。
与guid不同的是,每次加载池时都会生成此标识符,并且在加载池时不会更改。
现在已经没有这个属性了。
1 size 池的总尺寸。
unsupported@guid 有关池上启用的不支持功能的信息。
以下为手册中未列出的
默认排位 属性名称 说明
25 checkpoint(检查点) 未知
14 dedupratio(重复比率) 应该跟去重相关
空间使用属性报告存储池可用的实际物理空间。
物理空间可能不同于任何包含的数据集实际使用空间的总和。
raidz配置中使用的空间量取决于正在写入的数据的特性。
此外,ZFS为内部记账保留了一些空间,zfs(8)命令考虑了这些空间,但是zpoolprops命令没有考虑。
对于合理大小的非满池,这些影响可以忽略。对于小池或接近满的池,这些差异可能会变得更加明显。

只能在创建(create)和导入(import)时设置的属性

创建或导入后不能修改的属性,应该也无法满足要求。
默认排位 属性名称 说明
3 altroot 备用根目录。
如果设置,则此目录将预先设置到池中的任何挂载点。
在检查挂载点不可信的未知池时,或在典型路径无效的备用启动环境中,可以使用此项。
altroot不是持久属性,它仅在系统启动时有效。
设置altroot默认使用cachefile=none,尽管这可能会使用显式设置覆盖。

只能在导入(import)时设置的属性

导入时设置池为只读,虽然能保证数据不会丢失,但是却使得池不可写。
对于归档类文件可以考虑用此方式。
比如创建一个池及文件系统,将归档文件复制进去。然后将池导出(export),再以只读方式导入。
当要修改池中文件,比如添加文件、删除文件,可以将其导出,然后以普通模式导入。待修改完成后再做以上操作进行只读导入。
这样对池进行操作比较繁琐,也许zfs文件系统的属性里有只读属性,可以用来保护归档文件。
默认排位 属性名称 说明
17 readonly=on|off 如果设置为on,将以只读方式导入池。
可以使用其短名称rdonly

可随时设置并修改的属性

以下属性可以在创建池(zpool create)、导入池(zpool import)时设置,并可以使用zpool set命令进行变更。
默认排位 属性名称 说明
18 ashift=ashift 池扇区大小指数为2的幂(内部称为ashift)。
有效值从9到16(包含16);默认值为0,表示使用内核的块层和zfs内部异常列表进行自动检测。I/O操作将与指定的大小边界对齐。
此外,最小磁盘写入大小将设置为指定大小,因此这代表空间与性能的权衡。
为获得最佳性能,池扇区大小应大于或等于基础磁盘的扇区大小。
13 autoexpand=on|off 控制基础LUN增长时的自动池扩展。
如果设置为on,将根据扩展设备的大小调整池的大小。
如果设备时镜像或raidz的一部分,则在新空间可用于池之前,必须扩展该镜像/raidz组中的所有设备。
默认值为off。
此属性的短名称为expand
9 autoreplace=on|off 控制自动更换设备。
默认为off。管理员必须使用zpool replace命令更换设备。
如果设置为on,则在与以前属于池的设备相同的物理位置找到的任何新设备将自动格式化和替换。
此属性的短名称为replace
如果使用vdev_id.conf设置的/dev/disk/by_vdev路径,则自动替换也可以与虚拟磁盘(如设备映射器)一起使用。
27 autotrim=on|off 当设置为on时,最近释放的且不再由池分配的空间将定期修剪(trimmed)。
自动修剪不会在空闲后立即回收块。允许较小的范围聚合为几个较大的范围,然后可以更有效地将这些数据发布到存储器。
自动调整最近释放的数据块可能会给底层存储设备带来很大压力。这取决于特定设备处理这些命令的能力。
默认为off。
7 bootfs=(unset)|pool [/dataset] 标识根池的默认可引导数据集。
此属性主要由安装和升级程序设置,并非所有Linux发行版引导进程都使用bootfs属性。
10 cachefile=path|none 控制缓存池配置的位置。
在系统启动时发现所有池需要存储在根文件系统上的配置数据的缓存副本。
系统启动时,将自动导入此缓存中的所有池。某些环境(如安装和群集)需要将此信息缓存在不同的位置,以便不会自动导入池。
设置此属性会将池配置缓存到其他位置,稍后可以使用zpool import -c命令导入。
若设置为none,将创建一个从不缓存的临时池,且“”(空字符串)使用默认位置。
多个池可以共享一个缓存文件。由于内核在添加和删除池时会破坏并重建此文件,因此在尝试访问此文件时需要小心。
导出或销毁使用缓存文件的最后一个池时,该文件会被清空。
19 comment=text 由可打印ASCII字符组成的文本字符串。该字符串将被存储,以便即使池出现故障也可用。
管理员可以使用此属性提供有关池的其他信息。
28 compatibility=off|legacy|file[,file]a| 指定池保持与特定功能集的兼容性。
当设置为off(或未设置)时,兼容性被禁用(所有功能均可启用);
当设置为legacy时,不能启用任何功能。
当设置为逗号分隔的文件名列表时(每个文件名可以是绝对路径,也可以是相对于/etc/zfs/compatibility.d或/usr/share/zfs/compatibilty.d的路径),从这些文件中读取请求的功能列表,以空格和/或逗号分隔。
只能启用所有文件中存在的功能。
14 dedupditto=number 此属性已弃用,不再有任何效果。
8 delegation=on|off 控制是否基于在数据集上定义的数据集权限授予非特权用户访问权限。
与zfs委托管理有关。
11 failmode=wait|continue|panic 控制发生灾难性池故障时的系统行为。
这种情况通常是由于与底层存储设备的连接丢失或池中所有设备的故障造成的。
此例事件的行为确定如下:
  • wait
  • 阻止所有I/O访问,直到恢复连接并使用zpool clear清除错误。
    此为默认值。
  • continue
  • 将EIO返回给任何新的写I/O请求,但允许读取任何剩余的正常设备。
    任何尚未提交到磁盘的写入请求都将被阻止。
  • panic
  • 将消息打印到控制台并生成系统崩溃的转储。
29-61 feature@feature_name=enabled 此属性的值是feature_name的当前状态。
设置此属性时唯一有效的值是enabled,这会将feature_name移动到enabled状态。feature的属性有以下三种状态:
  • active
  • 活动状态。在读写模式下导入池需要支持此功能。如果此功能不是只读兼容的,则还需要支持以只读模式导入池。
  • enabled
  • 管理员已在池上将此功能标记为启用,但尚未对该功能的磁盘格式进行更改。
    池仍然可以由不支持此功能的软件导入,但可以随时更改磁盘格式,这将使功能移动到active状态。
    某些功能可能支持在变为active状态后返回到enabled状态。
  • disabled
  • 此功能的磁盘格式尚未更改,除非管理员将该功能移动到enabled状态,否则不会更改。
    功能一旦启用旧不能禁用。
feature_name有以下:
排位 属性名称 说明 默认值
29 feature@async_destroy 销毁文件系统需要遍历其所有数据,以便将其使用的空间返回到池。
如果没有async_destroy,则在回收所有空间之前不会完全删除文件系统。如果销毁操作因重启或断电而中断,则下次尝试打开池时需要同步完成销毁操作。
当启用async_destroy时,文件系统的数据将由后台进程回收,允许销毁操作在不遍历整个文件系统的情况下完成。
后台进程能够在池打开后恢复中断的销毁,从而无需作为打开操作的一部分完成中断的销毁。通过freeing属性,可以获得后台进程要回收的剩余空间量。
此功能仅为active,而freeing为非零。
enabled
30 feature@empty_bpobj 此功能提高了创建和使用单个文件系统或卷的大量快照的性能,并减少了所需的磁盘空间。
当存在多个快照时,每个快照使用多个块指针对象(BlockPointerObject——bpobj)来跟踪与该快照关联的块。
然而在常见实例中,这些bpobj中的大多数是空的。此功能允许按需创建每个bpobj,从而消除空的bpobj。
当启用此功能后创建了任何文件系统、卷或快照时,此功能将出于active状态。
active
31 feature@lz4_compress lz4是一种高性能实时压缩算法,其特点是比旧的lzjb压缩具有更快的压缩和解压缩速度以及更高的压缩比。
通常,与lzjb相比,lz4压缩在可压缩数据上大约快50%,在不可压缩数据中快200%。解压缩时也快了大约80%,同事提供了大约10%的压缩比。
当此功能为enable时,管理员可以使用zfs set命令对池中的任何数据集启用lz4压缩。所有新写入的元数据将使用lz4算法进行压缩。
此功能在启用后立即进入active状态,并且永远不会回到enable状态。
active
32 feature@multi_vdev_crash_dump 此功能允许使用由多个vdev组成的池配置转储设备。这些vdev可以以任何镜像raidz配置布局。
当此功能设置为enabled使,管理员可以使用dumpadm在多个vdev组成的池上配置转储设备。
在FreeBSD和Linux下,此功能未使用,但已注册兼容。在这些系统上创建的新池将启用该功能,但不会转为active,因为崩溃转储支持不需要此功能。
可以导入此功能出于active状态的现有池。
enabled
33 feature@spacemap_histogram 此功能允许zfs维护更多池内自由空间组织方式的信息。
如果此功能为enabled,则在创建新的空间地图对象或将现有空间地图升级为新格式时,该功能将出于active状态,并且不能返回到enabled状态。
active
34 feature@enabled_txg 启用此功能后,zfs将记录启用新功能的交易组编号。这对用户没有可见影响,但其他功能可能依赖于此功能。
此功能在启用后立即变为active状态,且永远不会恢复到enabled状态。
active
35 feature@hole_birth 此功能有bug,其结果是:如果从受影响的数据集执行zfs send -i(或-R),接收方将不会看到任何校验和或其他错误,但生成的目标快照将与源不匹配。
默认情况下,zfs send -i禁用了它的使用。
此功能提高了具有许多漏洞的对象的增量发送(zfs send -i)和接收的性能。
active
36 feature@extensible_dataset 此功能允许更灵活地使用内部zfs数据结构,并存在其他功能所依赖地功能。
依赖此功能的功能有:
bookmarks、bookmark_v2、bookmark_written、edonr、encryption、filesystem_limits、large_blocks、large_dnode、project_quota、redaction_bookmarks、redacted_datasets、sha512、skein、userobj_accounting、zstd_compress
当第一个相关功能使用此功能时,此功能出于active状态,当使用此功能的所有数据集都被销毁时,此功能将返回到enabled状态。
enable
37 feature@embedded_data 此功能提高了高压缩块的性能和压缩比。其内容可以压缩到112字节或更小的块以利用此功能。
启用此功能后,高度可压缩块的内容存储在块“指针”本身中(在这种情况下,这是一个误称,因为它包含压缩数据,而不是指向其在磁盘上位置的指针)。
因此,节省了块的空间(一个扇区,通常为512B或4kB),并且不需要额外的I/O来读取和写入数据块。
此功能在启用后立即变为active状态,并且永远不会恢复到enabled状态。
active
38 feature@bookmarks 此功能启用zfs bookmark命令。
当池中存在任意书签(bookmark)时,此功能出于active状态。
可以通过运行zfs list -t bookmark -r命令列出池中所有书签。
enable
39 feature@filesystem_limits 此功能启用文件系统和快照限制。这些限制可用于控制在树中设置限制的点上可以创建多少文件系统和/或快照
在数据集上设置任何一个限制属性后,此功能即出于active状态。一旦激活,该功能永远不会停用。
enable
40 feature@large_blocks 此功能允许将数据集上的记录大小设置为128kB。
一旦数据集包含块大小大于128kB的文件,此功能就会变为active状态;一旦所有记录大小大于128kB的文件系统都被销毁,此功能恢复至enabled状态。
enable
41 feature@large_dnode
42 feature@sha512 此功能允许使用SHA-512/256截断哈希算法(FIPS 180-4)进行校验和和重复数据消除。
SHA-512的本机64位算法在64位硬件上比SHA-256提供了大约50%的性能提升,因此对于散列性能很重要的系统来说,它是一个很好的最小变化替换候选,但这些系统由于任何原因都不能使用更快的skein和edonr算法。
当sha512功能设置为enabled时,管理员可以使用zfs set checksum=sha512 dset在任何数据集上启用sha512校验和。将校验和属性设置为sha512后,此功能将变为active状态,并将在销毁所有校验和设置为SHA612的文件系统后恢复enabled状态。
enable
43 feature@skein 此功能支持使用Skein哈希算法进行校验和和重复数据消除。
Skein是一种高性能安全哈希算法,曾在NIST SHA-3竞赛中入围。 它在64位硬件上提供了非常高的安全余量和高性能(比SHA-256快80%)。
另外一个Edon-R更快,比SHA-256快350%以上,但是使用 该实现还利用了ZFS中的新的salted校验和功能,这意味着校验和在被馈送到要进行校验和的数据块之前,用一个秘密的256位随机密钥(存储在池中)预播种。
因此,生成的校验和对于给定的池是唯一的,防止了对具有重复数据消除的系统的哈希冲突攻击。
当skein功能设置为enabled时,管理员可以使用zfs set checksum=skein dset在任何数据集上启用skein校验和。
将checksum属性设置为skein后,此功能将变为active状态,并将在所有将checksum设置为skein的文件系统销毁后恢复到enabled状态。
enable
44 feature@userobj_accounting 此功能允许管理员按用户和组说明对象使用情况信息。
此功能启用后立即变为active状态,且永远不会恢复enabled状态。
每个文件系统将在重新挂载时自动升级,或在该文件系统下创建新文件时自动升级。
还可以通过zfs set version=current fs命令在文件系统上出发升级。
升级过程在后台运行,对于包含大量文件的文件系统,可能需要一段事件才能完成。
active
45 feature@encryption 此功能支持创建和管理本机加密的数据集。
创建加密数据集时,此功能处于active状态,并在销毁使用此功能的所有数据集时返回到enabled状态。
enabled
46 feature@project_quota 此功能允许管理员根据项目标识符(ID)计算孔家和对象使用信息。
项目ID是基于对象的属性。
升级现有文件系统时,没有项目ID的对象将被标记为零项目ID。
启用此功能后,如果设置了父目录的继承标志(通过chattr [+-]Pzfs project -s|-C),创建新的对象将继承其父目录的项目ID。
否则,新对象的项目ID将为零。
对象的项目ID可以由所有者(或特权用户)通过chattr -p prjidzfs project -p prjd随时更改。
此功能将在启用后立即激活,并且永远不会返回禁用状态。
每个文件系统将在重新安装时自动升级,或者在该文件系统下创建新文件时自动升级。
还可以通过zfs set version=current fs在文件系统上触发升级。
升级过程在后台运行,对于包含大量文件的文件系统,可能需要一段时间才能完成。
active
47 feature@device_removal 此功能使zpool remove命令能够删除顶级vdev,并将其排空以减少池的总大小。
当在一个顶级vdev上使用了zpool remove命令后,此功能变为active状态,并永远不会回到enabled状态。
enabled
48 feature@obsolete_counts 此功能增强了device_removal,随着时间的推移,它将减少用于跟踪已删除设备的内存。
当释放或重新映射间接块时,它们的间接映射部分已“过时”(obsolete),不再需要。
当在顶级vdev上使用zpool remove命令时,此功能将变为active状态,且永远不会回到enabled状态。
enabled
49 feature@zpool_checkpoint 此功能启用zpool checkpoint命令,该命令可以在发出池时检查池的状态,然后将其倒回或丢弃。
当zpool checkpoint命令用于检查池时,此功能将激活。
只有当池被重绕(rewound)或检查点被丢弃时,该功能才会返回到enabled状态。
zpool checkpoint poolname命令对池设置检查点,以便将来使用zpool import --rewind-to-checkpoint命令将池恢复到检查点。
zpool statuszpool list命令会显示池的checkpoint信息,包括创建时间和消耗的存储空间。
使用zpool checkpoint -d poolname命令可以取消检查点。
enabled
50 feature@spacemap_v2 此功能允许在有利的情况下使用由两个单词(而不是一个)组成的新空间映射编码(space map encoding)。
新编码允许空间映射更有效地表示磁盘上的大空间区域,同时也增加了它们的最大可寻址偏移量。
此功能在启用后将变为active状态,且永远不会返回到enabled状态。
active
51 feature@allocation_classes 此功能支持单独的分配类。
当使用zpool createzpool add命令创建专用分配类vdev(去重或特殊)时,此功能将变为active状态
在设备移除的情况下,如果移除了所有专用分配类vdev,则可将其返回到enabled状态。
enabled
52 feature@resilver_defer 此功能允许ZFS在现有的重新调整器(resilver)已在进行时,推迟新的重新调整。
如果没有此功能,任何新的调整器将导致当前运行的调整器立即从头开始重新启动。
调整器延迟后,此功能将变为active状态,并在被延迟的调整器开始时返回enabled状态。
enabled
53 feature@bookmark_v2 此功能支持创建和管理ZFS中其他功能所需的较大书签。
当创建v2书签时,此功能将转为active,当所有v2书签被销毁时,该功能将返回到enabled状态。
enabled
54 feature@redaction_bookmarks 此功能支持使用编校zfs send,它创建编校书签,存储由创建它们的发送编校的块列表。 enabled
55 feature@redacted_datasets 此功能允许接收经编辑的zfs send流。其在接收时创建经编辑的数据集。
这些数据集缺少一些块,因此无法安全装载,其内容也无法安全读取。
enabled
56 feature@bookmark_written 此功能启用附加的书签记帐字段,启用writed#bookmark属性(自书签后写入的空间),并估计书签增量的发送流大小。
当创建书签时,此功能将处于active状态,当所有带有这些字段的书签被销毁时,该功能将返回到enabled状态。
enabled
57 feature@log_spacemap 此功能提高了严重碎片化池的性能,特别是在工作负载在随机写入时。
它通过在每个TXG的单个空间映射上记录所有metaslab更改,而不是将多个写入分散到所有的metaslab空间映射。
此功能在启用后立即变为active状态,且永远不会回到enabled状态。
active
58 feature@livelist 当对克隆进行了大量随机/稀疏写入时,此功能允许比传统方法更快地删除克隆。
克隆创建后分配和释放的所有块都由克隆的活动列表跟踪,该列表在克隆删除过程中引用。
该功能在创建克隆时处于active状态,并保持此状态,直到所有克隆都已销毁。
active
59 feature@device_rebuild 此功能使zpool attachzpool replace命令能够在调整大小时执行顺序重建(sequential reconstruction),而不是修复重建(healing reconstruction)。
顺序重建在不立即验证校验和的情况下按LBA顺序对设备进行重定位。完成后,开始清理,然后验证校验和。
这种方法允许在最短的时间内将完全冗余恢复到池中。
当包括验证校验和的时间时,这种两阶段方法将比修复修复器花费更长的时间。
但是,除非存在额外的池损坏,否则擦洗不应报告校验和错误。
此功能与raidz配置不兼容。
当顺序调整器正在进行时,此功能将处于active状态,并在调整器完成时返回enabled状态。
enabled
60 feature@zstd_compress zstd是一种高性能压缩算法,其特点是结合了高压缩比和高速度。
与gzip相比,zstd在更高的速度下提供了更好的压缩。
与lz4相比,zstd提供了更好的压缩,但速度稍慢。
通常,zstd压缩速度范围为每个线程250到500 MB/s,解压缩速度超过每个线程1 GB/s。
当zstd功能设置为enabled时,管理员可以使用zfs set compress=zstd dset启用任何数据集的zstd压缩。
一旦将压缩属性设置为zstd,此功能将变为active状态,并且一旦所有将压缩属性设为zstd的文件系统被销毁,该功能将恢复enabled状态。
enabled
61 feature@draid 此功能支持使用draid vdev类型。
dRAID是raidz的一个变体,它提供了集成的分布式热备盘,允许在保持raidz优势的同时更快地调整大小。
数据、奇偶校验和备用空间按冗余组组织,并均匀分布在所有设备上。
创建使用draid vdev类型的池时,或将新的draid vdev添加到现有池时,此功能转为active状态。
enabled
12 listsnapshots=on|off 控制在不使用-t选项运行zfs list时,是否输出与此池关联的快照信息。
默认值为off。
此属性的缩写名为listsnaps。
24 multihost=on|off 控制是否应在zpool导入期间执行池活动检查。
当确定某个池处于活动状态时,即使使用-f选项,也无法导入该池。
此属性用于多台主机可以访问共享存储上的池的故障转移配置。
多主机仅在导入时提供保护。无论vdev的类型如何,它都不能防止单个设备在多个池中使用。
启用此属性时,会定期写入存储,以显示池正在使用。
为了启用此属性,每个主机必须设置唯一的hostid。
6 version=verion 池的当前磁盘版本。
此值可以增加,但不能减少。
更新池版本的首选方法是使用zpool upgrade命令,但当需要特定版本以实现向后兼容性时,可以使用此属性。
在池上启用功能标志后,此属性将不再具有值。