跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 管理:ZFS 文件系统 Oracle Solaris 11 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
3. Oracle Solaris ZFS 与传统文件系统之间的差别
7. 使用 Oracle Solaris ZFS 快照和克隆
8. 使用 ACL 和属性保护 Oracle Solaris ZFS 文件
以下各节介绍创建和销毁 ZFS 存储池的不同情况:
可以快速轻松地创建和销毁池。但是,执行这些操作务必谨慎。虽然进行了检查,以防止在新的池中使用现已使用的设备,但是 ZFS 无法始终知道设备何时已在使用中。存储池销毁容易创建难。请谨慎使用 zpool destroy。这个简单的命令会产生严重的后果。
要创建存储池,请使用 zpool create 命令。此命令采用池名称和任意数目的虚拟设备作为参数。池名称必须符合ZFS 组件命名要求中的命名要求。
以下命令创建了一个名为 tank 的新池,该池由磁盘 c1t0d0 和 c1t1d0 组成:
# zpool create tank c1t0d0 c1t1d0
代表整个磁盘的设备名称可在 /dev/dsk 目录中找到,并正确使用 ZFS 作为标签以包含单个大分片。数据通过这两个磁盘以动态方式进行条带化。
要创建镜像池,请使用 mirror 关键字,后跟将组成镜像的任意数目的存储设备。可以通过在命令行中重复使用 mirror 关键字指定多个镜像。以下命令创建了一个包含两个双向镜像的池:
# zpool create tank mirror c1d0 c2d0 mirror c3d0 c4d0
第二个 mirror 关键字表示将指定新的顶层虚拟设备。数据通过这两个镜像以动态方式进行条带化,并会相应地在每个磁盘之间创建冗余数据。
有关建议的镜像配置的更多信息,请参见第 13 章。
目前,ZFS 镜像配置中支持以下操作:
向现有镜像配置中添加用于其他顶层虚拟设备 (vdev) 的另一组磁盘。有关更多信息,请参见向存储池中添加设备。
向现有镜像配置中附加其他磁盘。或者,向非复制配置中附加其他磁盘,以创建镜像配置。有关更多信息,请参见附加和分离存储池中的设备。
只要替换磁盘的大小大于或等于要被替换的设备,便可替换现有镜像配置中的一个或多个磁盘。有关更多信息,请参见替换存储池中的设备。
只要剩余设备可为配置提供足够冗余,便可分离镜像配置中的磁盘。有关更多信息,请参见附加和分离存储池中的设备。
通过分离其中一个磁盘来分割镜像配置,以创建新的相同池。有关更多信息,请参见通过分割镜像 ZFS 存储池创建新池。
不能直接从镜像存储池中移除非备用设备、非日志设备或非缓存设备。
请考虑以下根池配置要求:
用于根池的磁盘必须有 VTOC (SMI) 标签,并且必须使用磁盘分片创建池。
根池必须作为镜像配置或单磁盘配置创建。不能使用 zpool add 命令添加其他磁盘以创建多个镜像顶层虚拟设备,但可以使用 zpool attach 命令扩展镜像虚拟设备。
不支持 RAID-Z 或条带化配置。
根池不能有单独的日志设备。
如果您尝试使用不受支持的根池配置,将会看到类似如下的消息:
ERROR: ZFS pool <pool-name> does not support boot environments
# zpool add -f rpool log c0t6d0s0 cannot add to 'rpool': root pool can not have multiple vdevs or separate logs
有关安装和引导 ZFS 根文件系统的更多信息,请参见第 5 章。
创建单奇偶校验 RAID-Z 池与创建镜像池基本相同,不同之处是使用 raidz 或 raidz1 关键字而不是 mirror。以下示例说明如何创建一个包含由 5 个磁盘组成的单个 RAID-Z 设备的池:
# zpool create tank raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 /dev/dsk/c5t0d0
本例说明可以通过设备的缩写名称或全名指定磁盘。/dev/dsk/c5t0d0 和 c5t0d0 指代同一个磁盘。
创建池时,使用 raidz2 或 raidz3 关键字可以创建双奇偶校验或三奇偶校验 RAID-Z 配置。例如,
# zpool create tank raidz2 c1t0d0 c2t0d0 c3t0d0 c4t0d0 c5t0d0 # zpool status -v tank pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz2-0 ONLINE 0 0 0 c1t0d0 ONLINE 0 0 0 c2t0d0 ONLINE 0 0 0 c3t0d0 ONLINE 0 0 0 c4t0d0 ONLINE 0 0 0 c5t0d0 ONLINE 0 0 0 errors: No known data errors
# zpool create tank raidz3 c0t0d0 c1t0d0 c2t0d0 c3t0d0 c4t0d0 c5t0d0 c6t0d0 c7t0d0 c8t0d0 # zpool status -v tank pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz3-0 ONLINE 0 0 0 c0t0d0 ONLINE 0 0 0 c1t0d0 ONLINE 0 0 0 c2t0d0 ONLINE 0 0 0 c3t0d0 ONLINE 0 0 0 c4t0d0 ONLINE 0 0 0 c5t0d0 ONLINE 0 0 0 c6t0d0 ONLINE 0 0 0 c7t0d0 ONLINE 0 0 0 c8t0d0 ONLINE 0 0 0 errors: No known data errors
目前,ZFS RAID-Z 配置中支持以下操作:
向现有 RAID-Z 配置中添加用于其他顶层虚拟设备的另一组磁盘。有关更多信息,请参见向存储池中添加设备。
只要 RAID-Z 磁盘的大小大于或等于要被替换的设备,便可替换现有镜像配置中的一个或多个磁盘。有关更多信息,请参见替换存储池中的设备。
目前,RAID-Z 配置中不支持以下操作:
向现有 RAID-Z 配置中附加其他磁盘。
从 RAID-Z 配置中分离磁盘(分离由备用磁盘替换的磁盘或需要分离备用磁盘时除外)。
不能直接从 RAID-Z 配置中移除非日志或缓存设备。对于此功能,已经申请了 RFE(请求提高)。
有关 RAID-Z 配置的更多信息,请参见RAID-Z 存储池配置。
为了满足对同步事务的 POSIX 要求,提供了 ZFS 意图日志 (ZFS intent log, ZIL)。例如,数据库通常要求其事务在从系统调用中返回时应该在稳定的存储设备上。NFS 和其他应用程序还可以使用 fsync() 来确保数据稳定性。
缺省情况下,ZIL 是通过主池中的块分配的。但是,通过使用单独的意图日志设备(如使用 NVRAM 或专用磁盘)可能会获得更佳的性能。
确定设置 ZFS 日志设备是否适合您的环境时,请考虑以下几点:
ZFS 意图日志的日志设备与数据库日志文件无关。
通过实施单独的日志设备获得的任何性能改进均取决于设备类型、池的硬件配置,以及应用程序工作负荷。有关初步性能信息,请参见以下博客:
http://blogs.oracle.com/perrin/entry/slog_blog_or_blogging_on
可以取消复制或取消镜像日志设备,但日志设备不支持 RAID-Z。
如果未镜像单独的日志设备,且包含日志的设备出现故障,则存储日志块将恢复至存储池。
可以将日志设备作为较大存储池的一部分进行添加、替换、移除、附加、分离,以及导入和导出。
可以将日志设备附加到现有日志设备,以创建镜像日志设备。此操作等同于在未镜像的存储池中附加设备。
日志设备的最小大小与池中每个设备的最小大小 (64 MB) 相同。可能存储在日志设备中的相关的数据量相对较小。提交日志事务(系统调用)时将释放日志块。
日志设备的最大大小应大约为物理内存大小的 1/2,因为这是可存储的最大潜在相关的数据量。例如,如果系统的物理内存为 16 GB,请考虑 8 GB 的最大日志设备大小。
创建存储池时或创建存储池以后,您可以设置 ZFS 日志设备。
以下示例显示如何使用镜像日志设备创建镜像存储池:
# zpool create datap mirror c1t1d0 c1t2d0 mirror c1t3d0 c1t4d0 log mirror c1t5d0 c1t8d0 # zpool status datap pool: datap state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM datap ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c1t1d0 ONLINE 0 0 0 c1t2d0 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 c1t3d0 ONLINE 0 0 0 c1t4d0 ONLINE 0 0 0 logs mirror-2 ONLINE 0 0 0 c1t5d0 ONLINE 0 0 0 c1t8d0 ONLINE 0 0 0 errors: No known data errors
有关从日志设备故障中进行恢复的信息,请参见示例 11-2。
高速缓存设备在主内存和磁盘之间提供了一个进行高速缓存的附加层。使用高速缓存设备,可以最大程度地提高大多数静态内容的随机读取工作的性能。
您可以使用高速缓存设备创建一个存储池,来缓存存储池数据。例如:
# zpool create tank mirror c2t0d0 c2t1d0 c2t3d0 cache c2t5d0 c2t8d0 # zpool status tank pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c2t0d0 ONLINE 0 0 0 c2t1d0 ONLINE 0 0 0 c2t3d0 ONLINE 0 0 0 cache c2t5d0 ONLINE 0 0 0 c2t8d0 ONLINE 0 0 0 errors: No known data errors
添加高速缓存设备之后,这些设备中将逐渐填充来自主内存的内容。填充设备可能需要一个小时以上的时间,具体取决于高速缓存设备的大小。可以通过按以下方式使用 zpool iostat 命令来监视容量和读取操作:
# zpool iostat -v pool 5
创建池后,可以在池中添加高速缓存设备或从池中删除高速缓存设备。
确定是否使用高速缓存设备创建 ZFS 存储池时,请考虑以下几点:
使用高速缓存设备,可以最大程度地提高大多数静态内容的随机读取工作的性能。
可以使用 zpool iostat 命令监视容量和读取操作。
创建池时,可以添加一个或多个高速缓存设备。也可以在创建池后添加或删除高速缓存设备。有关更多信息,请参见示例 4-4。
高速缓存设备不能镜像或成为 RAID-Z 配置的一部分。
如果高速缓存设备发生读取错误,则会向原始存储池设备(它可能是镜像配置或 RAID-Z 配置的一部分)重新发出读取 I/O。高速缓存设备的内容是易失性的,与其他系统高速缓存类似。
创建和管理 ZFS 存储池时,请注意以下事项。
请勿对属于现有存储池一部分的磁盘重新分区或重新设置标签。如果尝试对根池磁盘重新分区或重新设置标签,可能需要重新安装 OS。
创建存储池时,请勿包含来自其他存储池的组件(如文件或卷)。这种配置不受支持,且会发生死锁。
使用单个分片或单个磁盘创建的池没有冗余,会面临丢失数据的风险。使用多个分片创建的池如果没有冗余,也会面临丢失数据的风险。使用磁盘中多个分片创建的池比使用整个磁盘创建的池难以管理。
未使用 ZFS 冗余(RAIDZ 或镜像)创建的池只能报告数据不一致性,无法修复数据不一致性。
虽然使用 ZFS 冗余创建池有助于减少因硬件故障而导致的停机时间,但是这样的池仍不可避免地会受硬件故障、电源故障或电缆断开的影响。请确保定期备份您的数据。对非企业级硬件上的池数据定期执行备份很重要。
池不能在系统之间共享。ZFS 不是群集文件系统。
每个存储池都包含一个或多个虚拟设备。虚拟设备是存储池的内部表示形式,用于描述物理存储器的布局以及存储池的故障特征。因此,虚拟设备表示用于创建存储池的磁盘设备或文件。一个池可以在配置的顶层具有任意数目的虚拟设备,称为顶层 vdev。
如果顶层虚拟设备包含两个或更多物理设备,配置将以镜像或 RAID-Z 虚拟设备的形式提供数据冗余。这些虚拟设备由磁盘、磁盘分片或文件构成。备件是一种特殊虚拟设备,用于跟踪一个池的可用热备件。
以下示例说明如何创建一个包含两个顶层虚拟设备(各虚拟设备是由两个磁盘组成的镜像)的池:
# zpool create tank mirror c1d0 c2d0 mirror c3d0 c4d0
以下示例说明如何创建包含一个顶层虚拟设备(由 4 个磁盘组成)的池。
# zpool create mypool raidz2 c1d0 c2d0 c3d0 c4d0
可以使用 zpool add 命令将另一个顶层虚拟设备添加到此池中。例如:
# zpool add mypool raidz2 c2d1 c3d1 c4d1 c5d1
非冗余池中使用的磁盘、磁盘分片或文件可用作顶层虚拟设备。存储池通常由多个顶层虚拟设备构成。ZFS 将在池内的所有顶层虚拟设备中以动态方式对数据进行条带化。
可使用 zpool status 命令显示 ZFS 存储池中包含的虚拟设备和物理设备。例如:
# zpool status tank pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c0t1d0 ONLINE 0 0 0 c1t1d0 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 c0t2d0 ONLINE 0 0 0 c1t2d0 ONLINE 0 0 0 mirror-2 ONLINE 0 0 0 c0t3d0 ONLINE 0 0 0 c1t3d0 ONLINE 0 0 0 errors: No known data errors
出现池创建错误可以有许多原因。其中一些原因是显而易见的(如指定的设备不存在),而其他原因则不太明显。
格式化设备之前,ZFS 会首先确定 ZFS 或操作系统的某个其他部分是否正在使用磁盘。如果磁盘正在使用,则可能会显示类似以下的错误:
# zpool create tank c1t0d0 c1t1d0 invalid vdev specification use '-f' to override the following errors: /dev/dsk/c1t0d0s0 is currently mounted on /. Please see umount(1M). /dev/dsk/c1t0d0s1 is currently mounted on swap. Please see swap(1M). /dev/dsk/c1t1d0s0 is part of active ZFS pool zeepool. Please see zpool(1M).
使用 -f 选项可以覆盖其中的一些错误,但是无法覆盖大多数错误。使用 -f 选项无法覆盖下列条件,必须手动对这些错误进行更正:
磁盘或其中一分片包含当前挂载的文件系统。要更正此错误,请使用 umount 命令。
磁盘包含 /etc/vfstab 文件中列出的文件系统,但当前未挂载该文件系统。要更正此错误,请删除或注释掉 /etc/vfstab 文件中的相应行。
正在将磁盘用作系统的专用转储设备。要更正此错误,请使用 dumpadm 命令。
磁盘或文件是活动 ZFS 存储池的一部分。要更正此错误,请使用 zpool destroy 命令来销毁其他池(如果不再需要)。或者,使用 zpool detach 命令将磁盘与其他池分离。您只能将磁盘从镜像存储池中分离。
以下使用情况检查用作帮助性警告,并可以使用 -f 选项进行覆盖以创建池:
磁盘包含已知的文件系统,尽管该系统未挂载并且看起来未被使用。
磁盘是 Solaris Volume Manager 卷的一部分。
磁盘是已导出的或者从系统中手动删除的存储池的一部分。如果是后一种情况,则会将池的状态报告为可能处于活动状态,因为磁盘可能是也可能不是由其他系统使用的网络连接驱动器。覆盖可能处于活动状态的池时请务必谨慎。
以下示例说明如何使用 -f 选项:
# zpool create tank c1t0d0 invalid vdev specification use '-f' to override the following errors: /dev/dsk/c1t0d0s0 contains a ufs filesystem. # zpool create -f tank c1t0d0
理想情况是更正错误,而不是使用 -f 选项覆盖错误。
建议不要创建包含不同复制级别的虚拟设备的池。zpool 命令可尝试防止意外创建冗余级别不匹配的池。如果尝试创建具有这样配置的池,则会显示类似以下的错误:
# zpool create tank c1t0d0 mirror c2t0d0 c3t0d0 invalid vdev specification use '-f' to override the following errors: mismatched replication level: both disk and mirror vdevs are present # zpool create tank mirror c1t0d0 c2t0d0 mirror c3t0d0 c4t0d0 c5t0d0 invalid vdev specification use '-f' to override the following errors: mismatched replication level: 2-way mirror and 3-way mirror vdevs are present
可以使用 -f 选项覆盖这些错误,但应避免这种做法。此命令还会发出警告,指明正使用大小不同的设备创建镜像池或 RAID-Z 池。虽然允许这种配置,但冗余结果的不匹配程度会导致较大设备上出现未使用磁盘空间。要求使用 -f 选项覆盖警告。
尝试创建池可能会以多种方式意外失败,格式化磁盘是一种潜在有害的操作。因此,zpool create 命令提供了一个额外选项 -n,它模拟创建池,但不真正写入设备。此预运行选项执行设备使用中检查和复制级别验证,并报告该过程中出现的任何错误。如果未找到错误,则会显示类似以下的输出:
# zpool create -n tank mirror c1t0d0 c1t1d0 would create 'tank' with the following layout: tank mirror c1t0d0 c1t1d0
如果不实际创建池,则无法检测到某些错误。最常见的示例是在同一配置中两次指定同一设备。不真正写入数据将无法可靠地检测此错误,因此 zpool create -n 命令可以报告操作成功,但不会创建池。
创建池时,顶层文件系统的缺省挂载点是 /pool-name。此目录必须不存在或者为空。如果目录不存在,则会自动创建该目录。如果该目录为空,则根文件系统会挂载在现有目录的顶层。要使用不同的缺省挂载点创建池,请在 -zpool create 命令中使用 m 选项。例如,
# zpool create home c1t0d0 default mountpoint '/home' exists and is not empty use '-m' option to provide a different default # zpool create -m /export/zfs home c1t0d0
此命令会创建新池 home 和挂载点为 /export/zfs 的 home 文件系统。
有关挂载点的更多信息,请参见管理 ZFS 挂载点。
池是通过使用 zpool destroy 命令进行销毁的。此命令会销毁池,即使池中包含挂载的数据集也是如此。
# zpool destroy tank
如果使用 zpool destroy 命令销毁池,该池仍可用于导入,如恢复已销毁的 ZFS 存储池中所述。这意味着属于该池的磁盘上的机密数据可能仍可用。如果希望将已销毁池的磁盘上的数据销毁,必须对已销毁池中的每个磁盘使用类似于 format 实用程序的 analyze->purge 选项的功能。
使文件系统数据保密的另一种方法是创建加密的 ZFS 文件系统。采用加密文件系统的池被销毁后,即使恢复了已销毁的池,在没有加密密钥的情况下也无法访问其中的数据。有关更多信息,请参见加密 ZFS 文件系统。
销毁池这一操作要求将数据写入磁盘,以指示池不再有效。此状态信息可防止执行导入操作时这些设备作为潜在的池显示出来。在一个或多个设备不可用的情况下,仍可以销毁池。但是,必需的状态信息将不会写入这些不可用的设备。
经过适当修复后,当您创建新池时,这些设备被报告为潜在活动设备。当您搜索池以便导入时,这些设备显示为有效设备。如果池中包含足够多的故障设备以致于池本身出现故障(意味着顶层虚拟设备出现故障),则此命令将列显一条警告,并且在不使用 -f 选项的情况下无法完成。此选项是必需的,因为无法打开池,以致无法知道数据是否存储在池中。例如:
# zpool destroy tank cannot destroy 'tank': pool is faulted use '-f' to force destruction anyway # zpool destroy -f tank
有关池和设备的运行状况的更多信息,请参见确定 ZFS 存储池的运行状况。
有关导入池的更多信息,请参见导入 ZFS 存储池。