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.
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
.
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émenterGRUB_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 .
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
.
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.
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:
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
;diskfilter
ou lvm
, ignorez l'instruction recordfail save_env
et écrivez un commentaire approprié dans le fichier /boot/grub/grub.cfg
; # GRUB lacks write support for /dev/md0, so recordfail support is disabled.
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
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