试运行创建存储池
zpool create -n可以模拟创建而不实际写入设备。正常情况下应该有类似以下的输出:
$ zpool create -n system1 mirror c1t0d0 c1t1d0
would create 'system1' with the following layout:
system1
mirror
c1t0d0
c1t1d0
注意:某些错误在不实际创建池的情况下可能无法检测到,因此,即使试运行成功,实际创建池也有可能失败
创建镜像存储池
使用关键字mirror创建镜像池。
如果要创建多个镜像,在命令行中重复使用mirror即可,下面例子创建一个池system1,包含两个顶级虚拟设备:
$ zpool create system1 mirror c1d0 c2d0 mirror c3d0 c4d0
两个虚拟设备都是双向镜像。数据在两个镜像之间动态条带化,数据在每个磁盘之间适当地冗余。
可以对ZFS镜像做如下操作:
- add 添加另一个具有不同磁盘集的顶级虚拟设备
- attach 附加另外的磁盘
- replace 更换磁盘
- detach 分离磁盘
- split 拆分镜像配置以创建新的相同池
创建RAID-Z存储池
$ zpool create rdpool raidz3 c0t0d0 c1t0d0 c2t0d0 c3t0d0 c4t0d0 \
c5t0d0 c6t0d0 c7t0d0 c8t0d0
可以对ZFS RAID-Z进行以下操作:
- add 添加另一个具有不同磁盘集的顶级虚拟设备
- replace 更换磁盘
不可以进行以下操作:
- attach 附加另外的磁盘
- detach 分离磁盘,除非用备用磁盘替换它或需要分离备用的磁盘
- remove 删除不是日志设备或缓存设备的设备
创建带有日志设备的ZFS存储池
ZIL——ZFS intent log,满足同步事物的POSIX要求。
默认情况下,ZIL是从主池中的块分配的。但可以通过使用单独的设备(例如NVRAM或专用磁盘)来获得更好的性能。
ZIL的日志设备与数据库日志文件无关。部署单独的日志设备可以提高性能,但取决于设备类型、池的硬件配置和应用程序工作负载。
只能为镜像池创建镜像日志设备。
需考虑以下方面:
- 日志设备的最小容量与池中每个设备的最小容量相同,均为64MB。
- 日志设备的最大容量应该大约是物理内存大小的一半,这是可以存储的潜在记录数据的最大数量。
以下示例显示如何使用log关键字配置名为datap的镜像存储池:
$ zpool create datap mirror c0t5000C500335F95E3d0 c0t5000C500335F907Fd0 \
mirror c0t5000C500335BD117d0 c0t5000C500335DC60Fd0 \
log mirror c0t5000C500335E106Bd0 c0t5000C500335FC3E7d0
$ 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
c0t5000C500335F95E3d0 ONLINE 0 0 0
c0t5000C500335F907Fd0 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
c0t5000C500335BD117d0 ONLINE 0 0 0
c0t5000C500335DC60Fd0 ONLINE 0 0 0
logs
mirror-2 ONLINE 0 0 0
c0t5000C500335E106Bd0 ONLINE 0 0 0
c0t5000C500335FC3E7d0 ONLINE 0 0 0
errors: No known data errors
以下是在现有的镜像中添加日志的例子:
$ zpool add newpool log mirror c0t6d0 c0t7d0
$ zpool status newpool
pool: newpool
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
newpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c0t4d0 ONLINE 0 0 0
c0t5d0 ONLINE 0 0 0
logs Added mirrored log device.
mirror-1 ONLINE 0 0 0
c0t6d0 ONLINE 0 0 0
c0t7d0 ONLINE 0 0 0
errors: No known data errors
创建带有缓存设备的ZFS存储池
缓存设备在主内存和磁盘之间提供了一个额外的缓存层。有助于提高静态内容随机读取的性能。
以下示例显示如何使用cache关键字配置存储池的缓存设备:
$ zpool create system1 mirror c2t0d0 c2t1d0 c2t3d0 cache c2t5d0 c2t8d0
$ zpool status system1
pool: system1
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
system1 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
可以为一个池添加一个或多个缓存设备,也可以在池创建时或创建后添加缓存设备。但不能创建镜像缓存或将它们创建为RAID-Z配置的一部分。
$ zpool add system1 cache c2t5d0 c2t8d0
$ zpool status system1
pool: system1
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
system1 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 Added cache device.
c2t5d0 ONLINE 0 0 0
c2t8d0 ONLINE 0 0 0
errors: No known data errors
注-如果缓存设备上遇到读取错误,该读取I/O将重新发送到原始存储池设备,该设备可能时镜像或RAID-Z配置的一部分。缓存设备的内容被认为是易变的,类似于其他系统缓存
添加缓存设备后,它们会逐渐填充主内存中的内容。缓存设备达到满容量之前的时间取决于其大小。使用zpool iostat命令监控容量和读取:
$ zpool iostat -v pool 5
常见问题的处理
正在使用的设备
一般有以下几种情况:
- Mounted file system 已经被挂载的文件系统
磁盘中包含已经被挂载的文件系统。要修正这个错误,可以使用umount命令。
- File system in /etc/fstab 文件系统被/etc/fstab引用
即使没有被挂载,但是依然不能被列在/etc/fstab文件中。要修正这个错误,应从/etc/fstab中删除或注释掉对应的行。
- Dedicated dump device 专用转储设备
磁盘已经用作系统的专用转储设备。使用dumpadm命令修复此错误。
- Part of a ZFS pool ZFS池的一部分
磁盘或文件是一个活动池的一部分。如果那个池不再需要,可使用zpool destroy命令销毁它;如果那个池还要用,可使用zpool detach命令将目标盘从池中剔除。
只能从镜像存储池中剔除磁盘。
如果遇到正在使用警告,可以使用-f选项强制创建池。
- Contains a file system 包含文件系统
磁盘包含一个已知的文件系统,但它美哟被挂载或使用。
- Part of volume 卷的一部分
磁盘是Solaris卷管理器卷的一部分。
- Part of exported ZFS pool 导出的ZFS池的一部分
磁盘是一个已经被导出的存储池的一部分,或手动从系统移除。对于后者,池会报告potentially active,因为此磁盘可能是其他系统的网络附加设备。
覆盖潜在的活动池时要小心。
不匹配的冗余级别
使用虚拟设备创建不同冗余级别的池时会遇到以下错误提示:
$ zpool create system1 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
如果使用不同大小的设备创建镜像或RAID-Z池,也会出现这样的情况。应该更正错误而不是忽略它。
存储池的挂载点不为空
创建池时,顶级文件系统默认的挂载点是/pool-name。如果这个目录已经存在并包含数据,则会产生错误。
创建池时使用不同的挂载点,可以使用zpool create -m mountpoint命令。例如:
$ zpool create system1 c1t0d0
default mountpoint '/system1' exists and is not empty
use '-m' option to provide a different default
$ zpool create -m /export/zfs system1 c1t0d0
这个命令创建一个新池system1,然后将其挂载到/export/zfs。
销毁ZFS存储池
可以使用命令zpool destroy pool销毁一个池,即使它包含已经挂载的数据集。
注意-ZFS无法始终跟踪正在使用的设备。所以应确保正在销毁正确的池。
销毁池后,仍然可以导入它。因此机密数据可能会被泄露。要完全销毁数据,应在销毁池中的每个磁盘上使用类似format程序的analyze->purge选项等功能。
为确保数据机密性,应创建加密的ZFS文件系统。即使恢复了被销毁的池,如果没有加密密钥,仍无法访问数据。
当混合了可用和不可用设备的池被销毁时,数据将写入可用磁盘以指示池不再有效。此状态信息可以防止在执行导入时将设备列为潜在池。即使设备不可用,池仍然可以被破坏。
修复不可用的设备后,它们会在创建新池时报告为potentially active(可能处于活动状态),并在搜索要导入的池时显示为有效设备。
如果有足够数量的设备不可用,则池本身可能会变得不可用。池的顶级虚拟设备的状态报告为UNAVAIL。此时只能使用zpool destroy -f命令销毁池。
2021/12/9