本章概述了 Oracle Solaris ZFS 文件系统及其功能和优点。本章还介绍了在本书所有其余部分中使用的一些基本术语。
本章包含以下各节:
本节概述了 ZFS 文件系统的新增功能。
Oracle Solaris 10 9/10 发行版:在本 Solaris 发行版中,可以使用 zpool split 命令分割镜像存储池,分离原镜像池中的一个或多个磁盘,创建另一个完全相同的池。
有关更多信息,请参见通过分割镜像 ZFS 存储池创建新池。
Oracle Solaris 10 9/10 发行版:在本 Solaris 发行版中,每个 ZFS 存储池都有一个关联的进程 zpool-poolname 。此进程中的线程是用来处理与池相关的 I/O 任务的池 I/O 处理线程,如压缩和校验和等。此进程的作用是使各存储池的 CPU 利用情况具有可见性。使用 ps 和 prstat 命令可以查看有关这些进程的信息。这些进程仅在全局区域中可用。有关更多信息,请参见SDC(7)。
Oracle Solaris 10 9/10 发行版:在本 Solaris 发行版中, zpool list 输出已发生改变,可更好地提供空间分配信息。例如:
# zpool list tank NAME SIZE ALLOC FREE CAP HEALTH ALTROOT tank 136G 55.2G 80.8G 40% ONLINE - |
以前的 USED 和 AVAIL 字段已被 ALLOC 和 FREE 所取代。
ALLOC 字段表明分配给所有数据集和内部元数据的物理空间量。FREE 字段表明池中未分配的空间量。
有关更多信息,请参见显示有关 ZFS 存储池的信息。
Oracle Solaris 10 9/10 发行版:如果底层设备变得不可用,发生电源故障,或者冗余 ZFS 配置中有超过支持数量的设备发生故障,则存储池可能受损。本发行版提供了新的命令功能来恢复受损的存储池。然而,使用此恢复功能会导致存储池出现故障前发生的最后几项事务丢失。
zpool clear 和 zpool import 命令均支持 -F 选项,可用来恢复损坏的存储池。此外,运行 zpool status、zpool clear 或 zpool import 命令会自动报告损坏的池,这些命令会说明如何恢复池。
有关更多信息,请参见修复 ZFS 存储池范围内的损坏。
Oracle Solaris 10 9/10 发行版:提供下列日志设备增强功能:
logbias 属性–可以使用此属性提示 ZFS 处理对特定数据集的同步请求。如果 logbias 设置为 latency,ZFS 将使用池的不同日志设备(如有)低延迟地处理请求。如果 logbias 设置为 throughput,ZFS 将不使用池的不同日志设备。相反,ZFS 将优化同步操作,以提高池的全局吞吐量并有效使用资源。缺省值为 latency。对于大多数配置,推荐使用缺省值。使用 logbias=throughput 值可以提高数据库文件写入的性能。
日志设备移除–现在可以使用 zpool remove 命令从 ZFS 存储池移除日志设备。通过指定设备名称,可以移除一个日志设备。通过为日志指定顶层镜像,可以移除一个镜像日志设备。从系统移除一个独立的日志设备时,主池中会写入 ZIL 事务记录。
现在用数字标识符标识冗余顶层虚拟设备。例如,在由 2 个磁盘组成的镜像存储池中,顶层虚拟设备为 mirror-0。
有关更多信息,请参见示例 4–3。
Solaris 10 9/10 发行版:在本 Solaris 发行版中,冗余 RAID-Z 配置可以具有单奇偶校验、双奇偶校验或三奇偶校验,这意味着可以分别承受一个、两个或三个设备故障,而不会丢失任何数据。您可以指定 raidz3 关键字以使用三奇偶校验 RAID-Z 配置。有关更多信息,请参见创建 RAID-Z 存储池。
Oracle Solaris 10 9/10 发行版:如果实施不同的原子快照策略,导致旧的快照由于不再存在于发送侧而被 zfs receive 不小心销毁,则可能需要考虑使用本 Solaris 发行版中的快照保持功能。
保持快照可以防止它被销毁。此外,该功能允许使用 zfs destroy -d 命令在快照的最后一个克隆被删除前即删除该快照。
可以保持一个快照或一组快照。例如,以下语法对 tank/home/cindys/snap@1 设置一个保持标志 keep。
# zfs hold keep tank/home/cindys@snap1 |
有关更多信息,请参见保持 ZFS 快照。
Oracle Solaris 10 9/10 发行版:在本 Solaris 发行版中,扩展底层设备时会提供系统事件或 sysevent。ZFS 已得到增强,可以识别这些事件,并根据扩展 LUN 的新大小调整存储池,具体取决于 autoexpand 属性的设置。可以使用 autoexpand 池属性决定在收到动态 LUN 扩展事件时是否启用或禁用自动池扩展功能。
通过这些功能可扩展 LUN,由此产生的池可以访问扩展空间,而不必导出和导入池或重新引导系统。
例如,对 tank 池启用自动 LUN 扩展功能。
# zpool set autoexpand=on tank |
或者,可以在启用 autoexpand 属性的情况下创建池。
# zpool create -o autoexpand=on tank c1t13d0 |
autoexpand 属性的缺省设置为禁用,因此您可以决定是否要扩展 LUN。
使用 zpool online - e 命令也可以扩展 LUN。例如:
# zpool online -e tank c1t6d0 |
或者,在附加 LUN 或利用 zpool replace 功能使其变得可用之后,可以重置 autoexpand 属性。例如,下例利用一个 8-GB 磁盘 (c0t0d0) 创建了一个池。8-GB 磁盘被一个 16-GB 磁盘 (c1t13d0) 替换,但直到启用 autoexpand 属性之后,池大小才会扩展。
# zpool create pool c0t0d0 # zpool list NAME SIZE ALLOC FREE CAP HEALTH ALTROOT pool 8.44G 76.5K 8.44G 0% ONLINE - # zpool replace pool c0t0d0 c1t13d0 # zpool list NAME SIZE ALLOC FREE CAP HEALTH ALTROOT pool 8.44G 91.5K 8.44G 0% ONLINE - # zpool set autoexpand=on pool # zpool list NAME SIZE ALLOC FREE CAP HEALTH ALTROOT pool 16.8G 91.5K 16.8G 0% ONLINE - |
在不启用 autoexpand 属性的情况下扩展上例中的 LUN 的另一种方法是使用 zpool online - e 命令,即使该设备已经联机。例如:
# zpool create tank c0t0d0 # zpool list tank NAME SIZE ALLOC FREE CAP HEALTH ALTROOT tank 8.44G 76.5K 8.44G 0% ONLINE - # zpool replace tank c0t0d0 c1t13d0 # zpool list tank NAME SIZE ALLOC FREE CAP HEALTH ALTROOT tank 8.44G 91.5K 8.44G 0% ONLINE - # zpool online -e tank c1t13d0 # zpool list tank NAME SIZE ALLOC FREE CAP HEALTH ALTROOT tank 16.8G 90K 16.8G 0% ONLINE - |
本发行版的其它设备替换增强功能包括:
在先前的发行版中,如果替换磁盘与现有磁盘稍有不同,ZFS 就无法替换或附加磁盘。在本发行版中,只要池未满,就可以用名义大小相同的新磁盘替换现有磁盘或附加新磁盘。
在本发行版中,扩展 LUN 无需重新引导系统或者导出并导入一个池。如上所述,可以启用 autoexpand 属性或者使用 zpool online - e 命令扩展 LUN 的大小。
有关替换设备的更多信息,请参见替换存储池中的设备。
Solaris 10 10/09 发行版:在此 Solaris 发行版中,您可以设置 JumpStart 配置文件以标识 ZFS 根池的 Flash 归档文件。有关更多信息,请参见安装 ZFS 根文件系统(Oracle Solaris Flash 归档文件安装)。
Solaris 10 10/09 发行版:在先前的 Solaris 发行版中,您可以将配额和预留空间应用于 ZFS 文件系统,以管理和预留磁盘空间。
在此 Solaris 发行版中,您可以根据属于特定用户或组的文件所占用的磁盘空间量来设置配额。您可以考虑在拥有大量用户或组的环境中设置用户和组配额。
可以使用 zfs userquota 属性设置用户配额。要设置组配额,请使用 zfs groupquota 属性。例如:
# zfs set userquota@user1=5G tank/data # zfs set groupquota@staff=10G tank/staff/admins |
您可以显示用户或组的当前配额设置,如下所示:
# zfs get userquota@user1 tank/data NAME PROPERTY VALUE SOURCE tank/data userquota@user1 5G local # zfs get groupquota@staff tank/staff/admins NAME PROPERTY VALUE SOURCE tank/staff/admins groupquota@staff 10G local |
按以下方式显示常规配额信息:
# zfs userspace tank/data TYPE NAME USED QUOTA POSIX User root 3K none POSIX User user1 0 5G |
# zfs groupspace tank/staff/admins TYPE NAME USED QUOTA POSIX Group root 3K none POSIX Group staff 0 10G |
您可以查看 userused@user 属性,以显示个别用户的磁盘空间使用情况。使用 groupused@ group 属性可以查看组的磁盘空间使用情况。例如:
# zfs get userused@user1 tank/staff NAME PROPERTY VALUE SOURCE tank/staff userused@user1 213M local # zfs get groupused@staff tank/staff NAME PROPERTY VALUE SOURCE tank/staff groupused@staff 213M local |
有关设置用户配额的更多信息,请参见设置 ZFS 配额和预留空间。
Solaris 10 10/09 发行版:在先前的 Solaris 发行版中,您可以应用 ACL 继承,以便使用 0664 或 0666 权限创建所有文件。在此发行版中,如果要将文件创建模式中的执行位选择性包括在继承的 ACL 中,您可以设置 aclinherit 模式以将执行权限传递给继承的 ACL。
如果在 ZFS 数据集上启用了 aclinherit=passthrough-x,则可以为从 cc 或 gcc 编译器工具生成的输出文件添加执行权限。如果继承的 ACL 不包括执行权限,则只有使用 chmod 命令更改文件的权限后才能执行由编译器生成的可执行输出。
有关更多信息,请参见示例 8–12。
Solaris 10 10/09 和 Oracle Solaris 10 9/10:在这些发行版中添加了以下 ZFS 文件系统增强功能。
ZFS 快照流属性增强–可以设置一个接收属性,它不同于其本地属性设置。例如,假设您接收一个压缩属性被禁用的流,但您想在接收文件系统中启用压缩。这意味着,接收的流的接收压缩属性值为 off,而本地压缩属性值为 on。由于本地值会覆盖接收的值,因此无需担心发送侧的设置会替换接收侧的值。zfs get 命令在 VALUE 栏下显示压缩属性的有效值。
支持发送和本地属性值的新 ZFS 命令选项和属性如下:
使用 zfs inherit -S 将本地属性值恢复为接收值(如有)。如果属性没有接收值,则 zfs inherit - S 命令的行为与不带 -S 选项的 zfs inherit 命令相同。如果属性有接收值,则 zfs inherit 命令会用继承的值覆盖接收的值,直到发出 zfs inherit -S 命令将其恢复为接收的值。
可以使用 zfs get -o 以包括新的非缺省栏 RECEIVED。或者,可以使用 zfs get -o all 命令以包括所有栏,其中包括 RECEIVED。
您可以使用 zfs send -p 选项以包括发送流中的属性,而无需使用 -R 选项。
此外,可以使用 zfs send -e 选项以利用发送快照名的最后一个元素确定新的快照名。以下示例将 poola/bee/cee@1 快照发送给 poold/eee 文件系统,并仅利用快照名的最后一个元素 (cee@1) 创建接收的文件系统和快照。
# zfs list -rt all poola NAME USED AVAIL REFER MOUNTPOINT poola 134K 134G 23K /poola poola/bee 44K 134G 23K /poola/bee poola/bee/cee 21K 134G 21K /poola/bee/cee poola/bee/cee@1 0 - 21K - # zfs send -R poola/bee/cee@1 | zfs receive -e poold/eee # zfs list -rt all poold NAME USED AVAIL REFER MOUNTPOINT poold 134K 134G 23K /poold poold/eee 44K 134G 23K /poold/eee poold/eee/cee 21K 134G 21K /poold/eee/cee poold/eee/cee@1 0 - 21K - |
在创建池时设置 ZFS 文件系统属性-您可以在创建存储池时设置 ZFS 文件系统属性。在以下示例中,在创建池时创建的 ZFS 文件系统上启用了压缩:
# zpool create -O compression=on pool mirror c0t1d0 c0t2d0 |
在 ZFS 文件系统上设置高速缓存属性-ZFS 文件系统中提供了两个新属性,使您能够控制主高速缓存 (ARC) 和二级高速缓存 (L2ARC) 中要缓存的内容。高速缓存属性设置如下所示:
primarycache-用于控制在 ARC 中高速缓存的内容。
secondarycache-控制在 L2ARC 中要缓存的内容。
这两个属性的可能值包括 all、none 和 metadata。如果设置为 all,则用户数据和元数据都会被缓存。如果设置为 none,则用户数据和元数据都不会被缓存。如果设置为 metadata,则只有元数据被缓存。缺省值为 all。
您可以在现有文件系统上或在创建文件系统时设置这些属性。例如:
# zfs set primarycache=metadata tank/datab # zfs create -o primarycache=metadata tank/newdatab |
如果在现有文件系统上设置这些属性,则根据这些属性的值仅缓存新 I/O。
对某些数据集环境而言,不高速缓存用户数据可能会带来一些好处。您必须确定您的环境是否适合设置高速缓存属性。
查看磁盘空间记帐属性-新的只读文件系统属性有助于您确定克隆、文件系统和卷的磁盘空间使用情况以及快照。这些属性如下所示:
usedbychildren-标识此数据集的子项占用的磁盘空间量;如果所有数据集子项都被销毁,将释放该空间。此属性的缩写为 usedchild。
usedbydataset-用于确定此数据集本身使用的磁盘空间量,如果在销毁所有快照并删除所有 refreservation 后销毁数据集,将释放此空间。此属性的缩写为 usedds。
usedbyrefreservation-用于确定此数据集上的 refreservation 集使用的磁盘空间量,如果删除 refreservation,将释放此空间。此属性的缩写为 usedrefreserv。
usedbysnapshots-标识此数据集的快照占用的磁盘空间量;如果此数据集的所有快照都被销毁,将释放该空间。请注意,这不是快照 used 属性的总和,因为多个快照可以共享磁盘空间。此属性的缩写为 usedsnap。
这些新的属性将 used 属性的值分解为各种占用磁盘空间的元素。特别地,used 属性的值分解如下:
used property = usedbychildren + usedbydataset + usedbyrefreservation + usedbysnapshots |
您可以使用 zfs list -o space 命令查看这些属性。例如:
$ zfs list -o space NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD rpool 25.4G 7.79G 0 64K 0 7.79G rpool/ROOT 25.4G 6.29G 0 18K 0 6.29G rpool/ROOT/snv_98 25.4G 6.29G 0 6.29G 0 0 rpool/dump 25.4G 1.00G 0 1.00G 0 0 rpool/export 25.4G 38K 0 20K 0 18K rpool/export/home 25.4G 18K 0 18K 0 0 rpool/swap 25.8G 512M 0 111M 401M 0 |
以上命令等同于 zfs list -o name,avail,used,usedsnap,usedds,usedrefreserv,usedchild -t filesystem,volume 命令。
Listing snapshots – listsnapshots 池属性控制是否通过 zfs list 命令显示快照信息。缺省值为 on ,这意味着在缺省情况下显示快照信息。
如果您的系统有许多 ZFS 快照,并且希望禁用 zfs list 命令中关于快照信息的显示,请按照如下所示禁用 listsnapshots 属性:
# zpool get listsnapshots pool NAME PROPERTY VALUE SOURCE pool listsnapshots on default # zpool set listsnaps=off pool |
如果禁用了 listsnapshots 属性,可以通过 zfs list -t snapshots 命令列出快照信息。 例如:
# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT pool/home@today 16K - 22K - pool/home/user1@today 0 - 18K - pool/home/user2@today 0 - 18K - pool/home/user3@today 0 - 18K - |
Solaris 10 10/09 发行版:在此发行版中,ZFS 使用 zpool status 命令确定意图日志故障。故障管理架构 (Fault Management Architecture, FMA) 也会报告这些错误。ZFS 和 FMA 都介绍如何从意图日志 (intent log) 故障中恢复。
例如,如果系统在将同步写操作提交给具有单独日志设备的池之前突然关闭,您将会看到类似以下内容的信息:
# zpool status -x pool: pool state: FAULTED status: One or more of the intent logs could not be read. Waiting for adminstrator intervention to fix the faulted pool. action: Either restore the affected device(s) and run 'zpool online', or ignore the intent log records by running 'zpool clear'. scrub: none requested config: NAME STATE READ WRITE CKSUM pool FAULTED 0 0 0 bad intent log mirror ONLINE 0 0 0 c0t1d0 ONLINE 0 0 0 c0t4d0 ONLINE 0 0 0 logs FAULTED 0 0 0 bad intent log c0t5d0 UNAVAIL 0 0 0 cannot open |
您可以通过以下方式解决日志设备故障:
更换或恢复日志设备。在此示例中,日志设备是 c0t5d0。
将日志设备重新联机。
# zpool online pool c0t5d0 |
重置故障日志设备的错误状态。
# zpool clear pool |
要从此错误中恢复而不更换故障日志设备,可以使用 zpool clear 命令清除该错误。在这种情况下,池将在降级模式下运行,并且日志记录将被写入到主池,直到更换单独的日志设备。
请考虑使用镜像日志设备来避免日志设备故障情形。
Solaris 10 10/09 发行版:在此发行版中,当您创建池时,您可以指定高速缓存设备,以用于缓存存储池数据。
高速缓存设备在主内存和磁盘之间提供了一个进行高速缓存的附加层。使用高速缓存设备,可以最大程度地提高大多数静态内容的随机读取工作的性能。
创建池时,可以指定一个或多个高速缓存设备。例如:
# zpool create pool mirror c0t2d0 c0t4d0 cache c0t0d0 # zpool status pool pool: pool state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM pool ONLINE 0 0 0 mirror ONLINE 0 0 0 c0t2d0 ONLINE 0 0 0 c0t4d0 ONLINE 0 0 0 cache c0t0d0 ONLINE 0 0 0 errors: No known data errors |
添加高速缓存设备之后,这些设备中将逐渐填充来自主内存的内容。填充设备可能需要一个小时以上的时间,具体取决于高速缓存设备的大小。可以通过按以下方式使用 zpool iostat 命令来监视容量和读取操作:
# zpool iostat -v pool 5 |
创建池后,可以在池中添加高速缓存设备或从池中删除高速缓存设备。
有关更多信息,请参见使用高速缓存设备创建 ZFS 存储池和示例 4–4。
Solaris 10 5/09 发行版:此发行版扩展了使用 Oracle Solaris Live Upgrade 在 ZFS 环境中迁移区域的支持。有关更多信息,请参见使用 Oracle Solaris Live Upgrade 迁移或升级具有区域的系统(最低Solaris 10 5/09)。
有关此发行版的已知问题列表,请参见《Solaris 5 10/09 发行说明》。
Solaris 10 10/08 发行版:此发行版提供了安装并引导 ZFS 根文件系统的功能。您可以使用初始安装选项或 JumpStart 功能来安装 ZFS 根文件系统。或者,可以使用 Oracle Solaris Live Upgrade 功能将 UFS 根文件系统迁移到 ZFS 根文件系统。此外,还提供了对交换和转储设备的 ZFS 支持。有关更多信息,请参见第 5 章。
有关此发行版的已知问题列表,请转至以下网站:
http://hub.opensolaris.org/bin/view/Community+Group+zfs/boot
另请参见 Solaris 10 10/08 发行说明。
Solaris 10 10/08 发行版:此发行版提供了无需事先取消挂载数据集便可进行回滚的功能。因此,不再需要使用 zfs rollback -f 选项来强制进行卸载操作。-f 选项不再受支持且将被忽略(如果指定)。
Solaris 10 10/08 发行版:此发行版包括对 zfs send 命令的以下增强。现在您可以使用此命令执行以下任务:
将所有增量流从某个快照发送至一个累积快照。例如:
# zfs list NAME USED AVAIL REFER MOUNTPOINT pool 428K 16.5G 20K /pool pool/fs 71K 16.5G 21K /pool/fs pool/fs@snapA 16K - 18.5K - pool/fs@snapB 17K - 20K - pool/fs@snapC 17K - 20.5K - pool/fs@snapD 0 - 21K - # zfs send -I pool/fs@snapA pool/fs@snapD > /snaps/fs@combo |
此语法将所有增量快照按 fs@snapA 到 fs@snapD 到 fs@combo 的顺序发送。
从原始快照发送增量流以创建克隆。原始快照必须已存在于接收方之上才能接受增量流。例如:
# zfs send -I pool/fs@snap1 pool/clone@snapA > /snaps/fsclonesnap-I . . # zfs receive -F pool/clone < /snaps/fsclonesnap-I |
将所有后代文件系统的复制流发送到已命名的快照。接收时,所有属性、快照、后代文件系统和克隆都将被保留。例如:
# zfs send -R pool/fs@snap > snaps/fs-R |
有关扩展示例,请参见示例 7–1。
发送增量复制流。例如:
# zfs send -R -[iI] @snapA pool/fs@snapD |
有关扩展示例,请参见示例 7–1。
有关更多信息,请参见发送和接收复杂的 ZFS 快照流。
Solaris 10 10/08 发行版:除了现有的 ZFS 配额和预留空间功能以外,此发行版还在磁盘空间记帐中包括不包含后代(如快照和克隆)的数据集配额和预留空间。
refquota 属性对一个数据集可以使用的磁盘空间量实行硬限制。此硬限制不包括后代(如快照和克隆)所使用的磁盘空间。
refreservation 属性设置为数据集(不包括其后代)保留的最小磁盘空间量。
例如,您可以为 studentA 设置一个 10 GB 的 refquota 限制,即设置一个 10 GB 的引用磁盘空间硬限制。为增加灵活性,可以设置一个允许您管理 studentA 的快照的 20 GB 配额。
# zfs set refquota=10g tank/studentA # zfs set quota=20g tank/studentA |
有关更多信息,请参见设置 ZFS 配额和预留空间。
Solaris 10 10/08 发行版:ZFS 存储池属性是在早期发行版中引入的。本发行版提供两个属性:cachefile 和 failmode。
下面说明本发行版提供的新存储池属性:
cachefile 属性–此属性控制在何处缓存池配置信息。系统引导时会自动导入高速缓存中的所有池。但是,安装和群集环境可能需要将此信息高速缓存到不同的位置,以便不会自动导入池。
您可以将此属性设置为在不同的位置高速缓存池配置,以后可以使用 zpool import -c 命令导入该配置。对于大多数 ZFS 配置,不会使用此属性。
cachefile 属性不是持久性的,未存储在磁盘上。此属性替换了先前的 Solaris 发行版中的 temporary 属性,后者用于指明不应高速缓存池信息。
failmode 属性-此属性确定因缺少设备连接或池中的所有设备出现故障而发生灾难性池故障时的行为。可以将 failmode 属性设置为以下值:wait、continue 或 panic。缺省值为 wait,表示必须重新连接设备或更换出现故障的设备,然后使用 zpool clear 命令清除错误。
failmode 属性的设置方式与其他可设置的 ZFS 属性类似,可以在创建池前或创建池后进行设置。例如:
# zpool set failmode=continue tank # zpool get failmode tank NAME PROPERTY VALUE SOURCE tank failmode continue local |
# zpool create -o failmode=continue users mirror c0t1d0 c1t1d0 |
有关池属性的说明,请参见表 4–1。
Solaris 10 10/08 发行版:zpool history 命令已得到增强,可以提供以下新增功能:
现在能够显示 ZFS 文件系统事件信息。例如:
# zpool history History for 'rpool': 2010-06-23.09:30:12 zpool create -f -o failmode=continue -R /a -m legacy -o cachefile=/tmp/root/etc/zfs/zpool.cache rpool c1t0d0s0 2010-06-23.09:30:13 zfs set canmount=noauto rpool 2010-06-23.09:30:13 zfs set mountpoint=/rpool rpool 2010-06-23.09:30:13 zfs create -o mountpoint=legacy rpool/ROOT 2010-06-23.09:30:14 zfs create -b 8192 -V 2048m rpool/swap 2010-06-23.09:30:14 zfs create -b 131072 -V 1024m rpool/dump 2010-06-23.09:30:15 zfs create -o canmount=noauto rpool/ROOT/zfsBE 2010-06-23.09:30:16 zpool set bootfs=rpool/ROOT/zfsBE rpool 2010-06-23.09:30:16 zfs set mountpoint=/ rpool/ROOT/zfsBE 2010-06-23.09:30:16 zfs set canmount=on rpool 2010-06-23.09:30:16 zfs create -o mountpoint=/export rpool/export 2010-06-23.09:30:17 zfs create rpool/export/home |
可使用 -l 选项显示长格式,包括用户名、主机名和执行操作的区域。例如:
# zpool history -l rpool History for 'tank': 2010-06-24.13:07:58 zpool create tank mirror c2t2d0 c2t5d0 [user root on neo:global] 2010-06-24.13:08:23 zpool scrub tank [user root on neo:global] 2010-06-24.13:38:42 zpool clear tank [user root on neo:global] 2010-06-29.11:44:18 zfs create tank/home [user root on neo:global] 2010-06-29.13:28:51 zpool clear tank c2t5d0 [user root on neo:global] 2010-06-30.14:07:40 zpool add tank spare c2t1d0 [user root on neo:global |
可使用 -i 选项显示内部事件信息,以用于诊断。例如:
# zpool history -i tank History for 'tank': 2010-06-24.13:07:58 zpool create tank mirror c2t2d0 c2t5d0 2010-06-24.13:08:23 [internal pool scrub txg:6] func=1 mintxg=0 maxtxg=6 2010-06-24.13:08:23 [internal pool create txg:6] pool spa 22; zfs spa 22; zpl 4; uts neo 5.10 Generic_142909-13 sun4u 2010-06-24.13:08:23 [internal pool scrub done txg:6] complete=1 2010-06-24.13:08:23 zpool scrub tank 2010-06-24.13:38:42 zpool clear tank 2010-06-24.13:38:42 [internal pool scrub txg:69] func=1 mintxg=3 maxtxg=8 2010-06-24.13:38:42 [internal pool scrub done txg:69] complete=1 2010-06-29.11:44:18 [internal create txg:14241] dataset = 34 2010-06-29.11:44:18 zfs create tank/home 2010-06-29.13:28:51 zpool clear tank c2t5d0 2010-06-30.14:07:40 zpool add tank spare c2t1d0 |
有关使用 zpool history 命令的更多信息,请参见解决 ZFS 问题。
Solaris 10 10/08 发行版:zfs upgrade 命令包括在此发行版中,用于提供对现有文件系统的未来 ZFS 文件系统增强。ZFS 存储池具有类似的升级功能,可为现有存储池提供池增强功能。
例如:
# zfs upgrade This system is currently running ZFS filesystem version 3. All filesystems are formatted with the current version. |
对于已升级的文件系统和通过 zfs send 命令从这些已升级文件系统创建的所有流,无法在运行较早软件发行版的系统上进行访问。
Solaris 10 10/08 发行版:在此发行版中,您可以授予更为细化的权限,以允许非特权用户执行 ZFS 管理任务。
您可以使用 zfs allow 和 zfs unallow 命令来委托和删除权限。
您可以使用池的 delegation 属性修改委托管理功能。例如:
# zpool get delegation users NAME PROPERTY VALUE SOURCE users delegation on default # zpool set delegation=off users # zpool get delegation users NAME PROPERTY VALUE SOURCE users delegation off local |
缺省情况下,delegation 属性处于启用状态。
Solaris 10 10/08 发行版:为了满足同步事务的 POSIX 要求,提供了 ZFS 意图日志 (ZFS intent log, ZIL)。例如,数据库通常要求其事务在从系统调用中返回时应该在稳定的存储设备上。NFS 和其他应用程序也可以使用 fsync() 来确保数据的稳定性。缺省情况下,ZIL 是通过主存储池中的块分配的。在此 Solaris 发行版中,您可以决定是否要继续从主存储池或从单独的日志设备中分配 ZIL 块。通过在 ZFS 存储池中使用单独的意图日志设备(如使用 NVRAM 或专用磁盘)可能会获得更佳的性能。
ZFS 意图日志的日志设备与数据库日志文件无关。
创建存储池时或创建存储池以后,您可以设置 ZFS 日志设备。有关设置日志设备的示例,请参见使用日志设备创建 ZFS 存储池和向存储池中添加设备。
可以将日志设备附加到现有日志设备,以创建镜像日志设备。此操作等同于在未镜像的存储池中附加设备。
确定设置 ZFS 日志设备是否适合您的环境时,请考虑以下几点:
通过实施单独的日志设备获得的任何性能改进均取决于设备类型、池的硬件配置,以及应用程序工作负荷。有关初步性能信息,请参见以下博客:
可以取消复制或取消镜像日志设备,但日志设备不支持 RAID-Z。
如果未镜像单独的日志设备,且包含日志的设备出现故障,则存储日志块将恢复至存储池。
可以将日志设备作为较大存储池的一部分添加、替换、附加、分离,以及导入和导出。从 Solaris 10 9/10 发行版开始,可以移除日志设备。
日志设备的最小大小与池中每个设备的最小大小 (64 MB) 相同。可能存储在日志设备中的相关的数据量相对较小。提交日志事务(系统调用)时将释放日志块。
日志设备的最大大小应大约为物理内存大小的 1/2,因为这是可存储的最大潜在相关的数据量。例如,如果系统的物理内存为 16 GB,请考虑 8 GB 的最大日志设备大小。
Solaris 10 10/08 发行版:您可以在 -zfs create、zfs clone 和 zfs rename 命令中使用 p 选项快速创建不存在的中间数据集(如果尚不存在)。
在以下示例中,ZFS 数据集 (users/area51) 在 datab 存储池中创建。
# zfs list NAME USED AVAIL REFER MOUNTPOINT datab 106K 16.5G 18K /datab # zfs create -p -o compression=on datab/users/area51 |
如果中间数据集在创建操作过程中已经存在,该操作会成功完成。
指定的属性应用到目标数据集,而不是中间数据集。例如:
# zfs get mountpoint,compression datab/users/area51 NAME PROPERTY VALUE SOURCE datab/users/area51 mountpoint /datab/users/area51 default datab/users/area51 compression on local |
中间数据集是使用缺省挂载点创建的。所有其他属性对中间数据集都是禁用的。例如:
# zfs get mountpoint,compression datab/users NAME PROPERTY VALUE SOURCE datab/users mountpoint /datab/users default datab/users compression off default |
有关更多信息,请参见 zfs(1M)。
Solaris 10 10/08 发行版:在此发行版中,ZFS 能够更有效地响应被移除的设备,现在可以自动识别插入的设备。
可以使用等效设备替换现有设备,而不必使用 zpool replace 命令。
autoreplace 属性可控制自动设备替换。如果设置为 off,则必须由管理员使用 zpool replace 命令启动设备替换。如果设置为 on,则会自动对在先前属于池的设备的同一物理位置处找到的任何新设备进行格式化和替换。缺省行为为 off。
如果在系统运行期间设备或热备件被物理移除,则会提供存储池状态 REMOVED。热备用设备(如果有)会替换移除的设备。
如果设备被移除后又重新插入,该设备将联机。如果重新插入设备时热备件处于激活状态,则热备件将在联机操作完成时被移除。
在移除或插入设备时自动检测依赖于硬件,而且并非在所有平台上都受支持。例如,USB 设备会在插入时自动进行配置。但是,您可能必须使用 cfgadm -c configure 命令来配置 SATA 驱动器。
系统会定期检查热备件,以确保它们处于联机状态并可供使用。
有关更多信息,请参见 zpool(1M)。
Solaris 10 10/08 发行版:您可以使用 zfs rename -r 命令以递归方式重命名所有的后代 ZFS 快照。例如:
首先创建一组 ZFS 文件系统的快照。
# zfs snapshot -r users/home@today # zfs list NAME USED AVAIL REFER MOUNTPOINT users 216K 16.5G 20K /users users/home 76K 16.5G 22K /users/home users/home@today 0 - 22K - users/home/markm 18K 16.5G 18K /users/home/markm users/home/markm@today 0 - 18K - users/home/marks 18K 16.5G 18K /users/home/marks users/home/marks@today 0 - 18K - users/home/neil 18K 16.5G 18K /users/home/neil users/home/neil@today 0 - 18K - |
然后在第二天重命名快照。
# zfs rename -r users/home@today @yesterday # zfs list NAME USED AVAIL REFER MOUNTPOINT users 216K 16.5G 20K /users users/home 76K 16.5G 22K /users/home users/home@yesterday 0 - 22K - users/home/markm 18K 16.5G 18K /users/home/markm users/home/markm@yesterday 0 - 18K - users/home/marks 18K 16.5G 18K /users/home/marks users/home/marks@yesterday 0 - 18K - users/home/neil 18K 16.5G 18K /users/home/neil users/home/neil@yesterday 0 - 18K - |
快照是唯一可以递归方式重命名的数据集类型。
有关快照的更多信息,请参见ZFS 快照概述以及介绍如何创建滚动快照的以下博客条目:
http://blogs.sun.com/mmusante/entry/rolling_snapshots_made_easy
Solaris 10 10/08 发行版:在此 Solaris 发行版中,除了 lzjb 压缩以外,还可以对 ZFS 文件系统设置 gzip 压缩。可以将压缩指定为 gzip 或 gzip-N,其中 N 的范围是 1 至 9。例如:
# zfs create -o compression=gzip users/home/snapshots # zfs get compression users/home/snapshots NAME PROPERTY VALUE SOURCE users/home/snapshots compression gzip local # zfs create -o compression=gzip-9 users/home/oldfiles # zfs get compression users/home/oldfiles NAME PROPERTY VALUE SOURCE users/home/oldfiles compression gzip-9 local |
有关设置 ZFS 属性的更多信息,请参见设置 ZFS 属性。
Solaris 10 10/08 发行版:作为一项可靠性功能,ZFS 文件系统元数据将跨不同的磁盘多次自动存储(如有可能)。此功能称为重复块 (ditto blocks)。
在此 Solaris 发行版中,可以使用 zfs set copies 命令指定用户数据的多个副本也按文件系统进行存储。例如:
# zfs set copies=2 users/home # zfs get copies users/home NAME PROPERTY VALUE SOURCE users/home copies 2 local |
可用的值为 1、2 或 3。缺省值为 1。除了任何池级别的冗余以外,这些副本还用于诸如镜像或 RAID-Z 之类的配置中。
存储 ZFS 用户数据的多个副本的优点如下:
通过支持所有 ZFS 配置从不可恢复的块读取故障(例如介质故障(一般称为位损坏))恢复来提高数据保留能力。
提供数据保护,即使只有一个磁盘可用。
允许您在存储池功能之外以每个文件系统为基础选择数据保护策略。
根据存储池中重复块 (ditto blocks) 的分配,可能会将多个副本置于单个磁盘上。某个后续的满载磁盘故障可能会导致所有重复块 (ditto blocks) 都不可用。
无意中创建了非冗余池时以及需要设置数据保留策略时,可能会考虑使用重复块 (ditto blocks)。
有关在具有单磁盘池或多磁盘池的系统上存储多个副本可能对整体数据保护的影响程度的详细说明,请参见以下博客:
http://blogs.sun.com/relling/entry/zfs_copies_and_data_protection
有关设置 ZFS 属性的更多信息,请参见设置 ZFS 属性。
Solaris 10 8/07 发行版:您可以使用 zpool status -v 命令来显示包含持久性错误的文件的列表。以前,必须使用 find -inum 命令从显示的 inode 列表中识别文件名。
有关显示包含持久性错误的文件列表的更多信息,请参见修复损坏的文件或目录。
Solaris 10 8/07 发行版:在此 Solaris 发行版中,可以通过对 ZFS 卷设置 shareiscsi 属性将 ZFS 卷创建为 Solaris iSCSI 目标设备。此方法是快速设置 Solaris iSCSI 目标的便捷途径。例如:
# zfs create -V 2g tank/volumes/v2 # zfs set shareiscsi=on tank/volumes/v2 # iscsitadm list target Target: tank/volumes/v2 iSCSI Name: iqn.1986-03.com.sun:02:984fe301-c412-ccc1-cc80-cf9a72aa062a Connections: 0 |
创建 iSCSI 目标后,可以设置 iSCSI 启动器。有关设置 Solaris iSCSI 启动器的信息,请参见《系统管理指南:设备和文件系统》中的第 15 章 “配置 Solaris iSCSI 启动器(任务)”。
有关将 ZFS 卷作为 iSCSI 目标来管理的更多信息,请参见使用 ZFS 卷作为 Solaris iSCSI 目标。
Solaris 10 8/07 发行版:在此 Solaris 发行版中,ZFS 会自动记录成功修改池状态信息的 zfs 和 zpool 命令。例如:
# zpool history History for 'newpool': 2007-04-25.11:37:31 zpool create newpool mirror c0t8d0 c0t10d0 2007-04-25.11:37:46 zpool replace newpool c0t10d0 c0t9d0 2007-04-25.11:38:04 zpool attach newpool c0t9d0 c0t11d0 2007-04-25.11:38:09 zfs create newpool/user1 2007-04-25.11:38:15 zfs destroy newpool/user1 History for 'tank': 2007-04-25.11:46:28 zpool create tank mirror c1t0d0 c2t0d0 mirror c3t0d0 c4t0d0 |
借助此功能,您或 Oracle 技术支持人员可以准确找出为排除错误情形而执行的 ZFS 命令。
可以使用 zpool history 命令标识特定存储池。例如:
# zpool history newpool History for 'newpool': 2007-04-25.11:37:31 zpool create newpool mirror c0t8d0 c0t10d0 2007-04-25.11:37:46 zpool replace newpool c0t10d0 c0t9d0 2007-04-25.11:38:04 zpool attach newpool c0t9d0 c0t11d0 2007-04-25.11:38:09 zfs create newpool/user1 2007-04-25.11:38:15 zfs destroy newpool/user1 |
在此 Solaris 发行版中,zpool history 命令不记录 user-ID、hostname 或 zone-name。但是,从 Solaris 10 10/08 发行版开始记录此信息。有关更多信息,请参见ZFS 命令历史记录增强 (zpool history)。
有关 ZFS 问题故障排除的更多信息,请参见解决 ZFS 问题。
Solaris 10 8/07 发行版:您可以使用 xattr 属性为特定的 ZFS 文件系统禁用或启用扩展属性。缺省值为 on。有关 ZFS 属性的说明,请参见ZFS 属性介绍。
Solaris 10 8/07 发行版:借助新的 canmount 属性,您可以指定是否可以使用 zfs mount 命令挂载数据集。有关更多信息,请参见canmount 属性。
Solaris 10 8/07 发行版:除了可用来导出内部统计信息或控制 ZFS 文件系统行为的标准本机属性外,ZFS 还支持用户属性。用户属性对 ZFS 行为没有影响,但可通过用户环境中有意义的信息来注释数据集。
有关更多信息,请参见ZFS 用户属性。
Solaris 10 8/07 发行版:在此 Solaris 发行版中,您可以在创建文件系统时设置属性,而不仅仅是在创建文件系统之后。
以下示例演示了等效的语法:
# zfs create tank/home # zfs set mountpoint=/export/zfs tank/home # zfs set sharenfs=on tank/home # zfs set compression=on tank/home |
# zfs create -o mountpoint=/export/zfs -o sharenfs=on -o compression=on tank/home |
Solaris 10 8/07 发行版:在此 Solaris 发行版中,您可以使用各种形式的 zfs get 命令来显示有关所有数据集的信息(如果未指定数据集或指定 all)。在早期发行版中,使用 zfs get 命令无法获取所有数据集信息。
例如:
# zfs get -s local all tank/home atime off local tank/home/bonwick atime off local tank/home/marks quota 50G local |
Solaris 10 8/07 发行版:在此 Solaris 发行版中,您可以在 -zfs receive 命令中使用新的 F 选项,强制文件系统回滚到启动接收之前的最近快照。如果文件系统在回滚发生后、启动接收前发生了修改,则可能需要使用该选项。
有关更多信息,请参见接收 ZFS 快照。
Solaris 10 11/06 发行版:使用 zfs snapshot 命令创建文件系统快照时,可以使用 -r 选项为所有后代文件系统递归创建快照。此外,销毁快照时,可以使用 -r 选项以递归方式销毁所有后代快照。
递归 ZFS 快照可作为一个原子操作快速创建。要么一起创建快照(一次创建所有快照),要么不创建任何快照。这种操作的优点是始终在一个一致的时间捕获快照数据,即使跨后代文件系统也是如此。
有关更多信息,请参见创建和销毁 ZFS 快照。
Solaris 10 11/06 发行版:现在,冗余 RAID-Z 配置可以具有单奇偶校验或双奇偶校验配置,这意味着可以分别承受一个或两个设备故障,而不会丢失任何数据。可以为双奇偶校验 RAID-Z 配置指定 raidz2 关键字。还可以为单奇偶校验 RAID-Z 配置指定 raidz 或 raidz1 关键字。
有关更多信息,请参见创建 RAID-Z 存储池或 zpool(1M)。
Solaris 10 11/06 发行版:借助 ZFS 热备件功能,可以确定可用来替换在一个或多个存储池中发生故障或出现错误的设备的磁盘。指定一个设备作为热备件,意味着如果池中的某一活动设备发生故障,热备件将自动替换该故障设备。或者,也可以用热备件手动替换存储池中的设备。
有关更多信息,请参见在存储池中指定热备件和 zpool(1M)。
Solaris 10 11/06 发行版:借助 zfs promote 命令,可以使用现有 ZFS 文件系统的克隆来替换该文件系统。如果您希望在某个文件系统的替换版本上运行测试,然后将替换版本变为活动的文件系统,则此功能会很有用。
有关更多信息,请参见使用 ZFS 克隆替换 ZFS 文件系统和 zfs(1M)。
Solaris 10 6/06 发行版:通过使用 zpool upgrade 命令,可以将存储池升级到更新的 ZFS 版本,以利用最新功能。此外,zpool status 命令已经修改,可在池运行较早版本的 ZFS 时发出通知。
有关更多信息,请参见升级 ZFS 存储池和 zpool(1M)。
如果要在包含来自先前 Solaris 发行版的池的系统上使用 ZFS 管理控制台,请确保在使用控制台之前先升级池。要确定池是否需要升级,请使用 zpool status 命令。有关 ZFS 管理控制台的信息,请参见基于 Web 的 ZFS 管理。
Solaris 10 6/06 发行版:在此 Solaris 发行版中,zfs backup 和 zfs restore 命令已分别重命名为 zfs send 和 zfs receive,以便更准确地描述其功能。这些命令发送和接收 ZFS 数据流表示。
有关这些命令的更多信息,请参见发送和接收 ZFS 数据。
Solaris 10 6/06 发行版:此发行版中包括 zpool import -D 命令,通过该命令可以恢复以前使用 zpool destroy 命令销毁的池。
有关更多信息,请参见恢复已销毁的 ZFS 存储池。
Solaris 10 6/06 发行版:此发行版包括 ZFS 诊断引擎,该诊断引擎可诊断和报告池故障和设备故障。另外,还可与池或设备的故障关联的校验和 I/O 设备和池错误。
该诊断引擎不包括校验和以及 I/O 错误的预测性分析,也不包括基于故障分析的主动操作。
如果发生 ZFS 故障,您可能会看到类似以下的消息:
SUNW-MSG-ID: ZFS-8000-D3, TYPE: Fault, VER: 1, SEVERITY: Major EVENT-TIME: Wed Jun 30 14:53:39 MDT 2010 PLATFORM: SUNW,Sun-Fire-880, CSN: -, HOSTNAME: neo SOURCE: zfs-diagnosis, REV: 1.0 EVENT-ID: 504a1188-b270-4ab0-af4e-8a77680576b8 DESC: A ZFS device failed. Refer to http://sun.com/msg/ZFS-8000-D3 for more information. AUTO-RESPONSE: No automated response will occur. IMPACT: Fault tolerance of the pool may be compromised. REC-ACTION: Run 'zpool status -x' and replace the bad device. |
通过查看建议的操作(位于 zpool status 命令中的具体指令之后),可快速确定和解决故障问题。
有关从所报告的 ZFS 问题中恢复的示例,请参见解决缺少设备的问题。
Solaris 10 6/06 发行版:此发行版包括 zpool clear 命令,该命令用于清除与设备或池关联的错误计数。以前,错误计数是在使用 zpool online 命令使池中的设备联机时清除的。有关更多信息,请参见清除存储池设备错误 和·zpool(1M)。
Solaris 10 6/06 发行版:在此发行版中,您可以用两种格式设置和显示 NFSv4 ACL:详细和缩写。可以使用 chmod 命令设置任一种 ACL 格式。可以使用 ls - V 命令显示缩写 ACL 格式。可以使用 ls - v 命令显示详细 ACL 格式。
有关更多信息,请参见以缩写格式设置和显示 ZFS 文件的 ACL、chmod(1) 和 ls(1)。
Solaris 10 6/06 发行版:fsstat 是一个新的文件系统监视工具,可用于报告文件系统操作。可按挂载点或文件系统类型来报告活动。以下示例显示常规的 ZFS 文件系统活动:
$ fsstat zfs new name name attr attr lookup rddir read read write write file remov chng get set ops ops ops bytes ops bytes 7.82M 5.92M 2.76M 1.02G 3.32M 5.60G 87.0M 363M 1.86T 20.9M 251G zfs |
有关更多信息,请参见 fsstat(1M)。
Solaris 10 6/06 发行版:ZFS 管理控制台是一个基于 Web 的 ZFS 管理工具,允许您执行以下管理任务:
创建新存储池。
为现有池添加功能。
将存储池移动(导出)到另一个系统。
导入以前导出的存储池,使其可在另一个系统中使用。
查看有关存储池的信息。
创建文件系统。
创建卷。
创建文件系统或卷的快照。
将文件系统回滚到以前的快照。
通过安全 Web 浏览器访问以下网址,可以访问 ZFS 管理控制台:
https://system-name:6789/zfs |
如果键入了适当的 URL 但无法访问 ZFS 管理控制台,则表明可能未启动服务器。要启动服务器,请运行以下命令:
# /usr/sbin/smcwebserver start |
如果希望服务器在系统引导时自动启动,请运行以下命令:
# /usr/sbin/smcwebserver enable |
不能使用 Solaris Management Console (smc) 管理 ZFS 存储池或文件系统。
ZFS 文件系统是一种革新性的新文件系统,可从根本上改变文件系统的管理方式,并具有目前面市的其他任何文件系统所没有的功能和优点。ZFS 强健可靠、可伸缩、易于管理。
ZFS 使用存储池的概念来管理物理存储。以前,文件系统是在单个物理设备的基础上构造的。为了利用多个设备和提供数据冗余性,引入了卷管理器的概念来提供单个设备的表示,以便无需修改文件系统即可利用多个设备。此设计增加了更多复杂性,并最终阻碍了特定文件系统的继续发展,因为这类文件系统无法控制数据在虚拟卷上的物理放置。
ZFS 可完全避免使用卷管理。ZFS 将设备聚集到存储池中,而不是强制要求创建虚拟卷。存储池说明了存储的物理特征(设备布局、数据冗余等),并充当可以从其创建文件系统的任意数据存储库。文件系统不再仅限于单个设备,从而可与池中的所有文件系统共享磁盘空间。您不再需要预先确定文件系统的大小,因为文件系统会在分配给存储池的磁盘空间内自动增长。添加新存储器后,无需执行其他操作,池中的所有文件系统即可立即使用所增加的磁盘空间。在许多方面,存储池与虚拟内存系统相似:将一个内存 DIMM 加入系统时,操作系统并不强迫您运行命令来配置内存并将其分配给个别进程。系统中的所有进程都会自动使用所增加的内存。
ZFS 是事务性文件系统,这意味着文件系统状态在磁盘上始终是一致的。传统文件系统可就地覆写数据,这意味着如果系统断电(例如,在分配数据块到将其链接到目录中的时间段内断电),则会使文件系统处于不一致状态。以前,此问题是通过使用 fsck 命令解决的。此命令负责检查并验证文件系统状态,并尝试在操作过程中修复任何不一致性。这种文件系统不一致问题曾给管理员造成巨大困扰,fsck 命令并不保证能够解决所有可能的问题。最近,文件系统引入了日志记录的概念。日志记录过程在单独的日志中记录操作,在系统发生崩溃时,可以安全地重放该日志。由于数据需要写入两次,因此该过程会引入不必要的开销,而且通常会导致一组新问题,例如在无法正确地重放日志时。
对于事务性文件系统,数据是使用写复制语义管理的。数据永远不会被覆写,并且任何操作序列会全部被提交或全部被忽略。因此,文件系统绝对不会因意外断电或系统崩溃而被损坏。尽管最近写入的数据片段可能丢失,但是文件系统本身将始终是一致的。此外,只有在写入同步数据(使用 O_DSYNC 标志写入)后才返回,因此同步数据决不会丢失。
对于 ZFS,所有数据和元数据都通过用户可选择的校验和算法进行验证。提供校验和验证的传统文件系统出于卷管理层和传统文件系统设计的必要,会逐块执行此操作。在传统设计中,某些故障可能导致数据不正确但没有校验和错误,如向错误位置写入完整的块等。ZFS 校验和的存储方式可确保检测到这些故障并可以正常地从其中进行恢复。所有校验和验证与数据恢复都是在文件系统层 执行的,并且对应用程序是透明的。
此外,ZFS 还会提供自我修复数据。ZFS 支持存储池具有各种级别的数据冗余性。检测到坏的数据块时,ZFS 会从另一个冗余副本中提取正确的数据,而且会用正确的数据替换错误的数据。
ZFS 文件系统的一个关键设计要素是可伸缩性。该文件系统本身是 128 位的,所允许的存储空间是 256 quadrillion zettabyte (256x1015 ZB)。所有元数据都是动态分配的,因此在首次创建时无需预先分配 inode,否则就会限制文件系统的可伸缩性。所有算法在编写时都考虑到了可伸缩性。目录最多可以包含 248(256 万亿)项,并且对于文件系统数或文件系统中可以包含的文件数不存在限制。
快照是文件系统或卷的只读副本。可以快速而轻松地创建快照。最初,快照不会占用池中的任何附加磁盘空间。
活动数据集中的数据更改时,快照通过继续引用旧数据来占用磁盘空间。因此,快照可防止将数据释放回池中。
最重要的是,ZFS 提供了一种极度简化的管理模型。通过使用分层文件系统布局、属性继承以及自动管理挂载点和 NFS 共享语义,ZFS 可轻松创建和管理文件系统,而无需使用多个命令或编辑配置文件。可以轻松设置配额或预留空间,启用或禁用压缩,或者通过单个命令管理许多文件系统的挂载点。您就可以检查或替换设备,而无需学习另外的一套卷管理命令。您可以发送和接收文件系统快照流
ZFS 通过分层结构管理文件系统,该分层结构允许对属性(如配额、预留空间、压缩和挂载点)进行这一简化管理。在此模型中,文件系统是中央控制点。文件系统本身的开销非常小(相当于创建一个新目录),因此鼓励您为每个用户、项目、工作区等创建一个文件系统。通过此设计,可定义细分的管理点。
本节介绍了在本书中使用的基本术语:
通过 lucreate 命令创建且可能通过 luupgrade 命令更新的引导环境,但它不是活动环境或主引导环境。通过运行 luactivate 命令,可以使备用引导环境成为主引导环境。
文件系统块中数据的 256 位散列。校验和功能的范围可以从简单快速的 fletcher4(缺省值)到强加密散列(如 SHA256)。
其初始内容与快照内容相同的文件系统。
有关克隆的信息,请参见ZFS 克隆概述。
以下 ZFS 组件的通用名称: 克隆、文件系统、快照和卷。
每个数据集由 ZFS 名称空间中的唯一名称标识。数据集使用以下格式进行标识:
pool/path[ @snapshot]
标识包含数据集的存储池的名称
数据集组件的斜杠分隔路径名
用于标识数据集快照的可选组件
有关数据集的更多信息,请参见第 6 章。
挂载在标准系统名称空间中且行为与其他文件系统相似的 filesystem 类型的 ZFS 数据集。
有关文件系统的更多信息,请参见第 6 章。
在两个或更多磁盘上存储相同数据副本的虚拟设备。如果镜像中的任一磁盘出现故障,则该镜像中的其他任何磁盘都可以提供相同的数据。
设备的逻辑组,用于说明可用存储的布局和物理特征。数据集的磁盘空间是从池中分配的。
有关存储池的更多信息,请参见第 4 章。
lucreate 命令生成备用引导环境所用的引导环境。缺省情况下,主引导环境是当前引导环境。可以使用 lucreate -s 选项覆盖此缺省设置。
在多个磁盘上存储数据和奇偶校验的虚拟设备。有关 RAID-Z 的更多信息,请参见RAID-Z 存储池配置。
将数据从一个设备复制到另一个设备的过程称为重新同步。例如,如果替换了镜像设备或使其脱机,则最新镜像设备中的数据会复制到刚恢复的镜像设备。此过程在传统的卷管理产品中称为镜像重新同步。
有关 ZFS 重新同步的更多信息,请参见查看重新同步状态。
文件系统或卷在给定时间点的只读副本。
有关快照的更多信息,请参见ZFS 快照概述。
池中的逻辑设备,可以是物理设备、文件或设备集合。
有关虚拟设备的更多信息,请参见显示存储池虚拟设备信息。
表示块设备的数据集。例如,可以创建 ZFS 卷作为交换设备。
有关 ZFS 卷的更多信息,请参见ZFS 卷。
每个 ZFS 组件(如数据集和池等)必须根据以下规则进行命名:
每个组件只能包含字母数字字符以及以下四个特殊字符:
下划线 (_)
连字符 (-)
冒号 (:)
句点 (.)
池名称必须以字母开头,但以下限制除外:
不允许使用起始序列 c[0-9]。
名称 log 为保留名称。
不允许使用以 mirror、raidz、raidz1、raidz2、raidz3 或 spare 开头的名称,因为这些名称是保留名称。
数据集名称不得包含百分比符号 (%)。
数据集名称必须以字母数字字符开头。
数据集名称不得包含百分比符号 (%)。
此外,不允许使用空组件。