Ainda não foi corrigido no Ubuntu Desktop 15.04 ...
ThePiercingPrince
1
Ainda não foi corrigido em 16.04. É difícil acompanhar esse ritmo alucinante de correção de bugs.
Paul Tomblin 08/08
Respostas:
145
É um erro!
Este é um erro que ocorre na versão mais recente do Ubuntu Server LTS (Ubuntu Server 14.04 LTS), quando você cria a partição de inicialização (ou a partição raiz, quando a partição de inicialização não existe) dentro de uma partição LVM ou RAID .
Atualização: Este bug já foi corrigido no Ubuntu Server 14.04 e em algumas versões mais recentes do Ubuntu. Provavelmente, você só precisa executar apt-get upgrade.
Por que esse bug ocorre?
Quando o sistema está inicializando, o GRUB lê ( load_env) os dados /boot/grub/grubenv. Esse arquivo é chamado de bloco de ambiente do GRUB .
No manual do GRUB:
Muitas vezes, é útil poder lembrar uma pequena quantidade de informações de uma inicialização para a seguinte.
[...]
No momento da inicialização, o comando load_env (consulte load_env) carrega variáveis de ambiente e o comando save_env (consulte save_env) salva variáveis de ambiente nele.
[...]
grub-mkconfig usa esse recurso para implementar GRUB_SAVEDEFAULT
Esse comportamento pode ser encontrado em /etc/grub.d/00_header( update-grubusa esse arquivo para gerar o /boot/grub/grub.cfgarquivo):
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
O problema é que a save_envinstrução funciona apenas em instalações simples (você não pode executar save_envdentro de um disco RAID ou LVM). No manual do GRUB:
Por motivos de segurança, esse armazenamento está disponível apenas quando instalado em um disco simples (sem LVM ou RAID), usando um sistema de arquivos sem soma de verificação (sem ZFS) e usando funções BIOS ou EFI (sem ATA, USB ou IEEE1275).
O recurso de registro de falhas do GRUB usa a save_envinstrução para atualizar o estado de falha de registros (consulte a Ajuda do Ubuntu - Grub 2 , seção "Última inicialização falhada ou inicialização no modo de recuperação"). No entanto, no Ubuntu 14.04 (e nas versões recentes do Debian), a save_envinstrução (dentro do recurso recordfail) é usada mesmo se o GRUB estiver instalado em um LVM ou um RAID.
Vamos ver as linhas de 104 a 124 em /etc/grub.d/00_header:
if [ "$quick_boot" = 1 ]; then
[...]
case "$FS" in
btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfs)
cat <<EOF
# GRUB lacks write support for $FS, so recordfail support is disabled.
[...]
if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
O GRUB ignora corretamente o recurso recordfail ao usar sistemas de arquivos não suportados (btrfs, zfs, etc), mas não ignora o LVM e o RAID a qualquer momento .
Como o GRUB se protege contra gravação dentro de RAID e LVM?
Para ler / gravar corretamente em um sistema de arquivos, o GRUB carrega um módulo apropriado.
O GRUB usa o módulo diskfilter ( insmod diskfilter) nas partições RAID e o módulo lvm nas partições LVM.
Vamos ver a implementação de leitura / gravação do módulo diskfilter :
apt-get source grub2
vim grub2-2.02~beta2/grub-core/disk/diskfilter.c
Estou colando o código aqui (linhas de 808 a 823). O aviso mostrado nesta pergunta aparece na linha 821:
A grub_diskfilter_readfunção é implementada (e o GRUB pode ler sistemas de arquivos RAID). No entanto, a grub_diskfilter_writefunção gera um GRUB_ERR_NOT_IMPLEMENTED_YETerro.
Por que o uso quick_boot=0resolve o problema? E por que é a solução errada?
Se você olhar mais uma vez no /etc/grub.d/00_headercódigo, verá que o registro de falha em destaque é usado apenas quando quick_boot=1. Portanto, alterar quick_bootde 1 para 0 desativa o recurso de falha de registro e desativa gravações na partição RAID / LVM.
No entanto, também desabilitará muitos outros recursos (execute grep \$quick_boot /etc/grub.d/*e você verá). Mais ainda, se um dia você mudar seu /boot/grubdiretório para fora do RAID / LVM, o recurso recordfail continuará desativado.
Resumidamente, esta solução desativa desnecessariamente os recursos e não é genérica.
Qual é a solução correta?
A solução correta deve considerar desativar as save_envinstruções quando o GRUB estiver dentro de partições LVM ou RAID.
Execute um grub-probe --target=abstraction "${grubdir}"comando para obter que tipo de módulos de abstração o GRUB usa para ler / gravar arquivos no /boot/grubdiretório;
Se o GRUB usar o módulo diskfilterou lvm, pule a save_envinstrução recordfail e escreva um comentário apropriado no /boot/grub/grub.cfgarquivo;
Por exemplo, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.
Como aplicar a solução correta?
Se você não quiser esperar que esse patch seja aplicado pelos caras do Ubuntu / Debian no código oficial, você pode usar o meu patch 00_header:
# Download
wget https://gist.githubusercontent.com/rarylson/da6b77ad6edde25529b2/raw/99f266a10e663e1829efc25eca6eddb9412c6fdc/00_header_patched
# Apply
mv /etc/grub.d/00_header /etc/grub.d/00_header.orig
mv 00_header_patched /etc/grub.d/00_header
# Disable the old script and enable the new one
chmod -x /etc/grub.d/00_header.orig
chmod +x /etc/grub.d/00_header
# Update Grub
update-grub
Obrigado especialmente pela referência de bug. Espero que você entenda que eu achei a solução do nux mais atraente, no entanto. ;)
Execute o CMD
6
Olá @ClassStacker, resumi a resposta! Era muito grande e era muito difícil para muitas pessoas entenderem: p Ainda é grande, mas pelo menos eu organizei em seções. Então agora você pode procurar apenas nas seções de interesse.
Rarylson Freitas 31/07
8
Uau. Obrigado. Se houvesse um recurso "resposta do mês", eu votaria na sua. Além disso, você merece um prêmio "no BS". Esse é o tipo de artigo que realmente agrega valor e que faz uma enorme diferença entre a rede deste site em comparação com os fóruns.
Execute o CMD
1
Infelizmente, eu fui afetado por esse bug e nenhuma das correções no relatório de bug ou aqui editando o 00_headerarquivo funcionou. Não vou desativar o quick_bootpara fazê-lo desaparecer.
Douggro
@douggro Não sei por que o 00_headerarquivo editado (como recomendado aqui) não funcionaria. Eu sei que só porque funciona para mim (e para Rarylson Freitas) não significa que necessariamente funcionaria para todos. Mas você garantiu as permissões corretas para o antigo e o novo 00_headere para executar update-grub? (Se você acabou de editar 00_headerno lugar, não chmodé necessário, mas update-grubcontinua a ser necessário.)
Elias Kagan
33
Penso que este erro ocorre devido a uma invasão ou partição LVM .
Obrigado, funcionou perfeitamente. Sim, estou usando o LVM para todos os volumes.
RCF
Obrigado por esta solução. Isso me salvou muito trabalho. Você tem um pouco de informação de segundo plano também?
Executar CMD
@ClassStacker, se você estiver solicitando mais informações do nux, precisará editar seu comentário para começar (@nux). Se você está me perguntando, que tipo de histórico você está procurando?
RCF 24/07
2
@ RCF-U14.04 1) Não, não preciso. Basta clicar em "adicionar comentário" -> "ajuda" para saber que "o autor da postagem sempre será notificado do seu comentário". 2) Eu queria saber (do nux) por que isso resolve o problema, especialmente considerando a extensa resposta de Rarylson Freitas. Mas se você puder responder, sinta-se à vontade para fazê-lo.
Respostas:
É um erro!
Este é um erro que ocorre na versão mais recente do Ubuntu Server LTS (Ubuntu Server 14.04 LTS), quando você cria a partição de inicialização (ou a partição raiz, quando a partição de inicialização não existe) dentro de uma partição LVM ou RAID .
Você pode obter mais informações sobre esse bug no Ubuntu Launchpad: Bug # 1274320 "Erro: gravações no diskfilter não são suportadas" .
Atualização: Este bug já foi corrigido no Ubuntu Server 14.04 e em algumas versões mais recentes do Ubuntu. Provavelmente, você só precisa executar
apt-get upgrade
.Por que esse bug ocorre?
Quando o sistema está inicializando, o GRUB lê (
load_env
) os dados/boot/grub/grubenv
. Esse arquivo é chamado de bloco de ambiente do GRUB .No manual do GRUB:
Esse comportamento pode ser encontrado em
/etc/grub.d/00_header
(update-grub
usa esse arquivo para gerar o/boot/grub/grub.cfg
arquivo):O problema é que a
save_env
instrução funciona apenas em instalações simples (você não pode executarsave_env
dentro de um disco RAID ou LVM). No manual do GRUB:O recurso de registro de falhas do GRUB usa a
save_env
instrução para atualizar o estado de falha de registros (consulte a Ajuda do Ubuntu - Grub 2 , seção "Última inicialização falhada ou inicialização no modo de recuperação"). No entanto, no Ubuntu 14.04 (e nas versões recentes do Debian), asave_env
instrução (dentro do recurso recordfail) é usada mesmo se o GRUB estiver instalado em um LVM ou um RAID.Vamos ver as linhas de 104 a 124 em
/etc/grub.d/00_header
:O GRUB ignora corretamente o recurso recordfail ao usar sistemas de arquivos não suportados (btrfs, zfs, etc), mas não ignora o LVM e o RAID a qualquer momento .
Como o GRUB se protege contra gravação dentro de RAID e LVM?
Para ler / gravar corretamente em um sistema de arquivos, o GRUB carrega um módulo apropriado.
O GRUB usa o módulo diskfilter (
insmod diskfilter
) nas partições RAID e o módulo lvm nas partições LVM.Vamos ver a implementação de leitura / gravação do módulo diskfilter :
Estou colando o código aqui (linhas de 808 a 823). O aviso mostrado nesta pergunta aparece na linha 821:
A
grub_diskfilter_read
função é implementada (e o GRUB pode ler sistemas de arquivos RAID). No entanto, agrub_diskfilter_write
função gera umGRUB_ERR_NOT_IMPLEMENTED_YET
erro.Por que o uso
quick_boot=0
resolve o problema? E por que é a solução errada?Se você olhar mais uma vez no
/etc/grub.d/00_header
código, verá que o registro de falha em destaque é usado apenas quandoquick_boot=1
. Portanto, alterarquick_boot
de 1 para 0 desativa o recurso de falha de registro e desativa gravações na partição RAID / LVM.No entanto, também desabilitará muitos outros recursos (execute
grep \$quick_boot /etc/grub.d/*
e você verá). Mais ainda, se um dia você mudar seu/boot/grub
diretório para fora do RAID / LVM, o recurso recordfail continuará desativado.Resumidamente, esta solução desativa desnecessariamente os recursos e não é genérica.
Qual é a solução correta?
A solução correta deve considerar desativar as
save_env
instruções quando o GRUB estiver dentro de partições LVM ou RAID.Um patch foi proposto no sistema Debian Bug Tracker para implementar esta solução. Pode ser encontrado em: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921
A idéia por trás desse patch é:
grub-probe --target=abstraction "${grubdir}"
comando para obter que tipo de módulos de abstração o GRUB usa para ler / gravar arquivos no/boot/grub
diretório;diskfilter
oulvm
, pule asave_env
instrução recordfail e escreva um comentário apropriado no/boot/grub/grub.cfg
arquivo;# GRUB lacks write support for /dev/md0, so recordfail support is disabled.
Como aplicar a solução correta?
Se você não quiser esperar que esse patch seja aplicado pelos caras do Ubuntu / Debian no código oficial, você pode usar o meu patch
00_header
:fonte
00_header
arquivo funcionou. Não vou desativar oquick_boot
para fazê-lo desaparecer.00_header
arquivo editado (como recomendado aqui) não funcionaria. Eu sei que só porque funciona para mim (e para Rarylson Freitas) não significa que necessariamente funcionaria para todos. Mas você garantiu as permissões corretas para o antigo e o novo00_header
e para executarupdate-grub
? (Se você acabou de editar00_header
no lugar, nãochmod
é necessário, masupdate-grub
continua a ser necessário.)Penso que este erro ocorre devido a uma invasão ou partição LVM .
Para uma correção temporária para esse problema:
Editar:
/etc/grub.d/10_linux
Substituir
'quick_boot="1"' with 'quick_boot="0"'
Então :
fonte