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 .
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.
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.
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 .
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ć.
Odpowiedzi:
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:
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):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: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
: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 :
Wklejam tutaj kod (wiersze od 808 do 823). Ostrzeżenie pokazane w tym pytaniu pojawia się w linii 821:
grub_diskfilter_read
Funkcja jest realizowana (i GRUB może odczytać systemu plików RAID). Jednakgrub_diskfilter_write
funkcja wywołujeGRUB_ERR_NOT_IMPLEMENTED_YET
błąd.Dlaczego używanie
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, gdyquick_boot=1
. Tak więc zmianaquick_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.
Jakie jest właściwe rozwiązanie?
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
lublvm
, pomiń instrukcję recordfailsave_env
i napisz odpowiedni komentarz w/boot/grub/grub.cfg
pliku;# 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
:źródło
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 nowemu00_header
i je uruchomiłeśupdate-grub
? (Jeśli właśnie edytowałeś00_header
na miejscu, niechmod
jest wymagane, aleupdate-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 :
źródło