web-dev-qa-db-fra.com

Les écritures sur disque ne sont pas supportées> Qu'est-ce qui déclenche cette erreur?

Ce message apparaît lorsque vous quittez le menu Grub et avant l'écran de démarrage Ubuntu.

Comment résoudre le problème pour effacer le message?

Et qu'est-ce que cela signifie?

error:  Diskfilter writes are not supported

Le système démarre et semble fonctionner correctement.

87
RCF

C'est un bogue!

Il s'agit d'un bogue qui survient dans la version la plus récente d'Ubuntu Server LTS (Ubuntu Server 14.04 LTS) lorsque vous créez la partition de démarrage (ou la partition racine, lorsque la partition de démarrage n'existe pas) dans une partition LVM ou RAID. .

Vous pouvez obtenir plus d'informations sur ce bogue dans Ubuntu Launchpad: Bug # 1274320 "Erreur: les écritures sur filtre de disque ne sont pas prises en charge" .

Mise à jour: Ce bogue est déjà corrigé dans Ubuntu Server 14.04 et dans certaines versions plus récentes d’Ubuntu. Probablement, vous n’avez besoin que d’exécuter apt-get upgrade.

Pourquoi ce bug se produit?

Lors du démarrage du système, GRUB lit (load_env) les données dans /boot/grub/grubenv. Ce fichier s'appelle Bloc d'environnement GRUB .

Depuis le GRUB Manual:

Il est souvent utile de pouvoir se souvenir d’une petite quantité d’informations d’un démarrage à l’autre.

[...]

Au démarrage, la commande load_env (voir load_env) charge les variables d'environnement à partir de celle-ci, et la commande save_env (voir save_env) lui enregistre les variables d'environnement.

[...]

grub-mkconfig utilise cette fonctionnalité pour implémenter GRUB_SAVEDEFAULT

Ce comportement peut être constaté dans /etc/grub.d/00_header (update-grub utilise ce fichier pour générer le fichier /boot/grub/grub.cfg):

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

Le problème est que l'instruction save_env ne fonctionne que dans les installations simples (vous ne pouvez pas exécuter save_env dans un disque RAID ou LVM). À partir du manuel GRUB:

Pour des raisons de sécurité, ce stockage est uniquement disponible lorsqu’il est installé sur un disque ordinaire (sans LVM ou RAID), avec un système de fichiers n’ayant pas de poids (sans ZFS) et avec les fonctions BIOS ou EFI (sans ATA, USB ou IEEE1275).

La fonction GRUB recordfail utilise l'instruction save_env pour mettre à jour l'état de recordfail (voir Aide Ubuntu - Grub 2 =, Section "Échec du dernier démarrage ou démarrage en mode de récupération"). Cependant, dans Ubuntu 14.04 (et dans les versions récentes de Debian), l’instruction save_env (à l’intérieur de la fonction recordfail) est utilisée même si GRUB est installé dans un LVM ou un RAID.

Voyons les lignes de 104 à 124 dans /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 ignore correctement la fonction recordfail lors de l’utilisation de systèmes de fichiers non pris en charge (btrfs, zfs, etc.), mais ne saute pas LVM et RAID à tout moment .

Comment GRUB se protège-t-il de l'écriture dans RAID et LVM?

Pour lire/écrire correctement dans un système de fichiers, GRUB charge un module approprié.

GRUB utilise le module diskfilter (insmod diskfilter) des partitions RAID et le lvm module dans les partitions LVM.

Voyons l'implémentation en lecture/écriture du module diskfilter :

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

Je colle le code ici (lignes 808 à 823). L'avertissement indiqué dans cette question apparaît à la ligne 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 fonction grub_diskfilter_read est implémentée (et GRUB peut lire les systèmes de fichiers RAID). Toutefois, la fonction grub_diskfilter_write génère une erreur GRUB_ERR_NOT_IMPLEMENTED_YET.

Pourquoi l'utilisation de quick_boot=0 résout-elle le problème? Et pourquoi est-ce la mauvaise solution?

Si vous regardez une fois de plus dans le code /etc/grub.d/00_header, vous verrez que la fonction recordfail sélectionnée n’est utilisée que lorsque quick_boot=1. Ainsi, changer quick_boot de 1 à 0 désactive la fonction recordfail et désactive les écritures dans la partition RAID/LVM.

Cependant, il désactivera de nombreuses autres fonctionnalités (lancez grep \$quick_boot /etc/grub.d/* et vous verrez). Plus encore, si un jour vous modifiez votre répertoire /boot/grub en dehors du RAID/LVM, la fonction recordfail sera toujours désactivée.

En résumé, cette solution désactive inutilement les fonctionnalités, et ce n’est pas générique.

Quelle est la bonne solution?

La solution appropriée doit envisager de désactiver les instructions save_env lorsque GRUB se trouve dans des partitions LVM ou RAID.

Un correctif a été proposé dans le système de suivi des bogues Debian pour implémenter cette solution. Vous pouvez le trouver dans: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921

L'idée derrière ce patch est:

  • Exécutez une commande grub-probe --target=abstraction "${grubdir}" pour obtenir le type de modules d'abstraction utilisés par GRUB pour lire/écrire des fichiers dans le répertoire /boot/grub;
  • Si GRUB utilise le module diskfilter ou lvm, ignorez l'instruction recordfail save_env et écrivez un commentaire approprié dans le fichier /boot/grub/grub.cfg;
    • Par exemple, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

Comment appliquer la bonne solution?

Si vous ne voulez pas attendre que ce correctif soit appliqué par les gars d'Ubuntu/Debian dans le code officiel, vous pouvez utiliser mon correctif 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
144
Rarylson Freitas

Je pense que cette erreur se produit à cause de la partition raid ou LVM.

Pour une solution temporaire à ce problème:

Éditer: /etc/grub.d/10_linux

Remplacer 'quick_boot="1"' with 'quick_boot="0"'

Ensuite :

Sudo update-grub
33
nux