Zapisy w Diskfilter nie są obsługiwane> Co powoduje ten błąd?


88

Ten komunikat pojawia się przy opuszczaniu menu Grub i przed ekranem powitalnym Ubuntu.

Jak rozwiązać problem, aby usunąć komunikat?

A co to doe?

error:  Diskfilter writes are not supported

System uruchamia się i wydaje się działać dobrze.


1
Wciąż nie naprawiony w Ubuntu Desktop 15.04 ...
— ThePiercingPrince

1
Nadal nie naprawiony w 16.04. Trudno nadążyć za tym zawrotnym tempem naprawiania błędów.
— Paul Tomblin,

Odpowiedzi:


145

BŁĄD!

Jest to błąd występujący w najnowszej wersji Ubuntu Server LTS (Ubuntu Server 14.04 LTS) podczas tworzenia partycji rozruchowej (lub partycji głównej, gdy partycja rozruchowa nie istnieje) wewnątrz partycji LVM lub RAID .

Możesz uzyskać więcej informacji o tym błędzie w Ubuntu Launchpad: Bug # 1274320 „Błąd: zapisy z filtrowania dysku nie są obsługiwane” .

Aktualizacja: Ten błąd został już naprawiony w Ubuntu Server 14.04 i niektórych nowszych wersjach Ubuntu. Prawdopodobnie musisz tylko biegać apt-get upgrade.

Dlaczego ten błąd występuje?

Podczas uruchamiania systemu GRUB odczytuje ( load_env) dane /boot/grub/grubenv. Ten plik nazywa się GRUB Environment Block .

Z podręcznika GRUB:

Często przydaje się zapamiętywanie niewielkiej ilości informacji między kolejnymi uruchomieniami.

[...]

W czasie rozruchu polecenie load_env (patrz load_env) ładuje z niego zmienne środowiskowe, a polecenie save_env (patrz save_env) zapisuje w nim zmienne środowiskowe.

[...]

grub-mkconfig używa tego narzędzia do wdrożenia GRUB_SAVEDEFAULT

To zachowanie może być oparte na /etc/grub.d/00_header( update-grubużywa tego pliku do wygenerowania /boot/grub/grub.cfgpliku):

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

Problem polega na tym, że save_envinstrukcja działa tylko w prostych instalacjach (nie można uruchomić save_envna dysku RAID lub LVM). Z instrukcji GRUB:

Ze względów bezpieczeństwa ta pamięć jest dostępna tylko wtedy, gdy jest instalowana na zwykłym dysku (bez LVM lub RAID), przy użyciu systemu plików bez sprawdzania sumy kontrolnej (bez ZFS) i przy użyciu funkcji BIOS lub EFI (bez ATA, USB lub IEEE1275).

Funkcja GRUB Recordfail używa save_envinstrukcji do aktualizacji stanu Recordfail (patrz Pomoc Ubuntu - Grub 2 , sekcja „Błąd ostatniego uruchomienia lub rozruch w trybie odzyskiwania”). Jednak w Ubuntu 14.04 (i najnowszych wersjach Debiana) save_envinstrukcja (wewnątrz funkcji recordfail) jest używana, nawet jeśli GRUB jest zainstalowany w LVM lub RAID.

Zobaczmy linie od 104 do 124 w /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 poprawnie pomija funkcję Recordfail podczas korzystania z nieobsługiwanych systemów plików (btrfs, zfs itp.), Ale w żadnym momencie nie pomija LVM i RAID .

W jaki sposób GRUB chroni się przed pisaniem w RAID i LVM?

Aby poprawnie odczytać / zapisać w systemach plików, GRUB ładuje odpowiedni moduł.

GRUB używa modułu diskfilter ( insmod diskfilter) na partycjach RAID oraz modułu lvm na partycjach LVM.

Zobaczmy implementację odczytu / zapisu modułu diskfilter :

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

Wklejam tutaj kod (wiersze od 808 do 823). Ostrzeżenie pokazane w tym pytaniu pojawia się w linii 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");
}

grub_diskfilter_readFunkcja jest realizowana (i GRUB może odczytać systemu plików RAID). Jednak grub_diskfilter_writefunkcja wywołuje GRUB_ERR_NOT_IMPLEMENTED_YETbłąd.

Dlaczego używanie quick_boot=0rozwiązuje problem? I dlaczego jest to złe rozwiązanie?

Jeśli spojrzysz jeszcze raz w /etc/grub.d/00_headerkodzie, zobaczysz, że opisywany błąd zapisu jest używany tylko wtedy, gdy quick_boot=1. Tak więc zmiana quick_bootz 1 na 0 wyłącza funkcję Recordfail i zapisuje na partycji RAID / LVM.

