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.

RCF
źródło
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
Rarylson Freitas
źródło
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
nux
źródło
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