Назад | Перейти на главную страницу

Как обновить-grub в системе с overlayroot?

Мы отправляем коробки с корень, используя следующий 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?).

Понятно, поскольку / - это overlayfs.

Содержание /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

Определенно не идеально, но могло быть намного хуже. Будем рады улучшениям в этом методе.

Это похоже на ошибку, которую следует исправить в самом Grub. Его нужно научить, что overlayroot существует, и когда эта ситуация будет обнаружена, нужно будет копнуть немного глубже, чтобы добраться до реального корневого устройства.

Если вы хотите зарегистрировать ошибку в Панель запускаи добавьте сюда комментарий с номером ошибки, я отсортирую его и расставлю по приоритетам:

Полное раскрытие информации: я соавтор и соавтор корень.