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-mkconfig
używa tego narzędzia do wdrożeniaGRUB_SAVEDEFAULT
To zachowanie może być oparte na /etc/grub.d/00_header
( update-grub
używa tego pliku do wygenerowania /boot/grub/grub.cfg
pliku):
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
Problem polega na tym, że save_env
instrukcja działa tylko w prostych instalacjach (nie można uruchomić save_env
na 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_env
instrukcji 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_env
instrukcja (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_read
Funkcja jest realizowana (i GRUB może odczytać systemu plików RAID). Jednak grub_diskfilter_write
funkcja wywołuje GRUB_ERR_NOT_IMPLEMENTED_YET
błąd.
quick_boot=0
rozwiązuje problem? I dlaczego jest to złe rozwiązanie?Jeśli spojrzysz jeszcze raz w /etc/grub.d/00_header
kodzie, zobaczysz, że opisywany błąd zapisu jest używany tylko wtedy, gdy quick_boot=1
. Tak więc zmiana quick_boot
z 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/grub
katalog 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_env
instrukcji, 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/grub
katalogu;diskfilter
lub lvm
, pomiń instrukcję recordfail save_env
i napisz odpowiedni komentarz w /boot/grub/grub.cfg
pliku;
# 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_header
plik, nie zadziałała. Nie wyłączę, quick_boot
żeby to zniknęło.
00_header
plik (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_header
i je uruchomiłeś update-grub
? (Jeśli właśnie edytowałeś 00_header
na miejscu, nie chmod
jest wymagane, ale update-grub
pozostaje 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