Ubuntu

如何在執行 overlayroot 的系統上更新 grub?

  • January 25, 2019

我們使用以下 overlayroot.conf 發布配置了overlayroot的盒子:

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 腳本做正確的事情?

謝謝。

我的解決方法:

#!/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

絕對不理想,但可能會更糟。歡迎改進此方法。

引用自:https://serverfault.com/questions/549166