首先,我犯了一个错误并且我承认这一点,但是现在我被一个“损坏的” ZFS 驱动程序困住了,并且想在不重新启动机器的情况下恢复它。
当所有驱动器都断开连接时,我怎样才能让 Linux 上的 ZFS 忘记池的存在(强制卸载并“导出”它)?
当我运行一个包含两个驱动器(作为镜像)的 ZFS 池时,我同时断开了它们(更具体地说:它们的电源),而没有事先卸载或导出它。重新插入电源时,内核将它们识别为新驱动器(之前它们被称为 sdb 和 sdc,现在它们被称为 sdd 和 sde),因此 ZFS 无法自行“重新启动”池。我不想调用这样的命令,zpool replace
因为它们似乎期望新驱动器是全新的并且可以被覆盖,但事实并非如此(事实上,它们是相同的,只是在新的名称/路径下可用)。我尝试了一些其他命令(见下文),但它们的效果并不好。所以我再次断开了它们,但现在我被困在 ZFS 驱动程序无法强制卸载池的情况下,所以我只能尝试重新导入它。由于在电源故障期间不应该发生任何写入,我只是希望能够在之后重新导入它。
当驱动器以新名称连接时,我到目前为止尝试过的操作:
zpool offline pool1 sdb
: “无法脱机 sdb:池 I/O 当前已暂停”zpool online pool1 sdd
:“无法联机 /dev/sdd:池 I/O 当前已暂停”
驱动器断开连接时我尝试了以下操作:
zpool clear pool1
zpool export -f pool1
zpool destroy -f pool1
以防万一它很重要:Debian GNU/Linux bookworm,Linux 6.1.0-6-amd64
答案1
在编写这个详尽的错误描述时,我通过以正确的顺序重新连接驱动器使其重新启动运行,因为 Linux 新决定再次使用它们的旧名称(因此 ZFS 可以在相同的路径上找到它们),运行后zfs clear pool1
它们再次启动。
如果您以错误的顺序连接它们(例如,旧的 sdc 现在显示为 sdb),则运行后clear
,ZFS 将显示CORRUPTED
错误。如果是这样,我只需断开驱动器,连接另一个驱动器(因此正确的驱动器再次显示为 sdb),ZFS 便会zpool clear
再次识别第一个驱动器。然后,在重新连接第二个驱动器后,它会立即被识别。
我决定仍然发布此内容,因为我的 Google foo 没有为我提出任何可行的解决方案,而且还有一个问题对我来说尚未解决:是否可以使用不同的驱动器名称“重新启动”池,或者我是否必须碰运气让内核再次给它们相同的名称(请在评论或其他答案中回答)?