我按照以下说明使用 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/sda
Grub 已按照说明安装。
无论如何,经过几次重启后,我注意到实际上有一个真正的文件夹/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
根据我自己的经验进行一些更正。
在您创建 rpool 时,您的“rpool”已自动挂载在“/rpool”上。这就是为什么您在配置过程中的某个地方发出命令
zfs set mountpoint=none rpool
以消除该行为。您执行相同的操作以rpool/ROOT
消除其在 /rpool/ROOT 上的自动挂载,而您并不需要这样做。实际上,您的 zpool 是“rpool”,而“rpool/ROOT”是 ZFS 数据集而不是 zpool。
使用 ,
grub-install
您只能引用当前目录树。这就是为什么您给它--boot-directory=/boot
。脚本本身不想听到有关 ZFS 的任何信息。但在此过程中,GRUB2 中包含的其他辅助脚本将检查那里安装的内容并确保 grub 可以在启动时访问它。因此,如果您使用最新版本的 ZFS,截至撰写本文时,GRUB2 将无法识别它并拒绝在那里安装。唉!您确实在“@”之前放置了“/”,这是相关的,因为您自己也承认,否则它对您不起作用。编辑:嗯,它曾经很重要,但对于最后的 git 代码来说,它并不重要。
最后,恐怕不支持启动到快照。也就是说,虽然您可以告诉 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
但我还没有尝试过。如果在拍摄快照后更新了以前的内核,则可能必须加载以前的内核。