我正在尝试使用 ZFS 清理 Ubuntu 12.04 LTS 服务器系统上的混乱情况。以下是 zpool status 显示的内容:
pool: TB2
state: UNAVAIL
status: One or more devices could not be used because the label is missing
or invalid. There are insufficient replicas for the pool to continue
functioning.
action: Destroy and re-create the pool from
a backup source.
see: http://zfsonlinux.org/msg/ZFS-8000-5E
scan: none requested
config:
NAME STATE READ WRITE CKSUM
TB2 UNAVAIL 0 0 0 insufficient replicas
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
sdg ONLINE 0 0 0
sdh ONLINE 0 0 0
sdi ONLINE 0 0 0
sdj ONLINE 0 0 0
sds ONLINE 0 0 0
sdt UNAVAIL 0 0 0
pool: TB4
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://zfsonlinux.org/msg/ZFS-8000-4J
scan: resilvered 2.52T in 16h41m with 0 errors on Tue Feb 6 09:27:46 2018
config:
NAME STATE READ WRITE CKSUM
TB4 DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
ata-Hitachi_HDS724040ALE640_PK1331PAG9MBVS ONLINE 0 0 0
ata-Hitachi_HDS724040ALE640_PK2311PAG8G71M ONLINE 0 0 0
ata-Hitachi_HDS724040ALE640_PK1331PAGH0LHV ONLINE 0 0 0
ata-Hitachi_HDS724040ALE640_PK2331PAG8MV3T ONLINE 0 0 0
spare-4 DEGRADED 0 0 0
ata-Hitachi_HDS724040ALE640_PK2311PAG614MM UNAVAIL 0 0 0
ata-Hitachi_HDS724040ALE640_PK1331PAGH0EAV ONLINE 0 0 0
ata-Hitachi_HDS724040ALE640_PK2331PAGH2XRW ONLINE 0 0 0
ata-Hitachi_HDS724040ALE640_PK1331PAG7TGDS ONLINE 0 0 0
ata-Hitachi_HDS724040ALE640_PK1331PAGG3K0V ONLINE 0 0 0
ata-Hitachi_HDS724040ALE640_PK2311PAG59PYM ONLINE 0 0 0
spares
ata-Hitachi_HDS724040ALE640_PK1331PAGH0EAV INUSE currently in use
errors: No known data errors
我想做两件事:1. 更换池 TB4 中的故障驱动器。我知道如何做。2. 彻底销毁并重新创建池 TB2。
通常情况下,我只需执行 zpool destroy TB2 并重新开始。但是,之前的管理员对 TB2 使用 sd* 名称,对 TB4 使用磁盘 ID。在查看 /dev/disk/by-id 时,我发现两个 TB4 驱动器(...71M 和 ...EAV)分别符号链接到 /dev/sdj 和 /dev/sds。但这些 sdj 和 sds 都列为 TB2 池的一部分。我担心执行 zpool destroy TB2 会损坏 TB4 池中的驱动器,因为文档说 destroy 会写入成员磁盘。有没有办法让 ZFS 直接忘记 TB2 而不实际写入?
我问过前任管理员为什么他使用了两种不同的方法(/dev/sd* 和 by-id)。他说,将驱动器号分配给特定硬盘似乎在每次启动时都不可重复,所以当他创建 TB4 时,他使用了 by-id。我猜 TB2 和 TB4 的纠缠就是由此导致的。
我目前的想法是这样做:
- 关掉机器
- 拉动所有驱动器。
- 重启。
- zpool 销毁 -f TB2
- 关闭并重新安装 TB4 驱动器
- 在另一台机器上重新格式化 TB2 驱动器
- 重新安装 TB2 驱动器并使用磁盘 ID(非 sd*)创建新池
这看起来合理吗?有没有更简单的方法?
感谢所有能帮助我摆脱困境的人。
迈克尔
答案1
你提出的方法似乎可行。但是,它也过于复杂。因此,我建议:
zpool export TB2
。这将卸载与池相关的所有资源,并且除非您zpool import
先运行,否则系统将不会尝试重新安装它们(并可能写入它们)。- 修复 TB4。(或者您可以稍后再做。)
zpool create <new pool> ...
(通过 ID 引用磁盘以避免再次重叠)。您可能必须强制创建,因为它可能会注意到这些磁盘正在被未导入的池使用。
如果您想试运行该过程,我认为您可以在 TB4 上创建一些卷(zfs create -V 5gb TB4/volume1
),并用这些卷创建两个“嵌套池”(zpool create testpool1 ...
),其中有一个重叠卷。其他一切都应与上述相同。