Esta mensagem ocorre ao sair do menu Grub e antes da tela inicial do Ubuntu.
Como corrijo o problema para limpar a mensagem?
E o que isso significa?
error: Diskfilter writes are not supported
O sistema inicializa e parece funcionar bem.
Esta mensagem ocorre ao sair do menu Grub e antes da tela inicial do Ubuntu.
Como corrijo o problema para limpar a mensagem?
E o que isso significa?
error: Diskfilter writes are not supported
O sistema inicializa e parece funcionar bem.
Respostas:
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
.
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 implementarGRUB_SAVEDEFAULT
Esse comportamento pode ser encontrado em /etc/grub.d/00_header
( update-grub
usa esse arquivo para gerar o /boot/grub/grub.cfg
arquivo):
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
O problema é que a save_env
instrução funciona apenas em instalações simples (você não pode executar save_env
dentro 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_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), a save_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
:
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 .
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:
static grub_err_t
grub_diskfilter_read (grub_disk_t disk, grub_disk_addr_t sector,
grub_size_t size, char *buf)
{
return read_lv (disk->data, sector, size, buf);
}
static grub_err_t
grub_diskfilter_write (grub_disk_t disk __attribute ((unused)),
grub_disk_addr_t sector __attribute ((unused)),
grub_size_t size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"diskfilter writes are not supported");
}
A grub_diskfilter_read
função é implementada (e o GRUB pode ler sistemas de arquivos RAID). No entanto, a grub_diskfilter_write
função gera um GRUB_ERR_NOT_IMPLEMENTED_YET
erro.
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 quando quick_boot=1
. Portanto, alterar quick_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.
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
ou lvm
, pule a save_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.
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
00_header
arquivo funcionou. Não vou desativar o quick_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 novo 00_header
e para executar update-grub
? (Se você acabou de editar 00_header
no lugar, não chmod
é necessário, mas update-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 :
sudo update-grub