出现池创建错误可以有许多原因。其中一些原因是显而易见的(如指定的设备不存在),而其他原因则不太明显。
格式化设备之前,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 挂载点。