第一章 介绍ZFS

初学者应搭建一个简单的系统,不要选择加密或任何花哨的自定义选项。

ZFS堆栈(stack)分为三层:文件系统(filesystems)、存储池(storage pools)、虚拟设备(virtual devices)。

ZFS数据集 datasets

zfs list命令结合了mount和df命令。

第二项,名为zroot/ROOT,这是为root文件系统创建的ZFS数据集。像zroot池一样未被挂载。它引用了96KB数据

第三项,zroot/ROOT/default,这是当前root文件系统。使用了428MB数据,挂载在/。

ZFS将zroot/ROOT/default从根文件系统分离出来,便于在多个根文件系统间进行切换,这在系统更新失败、错误配置根文件时更容易恢复到原有的设置。

ZFS分区和属性

ZFS没有传统的分区概念。

LBA——Logical Block Address逻辑块地址。

更改分区意味着销毁并重建其上的文件系统。

ZFS数据集没有传统的大小,为防止某些文件(比如/var/log)填满磁盘,应在ZFS级别设置相应限制。

ZFS支持数十个数据集属性。可以使用zfs set命令进行设置。例如:

使用zfs get命令可以查看属性:

使用zfs get all [zfs-dataset-name]命令可以查看数据集的所有属性。

ZFS限制

ZFS并非无限。ZFS使用128位存储其大部分值。

目录可以有2^48个文件,每个文件最多16EB。

单个池最多256ZB(2^78)。

一个存储池最多可以包含2^64个设备,单个主机最多可以包含2^64个存储池。

存储池

ZFS使用存储池,而不是磁盘。

存储池是底层存储提供程序之上的抽象,允许将物理介质和其上的用户可见文件系统分开。

使用zpool命令可以查看和管理系统存储池。例如:

scan行显示是否正在执行任何完整性检查,以及最近一次扫描的结果。

虚拟设备

VDEV类似于传统的RAID设备。

ZFS的数据冗余和自动纠错也发生在VDEV级别。

FreeBSD使用GEOM提供程序来支持加密等功能。

块和节点

Blocks and Inodes

传统的文件系统几乎总是使用各种数据块来存储数据,并用索引节点映射这些块的内容。

ZFS根据需求生成索引节点和适合数据大小的存储块。

可变大小的块比传统文件系统灵活,但不一定适合所有文件。