进阶教程
💻zpool 常用操作及数据恢复
00 分钟
2024-2-4
2024-8-17
type
status
date
slug
summary
tags
category
icon
password
如需技术支持,请点击 👉 联系方式
一位论坛的朋友遇到了 zfs 存储池无法挂载的情况,在帮他处理的过程中使用到了很多相关的 zfs 命令和操作方法,这篇文章是对当时处理过程的一个简单的归纳和整理。

1. 查看 zpool 信息

  • 查看所有可以导入的 zpool :
    • 查看特定硬盘上的 zpool 信息:
      • 查看先前被销毁(destroy)的 zpool :

        2. 导入 zpool

        • 导入所有 zpool :
          • 导入特定的 zpool :
            • 导入 zpool 为只读模式(如果池受损严重而无法访问,此方式也许能让你读取数据进而备份):
              • 强制导入 zpool (如果池未正常导出,则 ZFS 需要使用 -f 标志):
                • 参数说明:
                • -f : 强制导入。
                • -R /mnt : 设置 zpool 挂载点到 /mnt
                • -F : 恢复模式,zfs 会自己尝试处理那些无法导入的 zpool 以便能够正常导入。
              • 缺省情况下,zpool import 命令仅在 /dev 目录中搜索设备。如果设备存在于其他目录中,或者使用的是文件支持的池,则必须使用 -d 选项搜索其他目录。例如:
                • 如果多个可用池具有相同名称,则必须使用数字标识符指定要导入的池。例如:
                  • 如果该池的名称与现有的池名称冲突,则可以使用其他名称导入该池。例如:

                    3. 导出 zpool

                    • 导出 zpool:
                      • 强制导出:
                        • 导出所有的 zpool :

                          4. 销毁 or 恢复 zpool

                          • 可以使用 zpool import -D 命令恢复已销毁的存储池:
                            • 在此 zpool import 输出中,由于包含以下状态信息,因此可以将池 tank 确定为已销毁的池:
                          • 如果已销毁 zpool 中的某个设备出现故障或不可用,通过添加 -f 选项也许能够恢复已销毁的池。在此情况下,请导入已降级的池,然后尝试修复设备故障。例如:

                            5. 场景应用

                            5.1 恢复 zpool 中的数据

                            在某些情况下如果出现 Unraid 无法挂载 zfs 存储池,又或者说阵列启动成功但是会提示 zfs 存储池 文件系统无法挂载 ,那么这时候你可以先尝试重启一下 Unraid 再看看是否依然存在此问题;如果问题依旧,那么建议你通过下面的方式把 zfs 存储池挂载成只读模式,然后将里面的数据拷贝到别的地方,最后把存储池给重新格式化一下,正常之后再将原来的数据拷贝回来。
                            1. 如果此时阵列已经启动了, 那么使用下面的命令将 zpool 进行导出(如果你已经将阵列给停掉了,那么可以忽略这一步):
                              1. 导出 zpool 之后,如果此时你的 Unraid 阵列还在启动着,那么停掉阵列。
                              1. 停掉阵列之后,将 zpool 重新导入并设置为只读模式,并挂载到 /zmount 目录(不需要先创建 /zmount 文件夹):
                                1. 此时 zpool 已经被挂载到 /zmount 这个目录下,接下来你需要将里面的数据拷贝到其他的硬盘上面,你既可以拷贝到阵列里面的硬盘,也可以拷贝到其他非阵列硬盘里面的硬盘。我假设你需要拷贝到阵列中的某一个硬盘中,此时你可以通过 Unassigned Devices 插件在 未分配设备 一栏将阵列中的某一块硬盘进行挂载,然后使用下面的 rsync 命令去拷贝文件,这样你可以不需要启动阵列来拷贝数据,推荐这么去处理。
                                1. 使用 rsync 命令将 /zmount 内的数据拷贝到别的地方,例如:

                                  5.2 替换 zpool 中的磁盘

                                  常见于 zfs 阵列中某个硬盘出现了问题需要进行替换或者替换一个更大的硬盘来拓展 zpool 的存储空间的场景。

                                  (1)替换故障的硬盘的场景

                                  当存储池中的一个硬盘发生故障时,属于该硬盘的 vdev 会进入降级状态(DEGRADE)。虽然数据仍然可用,但性能会降低,因为 zfs 会从可用的冗余数据中计算缺失的数据,这个过程就导致了性能的损耗。
                                  要将将存储池恢复到可用的状态,需要替换故障的物理设备。然后,ZFS 被指示开始执行 resilver 操作。ZFS 会从可用的冗余数据重新计算失败设备上的数据,并将其写入替代设备。操作完成后,vdev 将恢复为在线状态。
                                  例如,出现磁盘故障时的 zpool 状态:
                                  当替换一个故障的磁盘时,故障磁盘的名称会更改为新磁盘的 GUID 。如果替代设备具有相同的设备名称,则不需要为 zpool replace 命令提供新的设备名称参数。
                                  如果 vdev 没有任何冗余,或者如果设备已经故障且没有足够的冗余来弥补,存储池将进入故障状态。除非有足够的设备可以重新连接存储池,否则存储池将变得不可操作,需要从备份中还原数据。
                                  替换过程:
                                  完成重建(resilver):
                                  如果你不希望直接进行替换,而只是希望将有问题的磁盘下线:
                                  可用参数说明:
                                  • -t :暂时将设备下线,下一次重启后此成员依然会处于 online 状态。
                                  • -f :强制设备下线,会导致没有冗余的 zpool 无法使用。

                                  (2)替换可用磁盘的场景

                                  上面的步骤常用于 zpool 中某个硬盘设备出现了问题处于 UNAVAIL 状态,而如果要被替换的设备是正常的,那么你可以无需 offline 而直接进行替换,这样的好处是不会让 zpool 处于降级 DEGRADE 状态,数据安全得到保证,当替换过程结束之后 zfs 会自动断开这个被替换的硬盘并换上新的硬盘。

                                  5.3 移除 zpool 中的某个设备

                                  需要说明的是,从一个 RAIDZ 阵列中移除 vdev 是无法实现的,但是如果说你是从一个 mirror 中移除 vdev 那么是可以实现的,只要这个 mirror 在移除一个 vdev 之后依然保持冗余。如果说一个由两个设备组成的 mirror 阵列被移出了一个设备,那么这个存储池会变成单盘形式的 zpool,不再具有冗余功能。
                                  例如中一个由 3 盘组成的 mirror zpool 中移除其中一个设备:

                                  5.4 创建单盘 zpool

                                  zfs 支持单盘 zpool,并且即使是单盘也依然可以使用 zfs 文件系统的相关特性和功能(如快照),所以在 Unraid 的阵列里面是完全可以使用 zfs 作为阵列硬盘的文件系统。
                                  这里仅仅只是介绍命令行的使用方法,WebUI 界面可以自行配置硬盘的文件系统类型。
                                  在 Unraid 中,如果整列中的硬盘是使用 zfs 文件系统格式,那么 Unraid 在开启阵列的时候是通过下面的命令去创建单盘 zpool 的:

                                  5.5 将单盘 vdev 添加到另一个单盘 zpool 中形成 mirror

                                  5.6 数据完整性检查

                                  scrub 之后使用 zpool status 去检查 scrub 结果:

                                  6. 其他

                                  6.1 Unraid 中是如何挂载 ZFS 存储池的?

                                  在日志中可以找到 Unraid 挂载 ZFS 存储池的过程和参数:
                                  • 挂载为缓存池
                                    • 挂载为阵列盘:

                                      参考资料

                                       

                                      评论