FreeBSD 中文手册
FreeBSD 中文社区
  • FreeBSD 中文手册
  • 编辑日志
  • 译者说明
  • FreeBSD 中文手册
  • 概述
  • 前言
    • 致读者
    • 第四版
    • 第三版
    • 第二版(2004)
    • 第一版(2001)
    • 本书的组织结构
    • 本书中使用的一些约定
    • 致谢
  • 第一部分:快速开始
  • 第1章 简介
    • 1.1.概述
    • 1.2.欢迎来到 FreeBSD!
    • 1.3.关于 FreeBSD 项目
  • 第2章 安装 FreeBSD
    • 2.1.概述
    • 2.2.最低硬件要求
    • 2.3.安装前的准备工作
    • 2.4.开始安装
    • 2.5.使用 bsdinstall
    • 2.6.分配磁盘空间
    • 2.7.获取安装文件
    • 2.8.账户、时区、服务和安全
    • 2.9.故障排除
    • 2.10.使用 Live CD
  • 第3章 FreeBSD 基础
    • 3.1.概述
    • 3.2.虚拟控制台和终端
    • 3.3.用户和基本账户管理
    • 3.4.权限
    • 3.5.目录结构
    • 3.6.磁盘结构
    • 3.7.文件系统的挂载与卸载
    • 3.8.进程和守护进程
    • 3.9.Shell
    • 3.10.文本编辑器
    • 3.11.设备和设备节点
    • 3.12.手册页
  • 第4章 安装应用程序:软件包和 Ports
    • 4.1.概述
    • 4.2.软件安装的概述
    • 4.3.寻找所需的应用程序
    • 4.4.使用 pkg 管理二进制包
    • 4.5.使用 Ports
    • 4.6.使用 Poudriere 构建软件包
    • 4.7.安装后的注意事项
    • 4.8.如何处理损坏的 port
  • 第5章 X Window 系统
    • 5.1.概述
    • 5.2.安装 Xorg
    • 5.3.显卡驱动
    • 5.4.Xorg 配置
    • 5.5.在 X11 中使用字体
  • 第6章 FreeBSD 中的 Wayland
    • 6.1.简介
    • 6.2.Wayland 概述
    • 6.3.Wayfire 混成器
    • 6.4.Hikari 混成器
    • 6.5.Sway 混成器
    • 6.6.使用 Xwayland
    • 6.7.使用 VNC 进行远程连接
    • 6.8.Wayland 登录管理器
    • 6.9.实用工具
  • 第7章 网络
    • 7.1.概述
    • 7.2.设置网络
    • 7.3.有线网络
    • 7.4.无线网络
    • 7.5.主机名
    • 7.6.DNS
    • 7.7.故障排除
  • 第二部分:常见任务
  • 第8章 桌面环境
    • 8.1.概述
    • 8.2.桌面环境
    • 8.3.浏览器
    • 8.4.开发工具
    • 8.5.桌面办公应用
    • 8.6.文档阅读器
    • 8.7.财务
  • 第9章 多媒体
    • 9.1.概述
    • 9.2.设置声卡
    • 9.3.音频播放器
    • 9.4.视频播放器
    • 9.5.视频会议
    • 9.6.图像扫描仪
  • 第10章 配置 FreeBSD 内核
    • 10.1.概述
    • 10.2.为什么要构建定制内核
    • 10.3.浏览系统硬件
    • 10.4.配置文件
    • 10.5.构建并安装定制内核
    • 10.6.如果发生了错误
  • 第11章 打印
    • 11.1.快速入门
    • 11.2.连接打印机
    • 11.3.常见的页面描述语言(PDL)
    • 11.4.直接打印
    • 11.5.LPD(行式打印机程序)
    • 11.6.其他打印系统
  • 第12章 Linux 二进制兼容层
    • 12.1.概述
    • 12.2.配置 Linux 二进制兼容层
    • 12.3.Linux 用户空间
    • 12.4.高级主题
  • 第13章 WINE
    • 13.1.概述
    • 13.2.WINE 概述和概念
    • 13.3.在 FreeBSD 上安装 WINE
    • 13.4.在 FreeBSD 上运行第一个 WINE 程序
    • 13.5.配置 WINE 安装程序
    • 13.6.WINE 图形化用户管理界面
    • 13.7.多用户 FreeBSD 与 WINE
    • 13.8.FreeBSD 上的 WINE 常见问题
  • 第三部分:系统管理
  • 第14章 配置与优化
    • 14.1.概述
    • 14.2.配置文件
    • 14.3.管理 FreeBSD 中的服务
    • 14.4.Cron 和 Periodic
    • 14.5.配置系统日志
    • 14.6.电源和资源管理
    • 14.7.添加交换空间
  • 第15章 FreeBSD 的引导过程
    • 15.1.概述
    • 15.2.FreeBSD 的引导过程
    • 15.3.Device Hints
    • 15.4.关机流程
  • 第16章 安全
    • 16.1.概述
    • 16.2.简介
    • 16.3.账户安全
    • 16.4.入侵检测系统(IDS)
    • 16.5.安全等级
    • 16.6.文件标志位
    • 16.7.OpenSSH
    • 16.8.OpenSSL
    • 16.9.Kerberos
    • 16.10.TCP 封装器(TCP Wrapper)
    • 16.11.访问控制列表(ACL)
    • 16.12.Capsicum
    • 16.13.进程记账
    • 16.14.资源限制
    • 16.15.监控第三方安全问题
    • 16.16.FreeBSD 安全公告
  • 第17章 jail 与容器
    • 17.1.概述
    • 17.2.jail 的类型
    • 17.3.主机配置
    • 17.4.传统 jail(厚 jail)
    • 17.5.瘦 jail
    • 17.6.管理 jail
    • 17.7.更新 jail
    • 17.8.jail 资源限制
    • 17.9.jail 管理器与容器
  • 第18章 强制访问控制
    • 18.1.概述
    • 18.2.关键术语
    • 18.3.了解 MAC 标签
    • 18.4.规划安全配置
    • 18.5.可用的 MAC 策略
    • 18.6.用户锁定
    • 18.7.MAC Jail 中的 Nagios
    • 18.8.MAC 框架的故障排除
  • 第19章 安全事件审计
    • 19.1.概述
    • 19.2.关键术语
    • 19.3.审计配置
    • 19.4.使用审计跟踪
  • 第20章 存储
    • 20.1.概述
    • 20.2.添加磁盘
    • 20.3.调整和增加磁盘大小
    • 20.4.USB 存储设备
    • 20.5.创建和使用 CD
    • 20.6.创建和使用 DVD
    • 20.7.创建和使用软盘
    • 20.8.备份的基础知识
    • 20.9.内存盘
    • 20.10.文件系统快照
    • 20.11.磁盘配额
    • 20.12.加密磁盘分区
    • 20.13.加密交换分区
    • 20.14.高可用性存储(HAST)
  • 第21章 GEOM: 模块化磁盘转换框架
    • 21.1.概述
    • 21.2.RAID0——条带
    • 21.3.RAID1——镜像
    • 21.4.RAID3——带有专用奇偶校验的字节级条带
    • 21.5.软件 RAID 设备
    • 21.6.GEOM Gate 网络设备
    • 21.7.为磁盘设备添加卷标
    • 21.8.通过 GEOM 实现 UFS 日志
  • 第22章 Z 文件系统(ZFS)
    • 22.1.是什么使 ZFS 与众不同
    • 22.2.快速入门指南
    • 22.3.zpool 管理
    • 22.4.zfs 管理
    • 22.5.委托管理
    • 22.6.高级主题
    • 22.7.更多资源
    • 22.8.ZFS 特性和术语
  • 第23章 其他文件系统
    • 23.1.概述
    • 23.2.Linux® 文件系统
    • 23.3.Windows® 文件系统
    • 23.4.MacOS® 文件系统
  • 第24章 虚拟化
    • 24.1.概述
    • 24.2.使用 macOS® 上的 Parallels Desktop 安装 FreeBSD
    • 24.3.使用 macOS® 上的 VMware Fusion 安装 FreeBSD
    • 24.4.使用 VirtualBox™ 安装 FreeBSD
    • 24.5.在 FreeBSD 上安装 VirtualBox™
    • 24.6.使用 FreeBSD 上的 QEMU 虚拟化
    • 24.7.使用 FreeBSD 上的 bhyve 虚拟机
    • 24.8.基于 FreeBSD 的 Xen™ 虚拟机
  • 第25章 本地化——i18n/L10n 的使用和设置
    • 25.1.概述
    • 25.2.使用本地化
    • 25.3.寻找 i18n 应用程序
    • 25.4.特定语言的区域配置
  • 第26章 FreeBSD 更新与升级
    • 26.1.概述
    • 26.2.更新 FreeBSD
    • 26.3.更新 Bootcode
    • 26.4.更新文档
    • 26.5.追踪开发分支
    • 26.6.从源代码更新 FreeBSD
    • 26.7.多台机器的追踪
    • 26.8.在非 FreeBSD 主机上进行构建
  • 第27章 DTrace
    • 27.1.概述
    • 27.2.实现上的差异
    • 27.3.开启 DTrace 支持
    • 27.4.启用内核外部模块 DTrace
    • 27.5.使用 DTrace
  • 第28章 USB 设备模式/USB OTG
    • 28.1.概述
    • 28.2.USB 虚拟串行端口
    • 28.3.USB 设备模式网络接口
    • 28.4.USB 虚拟存储设备
  • 第四部分:网络通讯
  • 第29章 串行通信
    • 29.1.概述
    • 29.2.串行术语和硬件
    • 29.3.终端
    • 29.4.拨入服务
    • 29.5.拨出服务
    • 29.6.设置串行控制台
  • 第30章 PPP
    • 30.1.概述
    • 30.2.配置 PPP
    • 30.3.PPP 连接的故障排除
    • 30.4.使用以太网 PPP(PPPoE)
    • 30.5.使用 ATM 上的 PPP (PPPoA)
  • 第31章 电子邮件
    • 31.1.概述
    • 31.2.邮件组件
    • 31.3.DragonFly 邮件代理(DMA)
    • 31.4.Sendmail
    • 31.5.修改邮件传输代理
    • 31.6.邮件用户代理
    • 31.7.高级主题
  • 第32章 网络服务器
    • 32.1.概述
    • 32.2.inetd 超级服务器
    • 32.3.网络文件系统(NFS)
    • 32.4.网络信息系统(NIS)
    • 32.5.轻型目录访问协议(LDAP)
    • 32.6.动态主机设置协议(DHCP)
    • 32.7.域名系统(DNS)
    • 32.8.零配置网络(mDNS/DNS-SD)
    • 32.9.Apache HTTP 服务器
    • 32.10.文件传输协议(FTP)
    • 32.11.用于 Microsoft® Windows® 客户端的文件和打印服务(Samba)
    • 32.12.用 NTP 进行时钟同步
    • 32.13.iSCSI target 和 initiator 的配置
  • 第33章 防火墙
    • 33.1.概述
    • 33.2.防火墙的概念
    • 33.3.PF
    • 33.4.IPFW
    • 33.5.IPFILTER(IPF)
    • 33.6.Blacklistd
  • 第34章 高级网络
    • 34.1.概述
    • 34.2.网关和路由
    • 34.3.虚拟主机
    • 34.4.无线高级身份验证
    • 34.5.无线自组织(Ad-hoc)模式
    • 34.6.USB 网络共享
    • 34.7.蓝牙
    • 34.8.桥接
    • 34.9.链路聚合与故障转移
    • 34.10.使用 PXE 进行无盘操作
    • 34.11.共用地址冗余协议(CARP)
    • 34.12.VLAN
  • 第五部分:附录
  • 附录 A.获取 FreeBSD
    • A.1.镜像站
    • A.2.使用 Git
    • A.3.使用 Subversion
    • A.4.光盘
  • 附录 B.书目
    • B.1.FreeBSD 相关书籍
    • B.2.安全性参考文献
    • B.3.UNIX 历史
    • B.4.期刊与杂志
  • 附录 C.网络资源
    • C.1.网站
    • C.2.邮件列表
    • C.3.Usenet 新闻组
  • 附录 D.OpenPGP 密钥
    • D.1.官方成员
  • 术语表
  • 后记
