初学者应搭建一个简单的系统,不要选择加密或任何花哨的自定义选项。
ZFS堆栈(stack)分为三层:文件系统(filesystems)、存储池(storage pools)、虚拟设备(virtual devices)。
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zroot 429M 13.0G 96K none
zroot/ROOT 428M 13.0G 96K none
zroot/ROOT/default 428M 13.0G 428M /
zroot/tmp 104K 13.0G 104K /tmp
zroot/usr 428K 13.0G 96K /usr
zfs list命令结合了mount和df命令。
第一列为数据集名称。zfs数据集的名字由其所在的zfs存储池开始。
第二列和第三列显示该数据集已用和剩余空间大小。
第四列(REFER——引用,参考,描述)表示该数据集上可访问的数据量,不一定与使用的空间量相同,需要除掉其子数据集(包括快照、卷、子数据集)的数据量。某些zfs功能(如快照)在它们之间共享数据。
第五列显示该数据集的挂载点。none则表示未挂载。
第二项,名为zroot/ROOT,这是为root文件系统创建的ZFS数据集。像zroot池一样未被挂载。它引用了96KB数据
第三项,zroot/ROOT/default,这是当前root文件系统。使用了428MB数据,挂载在/。
ZFS将zroot/ROOT/default从根文件系统分离出来,便于在多个根文件系统间进行切换,这在系统更新失败、错误配置根文件时更容易恢复到原有的设置。
ZFS没有传统的分区概念。
LBA——Logical Block Address逻辑块地址。
更改分区意味着销毁并重建其上的文件系统。
ZFS数据集没有传统的大小,为防止某些文件(比如/var/log)填满磁盘,应在ZFS级别设置相应限制。
ZFS支持数十个数据集属性。可以使用zfs set命令进行设置。例如:
xxxxxxxxxx
# zfs set quota=2g zroot/var/log
使用zfs get命令可以查看属性:
xxxxxxxxxx
# zfs get quota zroot/var/log
NAME PROPERTY VALUE SOURCE
zroot/var/log quota 2G local
使用zfs get all [zfs-dataset-name]命令可以查看数据集的所有属性。
ZFS并非无限。ZFS使用128位存储其大部分值。
目录可以有2^48个文件,每个文件最多16EB。
单个池最多256ZB(2^78)。
一个存储池最多可以包含2^64个设备,单个主机最多可以包含2^64个存储池。
ZFS使用存储池,而不是磁盘。
存储池是底层存储提供程序之上的抽象,允许将物理介质和其上的用户可见文件系统分开。
使用zpool命令可以查看和管理系统存储池。例如:
x# zpool status
pool: zroot
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
gpt/zfs0 ONLINE 0 0 0
errors: No known data errors
scan行显示是否正在执行任何完整性检查,以及最近一次扫描的结果。
VDEV类似于传统的RAID设备。
ZFS的数据冗余和自动纠错也发生在VDEV级别。
FreeBSD使用GEOM提供程序来支持加密等功能。
Blocks and Inodes
传统的文件系统几乎总是使用各种数据块来存储数据,并用索引节点映射这些块的内容。
ZFS根据需求生成索引节点和适合数据大小的存储块。
可变大小的块比传统文件系统灵活,但不一定适合所有文件。