从 zfs root 启动时 grub 找不到 grub.cfg

从 zfs root 启动时 grub 找不到 grub.cfg

我按照以下说明使用 ZoL 的 Debian repo 在 ZFS-root 上安装了 Xubuntu 14.04: https://github.com/fajarnugraha/pkg-zfs/wiki/HOWTO-install-Ubuntu-to-a-Native-ZFS-Root-Filesystem

系统运行良好,但启动时,grub 直接进入 grub shell。在那里我可以运行configfile (hd0,msdos3)/ROOT/ubuntu/@/boot/grub/grub.cfg,并且启动通常的 grub 菜单,然后我可以启动我的系统。在我看来,grub 无法grub.cfg自行找到。

说明实际上说路径是(hd0,msdos3)/ROOT/ubuntu@/boot/grub/grub.cfg(注意@)。但这对我来说不起作用。我必须在 @ 之前放一个 /。但我想这并不相关。(3.5 从现有 grub 安装进行测试启动)

grub-install --boot-directory=/rpool/ROOT/ubuntu/boot /dev/sdaGrub 已按照说明安装。

无论如何,经过几次重启后,我注意到实际上有一个真正的文件夹/rpool/ROOT/ubuntu/boot,还有一个/rpool/ROOT/ubuntu/@/boot包含 grub 文件夹的文件夹,其中包含除以下内容之外的所有内容grub.cfg

$ ls -l /rpool/ROOT/ubuntu/boot/grub/
drwxr-xr-x 2 root root     3 Jan 30 21:34 fonts
-rw-r--r-- 1 root root   699 Jan 31 11:04 gfxblacklist.txt
-rw-r--r-- 1 root root  1024 Jan 30 21:34 grubenv
drwxr-xr-x 2 root root   273 Jan 30 21:47 i386-pc
drwxr-xr-x 2 root root     5 Jan 30 21:47 locale

/rpool/ROOT/ubuntu/@/boot/grub/包含相同。

我复制/boot/grub/grub.cfg到了两个位置,现在它可以正常工作了。我实际的问题是,如果有东西更新 grub,我必须grub.cfg再次复制。现在我添加了 2 行来/usr/sbin/grub-mkconfig对每个进行复制grub-update。但是当 grub 包更新时,这个更改将消失。所以我在这里寻找一个可靠的解决方案。

进一步思考:

是不是/rpool/ROOT/ubuntu/应该保存我的文件系统?因为除了boot目录之外,它是空的:

# ls -l /rpool/ROOT/ubuntu/
total 17
drwxr-xr-x 3 root root 3 Jän 30 21:40 @
drwxr-xr-x 3 root root 3 Jän 30 21:34 boot

以下是一些可能有用的信息:

# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
rpool              4,15G  94,3G   144K  /rpool
rpool/ROOT         4,15G  94,3G  7,09M  /rpool/ROOT
rpool/ROOT/ubuntu  4,14G  94,3G  4,01G  /rpool/ROOT/ubuntu

与 zfs 相关的部分mount

rpool/ROOT/ubuntu on / type zfs (rw,relatime,xattr,noacl)
rpool on /rpool type zfs (rw,relatime,xattr,noacl)
rpool/ROOT on /rpool/ROOT type zfs (rw,relatime,xattr,noacl)

任何帮助都非常感谢。如果您需要更多信息,请告诉我。

仅供参考:我对 ZFS 的唯一先验知识来自使用 freenas,这是我第一次尝试自己做。

答案1

根据我自己的经验进行一些更正。

  1. 在您创建 rpool 时,您的“rpool”已自动挂载在“/rpool”上。这就是为什么您在配置过程中的某个地方发出命令zfs set mountpoint=none rpool以消除该行为。您执行相同的操作以rpool/ROOT消除其在 /rpool/ROOT 上的自动挂载,而您并不需要这样做。

  2. 实际上,您的 zpool 是“rpool”,而“rpool/ROOT”是 ZFS 数据集而不是 zpool。

  3. 使用 ,grub-install您只能引用当前目录树。这就是为什么您给它--boot-directory=/boot。脚本本身不想听到有关 ZFS 的任何信息。但在此过程中,GRUB2 中包含的其他辅助脚本将检查那里安装的内容并确保 grub 可以在启动时访问它。因此,如果您使用最新版本的 ZFS,截至撰写本文时,GRUB2 将无法识别它并拒绝在那里安装。唉!

  4. 您确实在“@”之前放置了“/”,这是相关的,因为您自己也承认,否则它对您不起作用。编辑:嗯,它曾经很重要,但对于最后的 git 代码来说,它并不重要。

  5. 最后,恐怕不支持启动到快照。也就是说,虽然您可以告诉 GRUB 使用类似等的东西(hd0,2)mypool/ROOT/myfs@version,但您的实际启动将不是您所期望的。所以不要这样做。

答案2

我刚刚明白了:

命令grub-install错误。--boot-directory需要用/boot代替/rpool/ROOT/ubuntu/boot

现在我这样做了grub-install --boot-directory=/boot,删除了启动文件夹/rpool/ROOT/ubuntu/rpool/ROOT/ubuntu/@并且它启动正常。

让我尝试解释一下:

/rpool/rpool/ROOT是我的 zpools。我认为它们被挂载在那里,这样我就可以访问我可能在这些池中创建的数据集。该文件夹/rpool/ROOT/ubuntu是不必要的,它只是在将文件系统从临时 ext4-fs 复制到 ZFS 池时复制到那里的。我现在删除了它。

Grub 可以很好地找到配置文件/boot,因为它知道 ZFS。它甚至找到了我的快照。这就是路径的用途@

在 grub shell 中,我可以使用(hd0,msdos3)/ROOT/ubuntu(hd0,msdos3)/ROOT/ubuntu@作为实际的当前文件系统,或者如果我有一个名为“version-1”的快照,我可以告诉 grub 使用(hd0,msdos3)/ROOT/ubuntu@version-1。在内核命令行上应该与使用快照作为根文件系统启动相同,linux /ROOT/ubuntu/boot/vmlinuz-3.13.0-45-generic root=ZFS=rpool/ROOT/ubuntu@version-1但我还没有尝试过。如果在拍摄快照后更新了以前的内核,则可能必须加载以前的内核。

相关内容