由 GitBook 提供支持

FreeBSD 中文社区

在本页
  • 22.3.1. 创建和销毁存储池
  • 22.3.2. 添加和移除设备
  • 22.3.3. 检查池的状态
  • 22.3.4. 清除错误
  • 22.3.5. 替换正常的设备
  • 22.3.6. 处理故障设备
  • 22.3.7. 对池进行 Scrub
  • 22.3.8. 自我修复
  • 22.3.9. 扩展池
  • 22.3.10. 导入和导出池
  • 22.3.11. 升级存储池
  • 22.3.12. 显示记录的池历史
  • 22.3.13. 性能监控
  • 22.3.14. 拆分存储池

这有帮助吗?

在GitHub上编辑
导出为 PDF
  1. 第22章 Z 文件系统(ZFS)

22.3.zpool 管理

上一页22.2.快速入门指南下一页22.4.zfs 管理

最后更新于6天前

这有帮助吗?

22.3.1. 创建和销毁存储池

创建一个 ZFS 存储池需要做出永久性的决策,因为池的结构在创建后无法更改。最重要的决策是将物理磁盘分组为哪种类型的 vdev。有关可能的选项,请参阅 列表。创建池后,大多数 vdev 类型不允许向 vdev 添加磁盘。例外的是镜像(mirrors),它允许向 vdev 添加新磁盘;条带(stripes)也可以通过将新磁盘附加到 vdev 来升级为镜像。尽管添加新的 vdev 会扩展池,但池的布局在创建后无法更改。相反,你需要备份数据,销毁池并重新创建。