Jednak spowoduje to wyłączenie wielu innych funkcji (uruchom, grep \$quick_boot /etc/grub.d/*a zobaczysz). Co więcej, jeśli pewnego dnia zmienisz /boot/grubkatalog na poza RAID / LVM, funkcja nagrywania rekordów nadal będzie wyłączona.

Podsumowując, to rozwiązanie niepotrzebnie wyłącza funkcje i nie jest ogólne.

Jakie jest właściwe rozwiązanie?

Prawidłowe rozwiązanie powinno rozważyć wyłączenie save_envinstrukcji, gdy GRUB znajduje się w partycjach LVM lub RAID.

Zaproponowano jedną łatkę w systemie śledzenia błędów Debiana w celu wdrożenia tego rozwiązania. Można go znaleźć w: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921

Ideą tej łatki jest:

  • Uruchom grub-probe --target=abstraction "${grubdir}"polecenie, aby uzyskać informacje na temat modułów abstrakcyjnych używanych przez GRUB do odczytu / zapisu plików w /boot/grubkatalogu;
  • Jeśli GRUB używa modułu diskfilterlub lvm, pomiń instrukcję recordfail save_envi napisz odpowiedni komentarz w /boot/grub/grub.cfgpliku;
    • Na przykład, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

Jak zastosować prawidłowe rozwiązanie?

Jeśli nie chcesz czekać na zastosowanie tej poprawki przez facetów Ubuntu / Debian w oficjalnym kodzie, możesz użyć mojej łatki 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

Dziękujemy szczególnie za odniesienie do błędu. Mam nadzieję, że zrozumiecie, że rozwiązanie Nux jest bardziej atrakcyjne. ;)
— Uruchom CMD

6
Cześć @ClassStacker, streściłem odpowiedź! Był bardzo duży i bardzo trudno było go zrozumieć wielu osobom: p Jest wciąż duży, ale przynajmniej zorganizowałem go w sekcje. Więc teraz możesz szukać tylko w interesujących sekcjach.
— Rarylson Freitas

8
Łał. Dziękuję Ci. Jeśli byłaby funkcja „odpowiedź miesiąca”, głosowałbym na twoją. Zasługujesz także na nagrodę „brak BS”. Jest to rodzaj artykułów, które naprawdę dostarczają wartość i które robią ogromną różnicę między siecią witryn w porównaniu z forami.
— Uruchom CMD

1
Niestety ten błąd mnie dotknął i żadna z poprawek w raporcie o błędzie ani tutaj, edytując 00_headerplik, nie zadziałała. Nie wyłączę, quick_bootżeby to zniknęło.
— douggro

@douggro Nie jestem pewien, dlaczego edytowany 00_headerplik (zgodnie z zaleceniami tutaj) nie działa. Wiem, że to, że działa dla mnie (i dla Rarylson Freitas), nie oznacza, że ​​niekoniecznie zadziałałoby dla wszystkich. Ale czy upewniłeś się, że nadałeś odpowiednie uprawnienia staremu i nowemu 00_headeri je uruchomiłeś update-grub? (Jeśli właśnie edytowałeś 00_headerna miejscu, nie chmodjest wymagane, ale update-grubpozostaje konieczne.)
— Eliah Kagan

33

Myślę, że ten błąd występuje z powodu raidu lub partycji LVM .

Aby tymczasowo rozwiązać ten problem:

Edytować :/etc/grub.d/10_linux

Zastąpić 'quick_boot="1"' with 'quick_boot="0"'

Następnie :

sudo update-grub

Dzięki, działało idealnie. Tak, używam LVM dla wszystkich woluminów.
— RCF

Dziękuję za to rozwiązanie. Zaoszczędziło mi to dużo pracy. Czy masz też trochę informacji w tle?
— Uruchom CMD

@ClassStacker, jeśli pytasz o więcej informacji od Nux, musisz edytować swój komentarz, aby zacząć od (@nux). Jeśli pytasz mnie, jakiego rodzaju tła szukasz?
— RCF

2
@ RCF-U14.04 1) Nie, nie muszę. Po prostu kliknij „dodaj komentarz” -> „pomoc”, aby dowiedzieć się, że „autor postu zawsze będzie powiadamiany o twoim komentarzu”. 2) Chciałem wiedzieć (od samego początku), dlaczego to rozwiązuje problem, zwłaszcza biorąc pod uwagę obszerną odpowiedź Rarylson Freitas. Ale jeśli możesz na to odpowiedzieć, możesz to zrobić.
— Uruchom CMD
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.