背景:
- Ubuntu Xenial
- 为系统磁盘安装 ZFS(因此,您知道:rpool/ROOT)
- 系统运行良好,但当内核更新时,
grub-probe
会出现上述错误 - 我现在不想重启
有一个讨论在这里关于grub-probe
它应该如何“变得更好”,但这会有所帮助,直到它出现。我从那次讨论中得到了这个想法。
更多详细信息:错误的完整实例(对于我的系统)如下所示:
/usr/sbin/grub-probe: error: failed to get canonical path of `/dev/ata-ADATA_SP550_2G1520009135-part1'.
这隐藏在安装图形驱动程序的 apt 命令中给出的大量细节中(但这并不重要)。
此磁盘对应于我的一个 ZIL 分区。我在安装完成后添加了 ZIL 和缓存,所以我想这就是我之前没有看到问题的原因。我还没有重新启动,这就是我看到问题的原因。是的,您可以重新启动以解决所有这些问题,但假设您不想这样做,请继续阅读:
如果我查看 /dev,我会看到所有 ZFS 磁盘的链接,如下所示:
lrwxrwxrwx 1 root root 4 Sep 16 23:31 ata-WDC_WD10EARS-00Y5B1_WD-WMAV51436394-part1 -> sdc1
lrwxrwxrwx 1 root root 4 Sep 16 23:31 ata-WDC_WD20EZRX-00D8PB0_WD-WCC4MK86SWX7-part1 -> sdd1
lrwxrwxrwx 1 root root 4 Sep 16 23:31 ata-WDC_WD20EZRX-00D8PB0_WD-WCC4N1085683-part1 -> sde1
lrwxrwxrwx 1 root root 4 Sep 16 23:31 ata-WDC_WD2500JS-22MHB0_WD-WCANK4053187-part1 -> sda1
...但值得注意的是,ZIL 分区没有这个。
我可以通过运行以下命令来测试情况:
$ sudo grub-probe /
grub-probe: error: failed to get canonical path of `/dev/ata-ADATA_SP550_2G1520009135-part1'.
那么问题是:如何修复此问题grub-probe
?
答案1
有一个环境变量可以解决这个问题。从我的阅读来看,问题似乎是 Grub 喜欢“支持”zfs 的想法,但不喜欢修复 Grub 中与 zfs 相关的问题。具体来说,它在查找事物方面的错误处理很差。
例如,如果没有用户干预,Ubuntu 16.x 附带的 grub 工具将无法在 ZFS 卷上找到 /boot,然后会愉快地将您正在使用的任何实用程序的某些(但不是全部)所需文件输出写入它刚刚告诉您找不到的 /boot 文件夹。
任何状况之下...
http://list.zfsonlinux.org/pipermail/zfs-discuss/2016-June/025765.html
To check if you have commit (should see full paths):
ZPOOL_VDEV_NAME_PATH=1 zpool status
If so you can do:
ZPOOL_VDEV_NAME_PATH=1 grub-whatevs ....
您可以将变量作为输入传递给必要的 grub 实用程序,或者您可以将其指定为 root 的 .bashrc 或 .profile 中的 shell 变量或类似的东西...
export ZPOOL_VDEV_NAME_PATH=YES
该变量使 zpool 报告完整路径,而不是磁盘的相对 /dev 路径,后者可能与 zfs 配合使用,也可能不配合使用。Grub 实用程序检查 zfs 池的 zpool 状态以查找包含它们的磁盘。因此,更改 zpool status 的输出可以修复 grub。
我同意用户不应该处理这个问题,参考 femulator 的评论。真正的解决方案是什么?与其他所有因错误而苦苦挣扎的开源项目一样,永远无法修复。分叉它,自己修复它,然后停止使用源项目/库/任何东西。换句话说,这是“解雇”某人的 FOSS 方式 ;)。显然,Debian 七年前就知道了这个特定的错误。
这是阻止我成功将 FreeBSD RaidZ 启动池迁移到 Ubuntu 的唯一原因。如果其他人尝试类似的事情,这个过程相对简单,只要你足够了解 ZFS,可以忽略 Grub 和 zfsonlinux 文档中错误的部分(例如将根数据集设置为不自动挂载,嗯……?那么它究竟如何启动?)。Ubuntu 在其文档中指出,引导加载程序是 Linux 最不安全的“功能”,这有点讽刺,我想这是真的,但在这种情况下,它也是 Ubuntu 的明显缺陷。如果我可以使用实际有效的 Sun/Solaris 实用程序来完成此操作,那么我需要一两个小时才能将 BSD ZFS 池迁移到另一个操作系统。问题是我不得不使用 Linux 实用程序(如 Grub),而这些实用程序在某些时候无法(或几乎无法)工作,所以我花了另外两天时间修复这个问题。如果 Ubuntu 不需要 grub 来启动,它会好得多……
答案2
假设您不想重新启动(见下文),那么答案就是为丢失的磁盘创建类似的链接。对于我和我的系统来说,这意味着添加以下链接:
$ cd /dev
$ sudo ln -sf sdf1 /dev/disk/by-id/ata-ADATA_SP550_2G1520009135-part1
$ sudo ln -sf sdf3 /dev/disk/by-id/ata-ADATA_SP550_2G1520009135-part3
$ sudo ln -sf sdg1 /dev/disk/by-id/ata-SPCC_Solid_State_Disk_EB84076413B201101308-part1
$ sudo ln -sf sdg3 /dev/disk/by-id/ata-SPCC_Solid_State_Disk_EB84076413B201101308-part3
(两个磁盘上的分区 2 都被镜像为 ZIL home
,但grub-probe
并不关心这一点)
其公式是确定grub-probe
需要哪些磁盘,然后根据模式为这些磁盘创建符号链接:
$ sudo ln -sf {sdname}{partN} /dev/disk/by-id/{diskid}-part{partN}
您可以通过重复该命令并创建链接来确定所需的磁盘,$ sudo grub-probe /
直到其正常运行并最终报告:
$ sudo grub-probe /
zfs
直到它满意为止,您会看到如下投诉:
$ sudo grub-probe /
grub-probe: error: failed to get canonical path of `/dev/disk/by-id/ata-ADATA_SP550_2G1520009135-part3'.
请注意,它具体抱怨的是-part3
磁盘名称是ata-ADATA_SP550...
创建链接:
ata-ADATA_SP....
通过运行以下命令找到对应的磁盘:
$ ls -l /dev/disk/by-id | grep ata-ADATA_SP
lrwxrwxrwx 1 root root 9 Sep 17 13:45 ata-ADATA_SP550_2G1520009135 -> ../../sdf
lrwxrwxrwx 1 root root 10 Sep 17 13:49 ata-ADATA_SP550_2G1520009135-part1 -> ../../sdf1
lrwxrwxrwx 1 root root 10 Sep 17 13:51 ata-ADATA_SP550_2G1520009135-part2 -> ../../sdf2
lrwxrwxrwx 1 root root 10 Sep 17 13:50 ata-ADATA_SP550_2G1520009135-part3 -> ../../sdf3
注意这是 sdf,因此您的链接命令变成:
$ sudo ln -sf /dev/sdf3 /dev/disk/by-id/ata-ADATA_SP550_2G1520009135-part3
重复上述操作,直到grub-probe
命令成功。如果您知道自己在做什么,并且知道池中所有磁盘使用了哪些分区ROOT
,请务必直接跳到最后并链接这些分区,而不是使用命令grub-probe
告诉您该怎么做。
/dev/disk/by-id/*
您可能认为这会颠覆您最初使用这些名称的原因。如果/dev/sd*
路径发生变化,您就会陷入困境,必须重新建立链接,对吗?事实证明,解决所有这些问题的另一种方法是重新启动主机:它会在重新启动时创建链接。
答案3
ZFS 对此的错误/修复是什么?用户不应该处理这个问题 ->https://github.com/zfsonlinux/grub/issues/5