创建一个简单的镜像池:

# zpool create mypool mirror /dev/ada1 /dev/ada2
# zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada1    ONLINE       0     0     0
            ada2    ONLINE       0     0     0

errors: No known data errors

要在单个命令中创建多个 vdev,请指定由 vdev 类型关键字(在此示例中为 mirror)分隔的磁盘组:

# zpool create mypool mirror /dev/ada1 /dev/ada2 mirror /dev/ada3 /dev/ada4
# zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada1    ONLINE       0     0     0
            ada2    ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            ada3    ONLINE       0     0     0
            ada4    ONLINE       0     0     0

errors: No known data errors

池也可以使用分区,而不是整个磁盘。将 ZFS 放入单独的分区可以使同一磁盘具有其他分区,用于其他目的。特别是,它允许添加具有启动代码和启动所需文件系统的分区。这使得可以从同时作为池成员的磁盘启动。使用分区而不是整个磁盘不会对 FreeBSD 性能造成额外的负担。使用分区还允许管理员进行 低配 磁盘操作,即使用比整个磁盘容量少的空间。如果未来替换的磁盘与原始磁盘的名义大小相同,但实际容量略小,则较小的分区仍然可以适应替换磁盘。

# zpool create mypool raidz2 /dev/ada0p3 /dev/ada1p3 /dev/ada2p3 /dev/ada3p3 /dev/ada4p3 /dev/ada5p3
# zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0
            ada3p3  ONLINE       0     0     0
            ada4p3  ONLINE       0     0     0
            ada5p3  ONLINE       0     0     0

