Las escrituras de Diskfilter no son compatibles. ¿Qué desencadena este error?

86

Este mensaje aparece al salir del menú de Grub y antes de la pantalla de inicio de Ubuntu.

¿Cómo soluciono el problema para borrar el mensaje?

¿Y qué significa?

error:  Diskfilter writes are not supported

El sistema arranca y parece funcionar bien.

    
pregunta RCF 18.05.2014 - 01:14

2 respuestas

143

¡Es un ERROR!

Este es un error que ocurre en la versión más reciente de Ubuntu Server LTS (Ubuntu Server 14.04 LTS), cuando crea la partición de arranque (o la partición raíz, cuando la partición de arranque no existe) dentro de un LVM o una partición RAID.

Puede obtener más información sobre este error en Ubuntu Launchpad: Error # 1274320 "Error: diskfilter las escrituras no son compatibles ".

Actualización: Este error ya está solucionado en Ubuntu Server 14.04 y en algunas versiones más nuevas de Ubuntu. Probablemente, solo necesita ejecutar apt-get upgrade .

¿Por qué ocurre este error?

Cuando el sistema está arrancando, GRUB lee ( load_env ) datos en /boot/grub/grubenv . Este archivo se llama GRUB Environment Block .

Del manual de GRUB:

  

A menudo es útil poder recordar una pequeña cantidad de información de un inicio al siguiente.

     

[...]

     

En el momento del arranque, el comando load_env (ver load_env) carga variables de entorno desde él, y el comando save_env (ver save_env) le guarda variables de entorno.

     

[...]

     

grub-mkconfig usa esta instalación para implementar GRUB_SAVEDEFAULT

Este comportamiento puede fundarse en /etc/grub.d/00_header ( update-grub usa este archivo para generar el archivo /boot/grub/grub.cfg ):

if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi

El problema es que la instrucción save_env solo funciona en instalaciones simples (no se puede ejecutar save_env dentro de un disco RAID o LVM). Del manual de GRUB:

  

Por razones de seguridad, este almacenamiento solo está disponible cuando está instalado en un disco simple (sin LVM o RAID), utilizando un sistema de archivos sin sumas de comprobación (sin ZFS) y utilizando funciones BIOS o EFI (sin ATA, USB o IEEE1275) .

La función GRUB grabar falla usa la declaración save_env para actualizar el estado de falla de grabación (ver Ayuda de Ubuntu - Grub 2 , sección "Último inicio fallido o arranque en modo de recuperación"). Sin embargo, en Ubuntu 14.04 (y en versiones recientes de Debian), se utiliza la instrucción save_env (dentro de la característica de falla de grabación) incluso si GRUB está instalado en un LVM o un RAID.

Veamos las líneas del 104 al 124 en /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

GRUB omite correctamente la función de pérdida de grabación cuando utiliza sistemas de archivos no soportados (btrfs, zfs, etc.), pero no omite LVM y RAID en ningún momento .

¿Cómo se protege GRUB de escribir en RAID y LVM?

Para leer / escribir correctamente en un sistema de archivos, GRUB carga un módulo apropiado.

GRUB usa el módulo diskfilter ( insmod diskfilter ) en las particiones RAID y el módulo lvm en las particiones LVM.

Veamos la implementación de lectura / escritura del módulo diskfilter :

apt-get source grub2
vim grub2-2.02~beta2/grub-core/disk/diskfilter.c

Pegaré el código aquí (líneas del 808 al 823). La advertencia que se muestra en esta pregunta aparece en la línea 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");
}

La función grub_diskfilter_read está implementada (y GRUB puede leer los sistemas de archivos RAID). Sin embargo, la función grub_diskfilter_write genera un error de GRUB_ERR_NOT_IMPLEMENTED_YET .

¿Por qué usar quick_boot=0 resuelve el problema? ¿Y por qué es la solución incorrecta?

Si mira una vez más en el código /etc/grub.d/00_header , verá que el error de registro presentado solo se usa cuando quick_boot=1 . Por lo tanto, si se cambia quick_boot de 1 a 0, se desactivará la función de falla de grabación y se inhabilitarán las escrituras en la partición RAID / LVM.

Sin embargo, también desactivará muchas otras características (ejecute grep $quick_boot /etc/grub.d/* y verá). Aún más, si un día cambia su directorio /boot/grub a fuera de RAID / LVM, la función de falla de grabación seguirá desactivada.

En resumen, esta solución desactiva innecesariamente las características y no es genérica.

¿Cuál es la solución correcta?

La solución correcta debería considerar deshabilitar las sentencias save_env cuando GRUB está dentro de particiones LVM o RAID.

Se propuso un parche en el sistema Debian Bug Tracker para implementar esta solución. Se puede encontrar en: enlace

La idea detrás de este parche es:

  • Ejecuta un comando grub-probe --target=abstraction "${grubdir}" para obtener qué tipo de módulos de abstracción utiliza GRUB para leer / escribir archivos en el directorio /boot/grub ;
  • Si GRUB usa el módulo diskfilter o lvm , omita la sentencia recordfail save_env y escriba un comentario apropiado en el archivo /boot/grub/grub.cfg ;
    • Por ejemplo, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

¿Cómo aplicar la solución correcta?

Si no quiere esperar a que este parche sea aplicado por los chicos Ubuntu / Debian en el código oficial, puede usar mi parche 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
    
respondido por el Rarylson Freitas 16.07.2014 - 00:42
33

Creo que este error se debe a una incursión o LVM partición.

Para una solución temporal para este problema:

Editar: /etc/grub.d/10_linux

Reemplazar 'quick_boot="1"' with 'quick_boot="0"'

Entonces:

sudo update-grub
    
respondido por el nux 18.05.2014 - 02:14

Lea otras preguntas en las etiquetas