Diskfilter-Schreibvorgänge werden nicht unterstützt. Was löst diesen Fehler aus?

86

Diese Meldung erscheint beim Verlassen des Grub-Menüs und vor dem Ubuntu-Begrüßungsbildschirm.

Wie behebe ich das Problem, um die Nachricht zu löschen?

Und was bedeutet es?

error:  Diskfilter writes are not supported

System startet und scheint gut zu funktionieren.

    
RCF 18.05.2014, 01:14

2 Antworten

143

Es ist ein Fehler!

Dies ist ein Fehler, der in der neuesten Version von Ubuntu Server LTS (Ubuntu Server 14.04 LTS) auftritt, wenn Sie die Boot-Partition (oder die Root-Partition, wenn die Boot-Partition nicht existiert) innerhalb eines LVM oder eine RAID-Partition.

Sie können mehr Informationen über diesen Fehler in Ubuntu Launchpad erhalten: Fehler # 1274320 "Fehler: diskfilter Schreibvorgänge werden nicht unterstützt ".

Update: Dieser Fehler wurde bereits in Ubuntu Server 14.04 und einigen neueren Ubuntu-Versionen behoben. Wahrscheinlich müssen Sie nur apt-get upgrade ausführen.

Warum tritt dieser Fehler auf?

Beim Systemstart liest GRUB ( load_env ) Daten in /boot/grub/grubenv . Diese Datei heißt GRUB Environment Block .

Aus dem GRUB-Handbuch:

  

Es ist oft nützlich, sich eine kleine Menge von Informationen von einem Boot zum nächsten merken zu können.

     

[...]

     

Beim Booten lädt der Befehl load_env (siehe load_env) Umgebungsvariablen daraus und der Befehl save_env (siehe save_env) speichert Umgebungsvariablen.

     

[...]

     

grub-mkconfig verwendet diese Möglichkeit, um GRUB_SAVEDEFAULT

zu implementieren

Dieses Verhalten kann in /etc/grub.d/00_header erstellt werden ( update-grub verwendet diese Datei, um die /boot/grub/grub.cfg -Datei zu generieren):

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

Das Problem besteht darin, dass die Anweisung save_env nur in einfachen Installationen funktioniert (Sie können save_env nicht innerhalb einer RAID- oder LVM-Festplatte ausführen). Aus dem GRUB-Handbuch:

  

Aus Sicherheitsgründen ist dieser Speicher nur verfügbar, wenn er auf einer Festplatte (kein LVM oder RAID) installiert ist, ein Dateisystem ohne Prüfsummen verwendet (kein ZFS) und BIOS- oder EFI-Funktionen verwendet (kein ATA, USB oder IEEE1275) .

Die Funktion GRUB recordfail verwendet die save_env -Anweisung, um den Status von recordfail zu aktualisieren (siehe Ubuntu Hilfe - Grub 2 , Abschnitt "Letzter Start fehlgeschlagen oder Start in den Wiederherstellungsmodus". In Ubuntu 14.04 (und in neueren Debian-Versionen) wird jedoch die save_env -Anweisung (innerhalb der Recordfail-Funktion) verwendet, selbst wenn GRUB in einem LVM oder einem RAID installiert ist.

Sehen wir die Zeilen von 104 bis 124 in /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 überspringt korrekt die Funktion recordfail, wenn nicht unterstützte Dateisysteme (btrfs, zfs, etc) verwendet werden, aber LVM und RAID werden nicht zu jeder Zeit übersprungen .

Wie schützt sich GRUB davor, in RAID und LVM zu schreiben?

Um in einem Dateisystem korrekt zu lesen / schreiben, lädt GRUB ein entsprechendes Modul.

GRUB verwendet das Modul diskfilter ( insmod diskfilter ) in RAID-Partitionen und das lvm -Modul in LVM-Partitionen.

Sehen wir uns die Read / Write-Implementierung des Moduls diskfilter an:

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

Ich gebe hier den Code ein (Zeilen von 808 bis 823). Die Warnung in dieser Frage erscheint in Zeile 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");
}

Die Funktion grub_diskfilter_read ist implementiert (und GRUB kann RAID-Dateisysteme lesen). Die Funktion grub_diskfilter_write löst jedoch einen Fehler GRUB_ERR_NOT_IMPLEMENTED_YET aus.

Warum löst die Verwendung von quick_boot=0 das Problem? Und warum ist es die falsche Lösung?

Wenn du noch einmal im /etc/grub.d/00_header -Code nachschaust, wirst du sehen, dass der angegebene recordfail nur benutzt wird, wenn quick_boot=1 . Wenn also quick_boot von 1 auf 0 geändert wird, wird die Funktion recordfail deaktiviert und Schreibvorgänge in der RAID / LVM-Partition deaktiviert.

Es werden jedoch auch viele andere Funktionen deaktiviert (führen Sie grep $quick_boot /etc/grub.d/* aus und Sie werden sehen). Noch mehr, wenn Sie Ihr /boot/grub -Verzeichnis eines Tages außerhalb von RAID / LVM ändern, wird die Funktion recordfail immer noch deaktiviert.

Kurz gesagt, diese Lösung deaktiviert unnötigerweise Funktionen und ist nicht generisch.

Was ist die richtige Lösung?

Die korrekte Lösung sollte die save_env -Anweisungen deaktivieren, wenn GRUB innerhalb von LVM- oder RAID-Partitionen ist.

Im Debian Bug Tracker System wurde ein Patch zur Implementierung dieser Lösung vorgeschlagen. Es kann gefunden werden in: link

Die Idee hinter diesem Patch ist:

  • Führen Sie einen Befehl grub-probe --target=abstraction "${grubdir}" aus, um zu ermitteln, welche Art von Abstraktionsmodulen GRUB zum Lesen / Schreiben von Dateien im Verzeichnis /boot/grub verwendet;
  • Wenn GRUB das Modul diskfilter oder lvm verwendet, überspringen Sie die Anweisung recordfail save_env und schreiben Sie einen passenden Kommentar in die Datei /boot/grub/grub.cfg ;
    • Zum Beispiel # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

Wie man die richtige Lösung anwendet?

Wenn du nicht darauf warten willst, dass dieser Patch von den Ubuntu / Debian-Jungs im offiziellen Code angewendet wird, kannst du meine gepatchte 00_header :

verwenden
# 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
    
Rarylson Freitas 16.07.2014, 00:42
33

Ich denke, dass dieser Fehler wegen Raid oder LVM Partition auftritt.

Für eine temporäre Lösung für dieses Problem:

Bearbeiten: /etc/grub.d/10_linux

Ersetzen Sie 'quick_boot="1"' with 'quick_boot="0"'

Dann:

sudo update-grub
    
nux 18.05.2014 02:14

Tags und Links