errors: No known data errors

销毁一个不再需要的池以重新利用磁盘。销毁池之前需要先卸载该池中的文件系统。如果某个数据集正在使用中,卸载操作会失败,无法销毁池。可以使用 -f 强制销毁池。这可能会导致应用程序出现未定义行为,特别是当应用程序有打开的文件时。

22.3.2. 添加和移除设备

将单个磁盘(条带)vdev ada0p3 升级为镜像,通过附加 ada1p3:

# zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          ada0p3    ONLINE       0     0     0

errors: No known data errors
# zpool attach mypool ada0p3 ada1p3
Make sure to wait until resilvering finishes before rebooting.

If you boot from pool 'mypool', you may need to update boot code on newly attached disk _ada1p3_.

Assuming you use GPT partitioning and _da0_ is your new boot disk you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1
# zpool status
  pool: mypool
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Fri May 30 08:19:19 2014
        527M scanned out of 781M at 47.9M/s, 0h0m to go
        527M resilvered, 67.53% done
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0  (resilvering)

errors: No known data errors
# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 781M in 0h0m with 0 errors on Fri May 30 08:15:58 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0

errors: No known data errors

当向现有的 vdev 添加磁盘不可行时(例如 RAID-Z),一种替代方法是向池中添加另一个 vdev。添加 vdev 提供了更高的性能,通过将写入分配到各个 vdev 上。每个 vdev 提供其自身的冗余。可以混合使用 mirror 和 RAID-Z 类型的 vdev,但不推荐这样做。向包含镜像或 RAID-Z vdev 的池中添加非冗余 vdev 会使整个池的数据面临风险。分布式写入意味着,如果非冗余磁盘发生故障,将导致写入池的每个块的一部分丢失。

ZFS 将数据条带化到每个 vdev 上。例如,使用两个镜像 vdev,这实际上是一个 RAID 10,将写入条带化到两个镜像组上。ZFS 会分配空间,以确保每个 vdev 在相同时间达到 100% 满。拥有不同可用空间的 vdev 会降低性能,因为更多的数据写入会到达较少满的 vdev。

向启动池添加新设备时,请记得更新启动代码。

将第二个镜像组(ada2p3 和 ada3p3)附加到现有的镜像:

# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 781M in 0h0m with 0 errors on Fri May 30 08:19:35 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0

errors: No known data errors
# zpool add mypool mirror ada2p3 ada3p3
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
bootcode written to ada2
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3
bootcode written to ada3
# zpool status
  pool: mypool
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Fri May 30 08:29:51 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0
            ada3p3  ONLINE       0     0     0

errors: No known data errors

无法从池中移除 vdev,只有在剩余冗余足够的情况下才可以移除镜像中的磁盘。如果一个镜像组中只剩一个磁盘,该组将不再是镜像,而变成条带,如果该磁盘发生故障,将危及整个池的数据。

从三重镜像组中移除一个磁盘:

# zpool status
  pool: mypool
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Fri May 30 08:29:51 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0

errors: No known data errors
# zpool detach mypool ada2p3
# zpool status
  pool: mypool
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Fri May 30 08:29:51 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0

errors: No known data errors

22.3.3. 检查池的状态

# zpool status
  pool: mypool
 state: ONLINE
  scan: scrub repaired 0 in 2h25m with 0 errors on Sat Sep 14 04:25:50 2013
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0
            ada3p3  ONLINE       0     0     0
            ada4p3  ONLINE       0     0     0
            ada5p3  ONLINE       0     0     0

errors: No known data errors

22.3.4. 清除错误

当检测到错误时,ZFS 会增加读取、写入或校验和错误计数。使用 zpool clear <mypool> 清除错误消息并重置计数。清除错误状态对于自动化脚本非常重要,因为这些脚本会在池遇到错误时提醒管理员。如果不清除旧错误,脚本可能会无法报告后续错误。

22.3.5. 替换正常的设备

替换池中的正常设备:

# zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0

errors: No known data errors
# zpool replace mypool ada1p3 ada2p3
Make sure to wait until resilvering finishes before rebooting.

When booting from the pool 'zroot', update the boot code on the newly attached disk 'ada2p3'.

Assuming GPT partitioning is used and [.filename]#da0# is the new boot disk, use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
# zpool status
  pool: mypool
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Mon Jun  2 14:21:35 2014
        604M scanned out of 781M at 46.5M/s, 0h0m to go
        604M resilvered, 77.39% done
config:

        NAME             STATE     READ WRITE CKSUM
        mypool           ONLINE       0     0     0
          mirror-0       ONLINE       0     0     0
            ada0p3       ONLINE       0     0     0
            replacing-1  ONLINE       0     0     0
              ada1p3     ONLINE       0     0     0
              ada2p3     ONLINE       0     0     0  (resilvering)

