跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris ZFS 管理指南 Oracle Solaris 10 8/11 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
3. Oracle Solaris ZFS 与传统文件系统之间的差别
5. 安装和引导 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 关键字表示将指定新的顶层虚拟设备。数据通过这两个镜像以动态方式进行条带化,并会相应地在每个磁盘之间创建冗余数据。
有关建议的镜像配置的更多信息,请参见以下站点:
http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide
目前,ZFS 镜像配置中支持以下操作:
向现有镜像配置中添加用于其他顶层虚拟设备 (vdev) 的另一组磁盘。有关更多信息,请参见向存储池中添加设备。
向现有镜像配置中附加其他磁盘。或者,向非复制配置中附加其他磁盘,以创建镜像配置。有关更多信息,请参见附加和分离存储池中的设备。
只要替换磁盘的大小大于或等于要被替换的设备,便可替换现有镜像配置中的一个或多个磁盘。有关更多信息,请参见替换存储池中的设备。
只要剩余设备可为配置提供足够冗余,便可分离镜像配置中的磁盘。有关更多信息,请参见附加和分离存储池中的设备。
通过分离其中一个磁盘来分割镜像配置,以创建新的相同池。有关更多信息,请参见通过分割镜像 ZFS 存储池创建新池。
不能直接从镜像存储池中移除非日志或缓存设备。对于此功能,已经申请了 RFE(请求提高)。
您可以从 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 # 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 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 存储池配置。
缺省情况下,ZIL 是通过主池中的块分配的。但是,通过使用单独的意图日志设备(如使用 NVRAM 或专用磁盘)可能会获得更佳的性能。有关 ZFS 日志设备的更多信息,请参见设置单独的 ZFS 日志设备。
创建存储池时或创建存储池以后,您可以设置 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
确定是否使用高速缓存设备创建 ZFS 存储池时,请考虑以下几点:
使用高速缓存设备,可以最大程度地提高大多数静态内容的随机读取工作的性能。
可以使用 zpool iostat 命令监视容量和读取操作。
创建池时,可以添加一个或多个高速缓存设备。也可以在创建池后添加或删除高速缓存设备。有关更多信息,请参见示例 4-4。
高速缓存设备不能镜像或成为 RAID-Z 配置的一部分。
如果高速缓存设备发生读取错误,则会向原始存储池设备(它可能是镜像配置或 RAID-Z 配置的一部分)重新发出读取 I/O。高速缓存设备的内容是易失性的,与其他系统高速缓存类似。
每个存储池都包含一个或多个虚拟设备。虚拟设备是存储池的内部表示形式,用于说明物理存储器的布局以及存储池的故障特征。因此,虚拟设备表示用于创建存储池的磁盘设备或文件。一个池可以在配置的顶层具有任意数目的虚拟设备,称为顶层 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 卷的一部分。
正在将磁盘用作 Oracle Solaris Live Upgrade 的替换引导环境。
磁盘是已导出的或者从系统中手动删除的存储池的一部分。如果是后一种情况,则会将池的状态报告为可能处于活动状态,因为磁盘可能是也可能不是由其他系统使用的网络连接驱动器。覆盖可能处于活动状态的池时请务必谨慎。
以下示例说明如何使用 -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
销毁池这一操作要求将数据写入磁盘,以指示池不再有效。此状态信息可防止执行导入操作时这些设备作为潜在的池显示出来。在一个或多个设备不可用的情况下,仍可以销毁池。但是,必需的状态信息将不会写入这些不可用的设备。
经过适当修复后,当您创建新池时,这些设备被报告为潜在活动设备。当您搜索池以便导入时,这些设备显示为有效设备。如果池中包含足够多的故障设备以致于池本身出现故障(意味着顶层虚拟设备出现故障),则此命令将列显一条警告,并且在不使用 -f 选项的情况下无法完成。此选项是必需的,因为无法打开池,以致无法知道数据是否存储在池中。例如:
# zpool destroy tank cannot destroy 'tank': pool is faulted use '-f' to force destruction anyway # zpool destroy -f tank
有关池和设备的运行状况的更多信息,请参见确定 ZFS 存储池的运行状况。
有关导入池的更多信息,请参见导入 ZFS 存储池。