grub2-install não funciona na primeira vez, mas funciona pela segunda vez

2

Este é um estranho ...

Estou trabalhando em algum software. Tem uma função para tornar um dispositivo USB inicializável. Ele faz isso executando uma sequência longa e complexa de ações para copiar um SO Linux mínimo no dispositivo e, em seguida, instalar o GRUB2 como o carregador de inicialização. O problema é que, no final deste procedimento, o dispositivo não inicializa. O GRUB2 carrega, mas cai em um shell de recuperação e reclama que não pode ser encontrado [qualquer que seja o UUID da partição de inicialização atualmente]. O UUID sobre o qual ele está reclamando está definitivamente correto.

O comando real que meu software está executando é o seguinte:

grub2-install --boot-directory=/mnt/boot /dev/sdb

O comando sai com o código 0, e diz no stdout "instalação concluída, nenhum erro reportado". E ainda assim, o GRUB não inicializa.

Aqui está a parte estranhamente estranha: se eu digitar manualmente o comando exato acima, o dispositivo se torna inicializável. Tudo funciona perfeitamente. Mas quando o software executa este comando automaticamente, algo dá errado ... Que diabos ??

Alguém tem a menor idéia de por que esse comportamento pode ocorrer? Existem variáveis de ambiente das quais o script de instalação depende? Que tipos de modificações em disco poderiam perturbar o GRUB? Existe alguma maneira de ver o que é alterado na segunda vez em que executo o script?

Editar: OpenSUSE 12.2, tudo está sendo executado como root . (Algum outro usuário ainda permitido mexer com o MBR de um disco?)

Editar: env retorna resultados quase idênticos do software e de um terminal. (Algumas variáveis, como PWD , SHLVL , WINDOWID , eram diferentes, mas não vejo como isso é relevante.)

Edit: Eu tentei ter o meu software apenas executar o comando duas vezes. Isso não fez diferença. Então é realmente uma diferença de ambiente de algum tipo ...

    
por MathematicalOrchid 18.02.2014 / 17:24

1 resposta

2

Ah-HAH!

O aplicativo monta o sistema de arquivos um pouco diferente do que eu estou fazendo na linha de comando.

Na linha de comando, eu faço

mount /dev/sdb12 /mnt

Mas o aplicativo usa um sistema whizzy que analisa a tabela de partições e faz algo como

mount /dev/sdb /mnt -rw -o offset=32784,limit=8598543

Aparentemente, grub2-install tem uma opção --debug não documentada. Se eu executar a instalação a partir do aplicativo e da linha de comando usando essa opção e diff da saída, posso ver que, no aplicativo, está falando sobre /dev/loop0 em vez de /dev/sdb . Também suspeito é a linha que lê

< + modules=' biosdisk fat  '
---
> + modules=' biosdisk fat  part_gpt '

Dado que o disco é particionado por GPT, eu esperaria que este módulo fosse necessário.

Portanto, parece que montar o sistema de arquivos neste mannar confunde o script de alguma forma. Agora, para ver se consigo consertar isso ou não ...

    
por 18.02.2014 / 18:46

Tags