errors: No known data errors
# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 781M in 0h0m with 0 errors on Mon Jun  2 14:21:52 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0

errors: No known data errors

22.3.6. 处理故障设备

在替换故障磁盘时,故障磁盘的名称会更改为新磁盘的 GUID。如果替换设备的名称与原设备相同,zpool replace 不需要指定新的设备名称。

使用 zpool replace 替换故障磁盘:

# zpool status
  pool: mypool
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-2Q
  scan: none requested
config:

        NAME                    STATE     READ WRITE CKSUM
        mypool                  DEGRADED     0     0     0
          mirror-0              DEGRADED     0     0     0
            ada0p3              ONLINE       0     0     0
            316502962686821739  UNAVAIL      0     0     0  was /dev/ada1p3

errors: No known data errors
# zpool replace mypool 316502962686821739 ada2p3
# zpool status
  pool: mypool
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Mon Jun  2 14:52:21 2014
        641M scanned out of 781M at 49.3M/s, 0h0m to go
        640M resilvered, 82.04% done
config:

        NAME                        STATE     READ WRITE CKSUM
        mypool                      DEGRADED     0     0     0
          mirror-0                  DEGRADED     0     0     0
            ada0p3                  ONLINE       0     0     0
            replacing-1             UNAVAIL      0     0     0
              15732067398082357289  UNAVAIL      0     0     0  was /dev/ada1p3/old
              ada2p3                ONLINE       0     0     0  (resilvering)

errors: No known data errors
# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 781M in 0h0m with 0 errors on Mon Jun  2 14:52:38 2014
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0

errors: No known data errors

22.3.7. 对池进行 Scrub

# zpool scrub mypool
# zpool status
  pool: mypool
 state: ONLINE
  scan: scrub in progress since Wed Feb 19 20:52:54 2014
        116G scanned out of 8.60T at 649M/s, 3h48m to go
        0 repaired, 1.32% done
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0
            ada3p3  ONLINE       0     0     0
            ada4p3  ONLINE       0     0     0
            ada5p3  ONLINE       0     0     0

errors: No known data errors

如果需要取消 scrub 操作,可以运行 zpool scrub -s <mypool>。

22.3.8. 自我修复

以下示例展示了这种自我修复行为,创建了一个由 /dev/ada0 和 /dev/ada1 组成的镜像池。

# zpool create healer mirror /dev/ada0 /dev/ada1
# zpool status healer
  pool: healer
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    healer      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
       ada0     ONLINE       0     0     0
       ada1     ONLINE       0     0     0

errors: No known data errors
# zpool list
NAME     SIZE  ALLOC   FREE   CKPOINT  EXPANDSZ   FRAG   CAP  DEDUP  HEALTH  ALTROOT
healer   960M  92.5K   960M         -         -     0%    0%  1.00x  ONLINE  -

将一些重要数据复制到池中,以保护数据免受错误,并创建池的校验和以供后续比较。

# cp /some/important/data /healer
# zfs list
NAME     SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
healer   960M  67.7M   892M     7%  1.00x  ONLINE  -
# sha1 /healer > checksum.txt
# cat checksum.txt
SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f

通过向镜像中的一块磁盘写入随机数据来模拟数据损坏。为了防止 ZFS 在检测到损坏时修复数据,首先导出池,然后在损坏后重新导入。

警告

这是个危险操作,可能会销毁重要数据,仅用于演示。在正常操作的存储池中不要尝试。不要在任何具有 ZFS 文件系统以外分区的磁盘上运行此有意损坏示例。不要使用池外的任何其他磁盘设备名。确保存在正确的池备份,并在运行命令之前测试它们!

# zpool export healer
# dd if=/dev/random of=/dev/ada1 bs=1m count=200
200+0 records in
200+0 records out
209715200 bytes transferred in 62.992162 secs (3329227 bytes/sec)
# zpool import healer

池的状态显示某个设备出现了错误。请注意,应用程序读取数据时未收到任何错误数据。ZFS 从未受影响的 ada0 镜像磁盘提供了数据。要查找校验和错误的设备,请查看 CKSUM 列包含非零值的设备。

# zpool status healer
    pool: healer
   state: ONLINE
  status: One or more devices has experienced an unrecoverable error.  An
          attempt was made to correct the error.  Applications are unaffected.
  action: Determine if the device needs to be replaced, and clear the errors
          using 'zpool clear' or replace the device with 'zpool replace'.
     see: http://illumos.org/msg/ZFS-8000-4J
    scan: none requested
  config:

      NAME        STATE     READ WRITE CKSUM
      healer      ONLINE       0     0     0
        mirror-0  ONLINE       0     0     0
         ada0     ONLINE       0     0     0
         ada1     ONLINE       0     0     1

errors: No known data errors

ZFS 检测到错误并通过使用未受影响的 ada0 镜像磁盘中的冗余数据进行了修复。通过与原始校验和的比较,可以查看池是否一致。

