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.
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.
Odpowiedzi:
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.
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-mkconfigużywa tego narzędzia do wdrożeniaGRUB_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 .
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.
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.
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:
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;diskfilterlub lvm, pomiń instrukcję recordfail save_envi napisz odpowiedni komentarz w /boot/grub/grub.cfgpliku;
# GRUB lacks write support for /dev/md0, so recordfail support is disabled.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
00_headerplik, nie zadziałała. Nie wyłączę, quick_bootżeby to zniknęło.
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.)
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