Como atualizar-grub em um sistema executando overlayroot?

3

Nós enviamos caixas configuradas com camada de superposição , usando o seguinte overlayroot.conf:

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

Que produz a seguinte configuração de montagem:

$ 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)

Como você pode ver, três principais partições físicas: sda1 é / boot, sda5 é uma raiz "de fábrica" somente de leitura, e sda6 é uma raiz de "usuário" que pode ser apagada a qualquer momento para restaurar a máquina à sua estado original de fábrica.

Agora, o problema surge quando o update-grub é executado por qualquer motivo:

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

Compreensível, pois / é um overlayfs.

O conteúdo de /usr/sbin/update-grub é:

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

Com /usr/sbin/grub-mkconfig sendo a parte comercial das coisas. Mas o problema real está em /usr/sbin/grub-probe , chamado pelo grub-mkconfig, e grub-probe é um binário.

Então, minha pergunta é, existe algum parâmetro ou o que pode fazer com que o grub-probe faça a coisa certa em face de / ser um overlayfs? E em segundo lugar, há uma maneira de hackear / corrigir isso para que o script update-grub faça a coisa certa?

Obrigado.

    
por mikepurvis 28.10.2013 / 15:57

2 respostas

1

Minha solução alternativa:

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

Agora, defina-o (em bashrc ou em qualquer outro lugar) e atualize-o:

export GRUB_DEVICE=/dev/sda5
sudo update-grub

Definitivamente não é ideal, mas pode ser muito pior. Será bem-vindo melhorias para este método.

    
por 28.10.2013 / 17:41
0

Parece um bug que deve ser corrigido no próprio Grub. Seria preciso aprender que overlayroot existe e, quando essa situação é detectada, seria necessário cavar um pouco mais para chegar ao dispositivo raiz real.

Se você quiser registrar o bug no Launchpad e adicionar um comentário aqui com o número do bug, eu o trarei e priorizei:

Divulgação completa: sou coautor e co-mantenedor da sobreposição .

    
por 04.11.2013 / 17:41