# sha1 /healer >> checksum.txt
# cat checksum.txt
SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f
SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f
# zpool scrub healer
# zpool status healer
  pool: healer
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
            attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
            using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-4J
  scan: scrub in progress since Mon Dec 10 12:23:30 2012
        10.4M scanned out of 67.0M at 267K/s, 0h3m to go
        9.63M repaired, 15.56% done
config:

    NAME        STATE     READ WRITE CKSUM
    healer      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
       ada0     ONLINE       0     0     0
       ada1     ONLINE       0     0   627  (repairing)

errors: No known data errors

scrub 操作从 ada0 读取数据,并在 ada1 上重写任何具有错误校验和的数据,显示为 zpool status 中的 (repairing) 输出。操作完成后,池状态将变为:

# zpool status healer
  pool: healer
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
             using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-4J
  scan: scrub repaired 66.5M in 0h2m with 0 errors on Mon Dec 10 12:26:25 2012
config:

    NAME        STATE     READ WRITE CKSUM
    healer      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
       ada0     ONLINE       0     0     0
       ada1     ONLINE       0     0 2.72K

errors: No known data errors

在 scrub 操作完成并将所有数据从 ada0 同步到 ada1 后,使用 zpool clear 清除池状态中的错误消息。

# zpool clear healer
# zpool status healer
  pool: healer
 state: ONLINE
  scan: scrub repaired 66.5M in 0h2m with 0 errors on Mon Dec 10 12:26:25 2012
config:

    NAME        STATE     READ WRITE CKSUM
    healer      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
       ada0     ONLINE       0     0     0
       ada1     ONLINE       0     0     0

errors: No known data errors

池现在已经恢复到完全正常的状态,所有错误计数都为零。

22.3.9. 扩展池

通过对每个设备使用 zpool online -e 开始扩展。扩展所有设备后,额外的空间将可供池使用。

22.3.10. 导入和导出池

导出一个未使用的池:

# zpool export mypool

导入池会自动挂载数据集。如果不希望出现这种行为,可以使用 zpool import -N 来防止自动挂载。zpool import -o 可以为此次导入设置临时属性。zpool import altroot= 允许使用基本挂载点而不是文件系统根目录导入池。如果池上次使用的是不同的系统,并且未正确导出,可以使用 zpool import -f 强制导入池。zpool import -a 导入所有未被其他系统使用的池。

列出所有可用的池进行导入:

# zpool import
   pool: mypool
     id: 9930174748043525076
  state: ONLINE
 action: The pool can be imported using its name or numeric identifier.
 config:

        mypool      ONLINE
          ada2p3    ONLINE

使用替代根目录导入池:

# zpool import -o altroot=/mnt mypool
# zfs list
zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
mypool               110K  47.0G    31K  /mnt/mypool

22.3.11. 升级存储池

升级 FreeBSD 后,或者从使用较旧版本的系统导入池时,需要手动将池升级到最新的 ZFS 版本,以支持更新的特性。在升级之前,考虑池是否可能在未来需要在旧系统上导入。升级是单向操作。可以升级旧池,但无法将池降级以支持新特性。

将 v28 池升级以支持 Feature Flags:

# zpool status
  pool: mypool
 state: ONLINE
status: The pool is formatted using a legacy on-disk format.  The pool can
        still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
        pool will no longer be accessible on software that does not support feat
        flags.
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
	    ada0    ONLINE       0     0     0
	    ada1    ONLINE       0     0     0

errors: No known data errors
# zpool upgrade
This system supports ZFS pool feature flags.

The following pools are formatted with legacy version numbers and are upgraded to use feature flags.
After being upgraded, these pools will no longer be accessible by software that does not support feature flags.

VER  POOL
---  ------------
28   mypool

Use 'zpool upgrade -v' for a list of available legacy versions.
Every feature flags pool has all supported features enabled.
# zpool upgrade mypool
This system supports ZFS pool feature flags.

Successfully upgraded 'mypool' from version 28 to feature flags.
Enabled the following features on 'mypool':
  async_destroy
  empty_bpobj
  lz4_compress
  multi_vdev_crash_dump

升级后,直到 zpool upgrade 完成,ZFS 的新特性将不再可用。使用 zpool upgrade -v 查看升级提供了哪些新特性,以及哪些特性已被支持。

升级池来支持新特性标志:

# zpool status
  pool: mypool
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
        still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
        the pool may no longer be accessible by software that does not support
        the features. See zpool-features(7) for details.
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
	    ada0    ONLINE       0     0     0
	    ada1    ONLINE       0     0     0

errors: No known data errors
# zpool upgrade
This system supports ZFS pool feature flags.

All pools are formatted using feature flags.

Some supported features are not enabled on the following pools. Once a
feature is enabled the pool may become incompatible with software
that does not support the feature. See zpool-features(7) for details.

POOL  FEATURE
---------------
zstore
      multi_vdev_crash_dump
      spacemap_histogram
      enabled_txg
      hole_birth
      extensible_dataset
      bookmarks
      filesystem_limits
# zpool upgrade mypool
This system supports ZFS pool feature flags.

Enabled the following features on 'mypool':
  spacemap_histogram
  enabled_txg
  hole_birth
  extensible_dataset
  bookmarks
  filesystem_limits

