如何在运行 overlayroot 的系统上更新 grub?

如何在运行 overlayroot 的系统上更新 grub?

我们运送配置有覆盖根,使用以下 overlayroot.conf:

overlayroot=device:dev=/dev/sda6,timeout=20,recurse=0

产生以下挂载配置:

$ mount
overlayroot on / type overlayfs (rw,errors=remount-ro)
/dev/sda5 on /media/root-ro type ext3 (ro,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered)
/dev/sda6 on /media/root-rw type ext3 (rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered)
/dev/sda1 on /boot type ext3 (rw)

如您所见,三个关键的物理分区:sda1 是 /boot,sda5 是只读的“工厂”根目录,sda6 是“用户”根目录,可以随时擦除以将机器恢复到其原始出厂状态。

现在,当由于某种原因运行 update-grub 时就会出现问题:

$ sudo update-grub
[sudo] password for administrator: 
/usr/sbin/grub-probe: error: cannot find a device for / (is /dev mounted?).

可以理解,因为 / 是一个覆盖。

其内容/usr/sbin/update-grub为:

#!/bin/sh
set -e
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"

/usr/sbin/grub-mkconfig是业务方面的问题。但实际问题在于/usr/sbin/grub-probe,由 grub-mkconfig 调用,grub-probe是一个二进制文件。

所以我的问题是,是否有一个参数或其他东西可以让 grub-probe 在面对 overlayfs 时做正确的事情?其次,有没有办法破解/修补它,以便 update-grub 脚本做正确的事情?

谢谢。

答案1

我的解决方法:

#!/bin/bash

# Patch grub-mkconfig to not probe / when GRUB_DEVICE is set.
cat <<'PATCH' | patch /usr/sbin/grub-mkconfig
+++ /usr/sbin/grub-mkconfig 2013-10-28 11:33:15.000000000 -0400
@@ -129,7 +129,7 @@
 mkdir -p ${GRUB_PREFIX}

 # Device containing our userland.  Typically used for root= parameter.
-GRUB_DEVICE="`${grub_probe} --target=device /`"
+GRUB_DEVICE=${GRUB_DEVICE-"`${grub_probe} --target=device /`"}
 GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true

 # Device containing our /boot partition.  Usually the same as GRUB_DEVICE.
--------------------------------
PATCH

# Pass the GRUB_DEVICE parameter through sudo
echo 'Defaults env_keep +="GRUB_DEVICE"' > /etc/sudoers.d/keep-grub-device
chmod 0440 /etc/sudoers.d/keep-grub-device

现在,设置它(在 bashrc 或其他任何地方)并更新:

export GRUB_DEVICE=/dev/sda5
sudo update-grub

绝对不是最理想的,但可能会更糟。欢迎对此方法进行改进。

答案2

这看起来像是 Grub 本身的一个错误,需要修复。它需要被告知 overlayroot 存在,当检测到这种情况时,它需要更深入地挖掘才能找到真正的 root 设备。

如果你想提交错误发射台,并在此处添加带有错误编号的评论,我将对其进行分类和优先排序:

全面披露:我是覆盖根

相关内容