警告

在从池启动的系统上更新引导代码,以支持新池版本。

对于使用 GPT 启动的旧系统,可以使用以下命令:

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

对于使用 EFI 启动的系统,执行以下命令:

# gpart bootcode -p /boot/boot1.efifat -i 1 ada1

22.3.12. 显示记录的池历史

ZFS 会记录所有改变池状态的命令,包括创建数据集、更改属性或替换磁盘。回顾池的创建历史很有用,同样也可以检查哪个用户在什么时候执行了特定的操作。历史记录并不会保存在日志文件中,而是池的一部分。查看历史记录的命令正如其名为 zpool history:

# zpool history
History for 'tank':
2013-02-26.23:02:35 zpool create tank mirror /dev/ada0 /dev/ada1
2013-02-27.18:50:58 zfs set atime=off tank
2013-02-27.18:51:09 zfs set checksum=fletcher4 tank
2013-02-27.18:51:18 zfs create tank/backup

输出显示了 zpool 和 zfs 命令如何以时间戳记录改变池状态的操作。像 zfs list 这样的命令不会包含在内。若不指定池名称,ZFS 会显示所有池的历史记录。

通过提供选项 -i 或 -l,zpool history 可以显示更多信息。-i 会显示用户发起的事件以及内部记录的 ZFS 事件。

# zpool history -i
History for 'tank':
2013-02-26.23:02:35 [internal pool create txg:5] pool spa 28; zfs spa 28; zpl 5;uts  9.1-RELEASE 901000 amd64
2013-02-27.18:50:53 [internal property set txg:50] atime=0 dataset = 21
2013-02-27.18:50:58 zfs set atime=off tank
2013-02-27.18:51:04 [internal property set txg:53] checksum=7 dataset = 21
2013-02-27.18:51:09 zfs set checksum=fletcher4 tank
2013-02-27.18:51:13 [internal create txg:55] dataset = 39
2013-02-27.18:51:18 zfs create tank/backup

通过加上 -l 显示更多细节。长格式的历史记录包括了执行命令的用户和命令发生的主机名信息。

# zpool history -l
History for 'tank':
2013-02-26.23:02:35 zpool create tank mirror /dev/ada0 /dev/ada1 [user 0 (root) on :global]
2013-02-27.18:50:58 zfs set atime=off tank [user 0 (root) on myzfsbox:global]
2013-02-27.18:51:09 zfs set checksum=fletcher4 tank [user 0 (root) on myzfsbox:global]
2013-02-27.18:51:18 zfs create tank/backup [user 0 (root) on myzfsbox:global]

输出显示 root 用户创建了由 /dev/ada0 和 /dev/ada1 组成的镜像池。主机名 myzfsbox 也在池创建后的命令中显示出来。当池从一个系统导出并导入到另一个系统时,主机名信息变得非常重要。可以通过主机名区分在其他系统上执行的命令。

将两个选项结合使用,zpool history 可以提供任何池的最详细信息。池历史记录在追踪执行的操作或调试时提供了宝贵的帮助。

22.3.13. 性能监控

ZFS 提供了一个内建的监控系统,可以实时显示池的 I/O 统计数据。它展示了池的已用空间和空闲空间、每秒读写操作以及使用的 I/O 带宽。默认情况下,ZFS 会监控并显示系统中所有池的状态。若只想监控某个特定池,可以指定池的名称。以下是一个基本示例:

# zpool iostat
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
data         288G  1.53T      2     11  11.3K  57.1K

要持续查看 I/O 活动,可以指定一个数字作为最后一个参数,表示每次更新的间隔时间(以秒为单位)。每次统计数据将会在该间隔后打印一次。按 Ctrl**+**C 停止连续监控。如果还要指定显示的统计次数,可以在命令行中添加第二个数字。

通过使用 -v 显示更详细的 I/O 统计数据。每个池中的设备都会有一行统计数据。这有助于查看每个设备的读写操作,帮助判断是否有某个设备拖慢了池的性能。以下是一个镜像池的例子,包含两个设备:

# zpool iostat -v
                            capacity     operations    bandwidth
pool                     alloc   free   read  write   read  write
-----------------------  -----  -----  -----  -----  -----  -----
data                      288G  1.53T      2     12  9.23K  61.5K
  mirror                  288G  1.53T      2     12  9.23K  61.5K
    ada1                     -      -      0      4  5.61K  61.7K
    ada2                     -      -      1      4  5.04K  61.7K
-----------------------  -----  -----  -----  -----  -----  -----

22.3.14. 拆分存储池

ZFS 可以将由一个或多个镜像 vdev 组成的池拆分成两个池。除非特别指定,ZFS 会从每个镜像中分离出最后一个成员,并创建一个包含相同数据的新池。在实际执行前,最好先使用 -n 选项进行模拟运行,这会显示请求操作的细节,而不会实际执行该操作。这有助于确认操作会按照预期执行。

使用分区创建一个 池:

有两种方法可以将磁盘添加到池中:通过 zpool attach 将磁盘附加到现有的 vdev,或者通过 zpool add 向池中添加 vdev。一些 在创建后允许向 vdev 添加磁盘。

使用单个磁盘创建的池没有冗余。它可以检测到损坏,但无法修复,因为没有数据的其他副本。 属性可能能够从小的故障(例如坏道)中恢复,但它不像镜像或 RAID-Z 那样提供相同级别的保护。从一个由单个磁盘 vdev 组成的池开始,使用 zpool attach 将新磁盘添加到 vdev,创建一个镜像。也可以使用 zpool attach 将新磁盘添加到镜像组中,从而增加冗余和读取性能。在对用于池的磁盘进行分区时,将第一个磁盘的布局复制到第二个磁盘。使用 gpart backup 和 gpart restore 可以简化这一过程。

池的状态很重要。如果某个硬盘脱机或 ZFS 检测到读取、写入或校验和错误,相应的错误计数将增加。status 输出显示了池中每个设备的配置和状态,以及整个池的状态。还会显示对上一次 的操作详情。

有时可能希望用不同的硬盘替换一个磁盘。替换正常磁盘时,操作过程中会保持旧磁盘在线,池不会进入 状态,从而减少数据丢失的风险。运行 zpool replace 将数据从旧磁盘复制到新磁盘。操作完成后,ZFS 会将旧磁盘从 vdev 中断开。如果新磁盘比旧磁盘大,可能能够使用新空间扩展 zpool,见 。

当池中的磁盘发生故障时,磁盘所在的 vdev 会进入 状态。数据仍然可用,但性能会降低,因为 ZFS 会从可用的冗余数据中计算缺失的数据。为了将 vdev 恢复到完全正常的状态,需要替换故障的物理设备。然后会指示 ZFS 开始 操作。ZFS 会从可用的冗余数据中重新计算故障设备的数据,并将其写入替换设备。操作完成后,vdev 会恢复到 状态。

如果 vdev 没有冗余,或者设备出现故障且冗余不足以弥补,池会进入 状态。除非有足够的设备重新连接池,否则池将无法使用,必须从备份中恢复数据。

建议定期对池进行 ,最好每月至少进行一次。scrub 操作会消耗磁盘资源,因此在运行时会降低性能。请避免在高负载时期安排 scrub 操作,或者使用 调整 scrub 的相对优先级,以免影响其他工作负载。

存储在数据块中的校验和使文件系统能够进行​自我修复​。此功能将在检测到数据的校验和与存储池中其他设备记录的校验和不匹配时,自动修复数据。例如,如果一个镜像配置中有两块磁盘,其中一块磁盘开始出现故障,无法再正确存储数据,而另一块磁盘仍然正常。这种情况在长期存档存储中尤为严重,因为数据可能长时间未被访问。传统的文件系统需要运行命令来检查和修复数据,如 。这些命令需要时间,在严重情况下,管理员需要决定执行哪种修复操作。而 ZFS 在检测到数据块的校验和不匹配时,会尝试从镜像磁盘读取数据。如果该磁盘提供了正确的数据,ZFS 会将其提供给应用程序,并修复具有错误校验和的磁盘上的数据。此过程在正常池操作期间无需管理员干预。

在有意破坏数据时,生成校验和并与池数据仍然一致。这展示了 ZFS 如何能够在校验和不同的情况下自动检测并修复任何错误。请注意,这只有在池中有足够的冗余时才可能。由单个设备组成的池没有自我修复能力。这也是为什么校验和在 ZFS 中如此重要;不要因任何原因禁用它们。ZFS 无需 或类似的文件系统一致性检查程序来检测和修复这些问题,并在出现问题时保持池的可用性。现在需要进行一个 scrub 操作来覆盖 ada1 上的损坏数据。

每个 vdev 中最小的设备限制了冗余池的可用大小。可以通过将最小设备替换为更大的设备来扩展池的容量。完成 或 操作后,池的可用空间会增长到新设备的容量。例如,考虑一个由 1 TB 和 2 TB 硬盘组成的镜像池。可用空间为 1 TB。当将 1 TB 硬盘替换为另一个 2 TB 硬盘时,resilver 操作将现有数据复制到新硬盘。由于两个硬盘现在都具有 2 TB 的容量,因此镜像池的可用空间将增加到 2 TB。

在将池迁移到另一台系统之前,应先 导出 池。ZFS 会卸载所有数据集,并将每个设备标记为已导出,但仍会锁定以防止被其他磁盘使用。这使得池可以在其他支持 ZFS 的机器、操作系统甚至不同硬件架构上进行 导入(有一些注意事项,参见 )。当数据集有打开的文件时,使用 zpool export -f 强制导出池。使用此命令时需小心。数据集会被强制卸载,可能会导致应用程序在这些数据集上有打开文件时出现意外行为。

将引导代码应用于池中的所有可启动磁盘。有关更多信息,请参阅 。

vdev 类型
RAID-Z2
vdev 类型
复制
scrub
degraded
扩展池
degraded
resilver
online
faulted
scrub
vfs.zfs.scrub_delay
fsck(8)
fsck(8)
replace
resilver
zpool(8)
gpart(8)