Vraag Diskfilter-schrijven wordt niet ondersteund> Wat triggert deze fout?


Dit bericht verschijnt wanneer u het GRAM-menu en vóór het Ubuntu-startscherm verlaat.

Hoe los ik het probleem op om het bericht te wissen?

En wat betekent dat?

error:  Diskfilter writes are not supported

Systeemlaarzen en lijkt goed te werken.


86
2018-05-17 23:14


oorsprong


Nog steeds niet opgelost in Ubuntu Desktop 15.04 ... - ThePiercingPrince
Nog steeds niet opgelost in 16.04. Dit razendsnelle tempo van het oplossen van bugs is moeilijk bij te houden. - Paul Tomblin


antwoorden:


Het is een BUG!

Dit is een bug die voorkomt in de meest recente versie van Ubuntu Server LTS (Ubuntu Server 14.04 LTS), wanneer u de opstartpartitie (of de rootpartitie, wanneer de opstartpartitie niet bestaat) in een LVM of een RAID-partitie maakt .

U kunt meer informatie over deze fout in Ubuntu Launchpad krijgen: Fout # 1274320 "Fout: schrijfbewerkingen op schijf worden niet ondersteund".

Bijwerken: Deze bug is al opgelost in Ubuntu Server 14.04 en enkele nieuwere Ubuntu-versies. Waarschijnlijk hoeft u alleen maar te rennen apt-get upgrade.

Waarom doet deze fout zich voor?

Wanneer het systeem opstart, leest GRUB (load_env) gegevens in /boot/grub/grubenv. Dit bestand wordt genoemd GRUB Environment Block.

Uit de GRUB-handleiding:

Het is vaak handig om een ​​kleine hoeveelheid informatie van de ene boot naar de volgende te onthouden.

[...]

Tijdens het opstarten laadt de opdracht load_env (zie load_env) omgevingsvariabelen van de opdracht en slaat de opdracht save_env (see save_env) milieuvariabelen op.

[...]

grub-mkconfig gebruikt deze faciliteit om te implementeren GRUB_SAVEDEFAULT

Dit gedrag kan worden gesticht in /etc/grub.d/00_header (update-grub gebruikt dit bestand om het te genereren /boot/grub/grub.cfg het dossier):

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

Het probleem is dat de save_env statement werkt alleen in eenvoudige installaties (je kunt niet uitvoeren save_env in een RAID- of LVM-schijf). Uit de GRUB-handleiding:

Om veiligheidsredenen is deze opslag alleen beschikbaar wanneer geïnstalleerd op een gewone schijf (geen LVM of RAID), met behulp van een niet-controlesysteem (geen ZFS) en met behulp van BIOS- of EFI-functies (geen ATA, USB of IEEE1275).

De GRUB recordfail functie gebruikt de save_env verklaring om de recordfail-status bij te werken (zie Ubuntu Help - Grub 2, "Last Boot Failed of Boot into Recovery Mode" sectie). In Ubuntu 14.04 (en in recente Debian-versies) echter, is de save_env statement (binnen de functie recordfail) wordt gebruikt, zelfs als GRUB is geïnstalleerd in een LVM of een RAID.

Laten we de regels van 104 tot 124 zien /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 slaat de recordfail-functie correct over bij gebruik van niet-ondersteunde bestandssystemen (btrfs, zfs, enz.), Maar het slaat LVM en RAID op elk moment niet over.

Hoe beschermt GRUB zichzelf tegen het schrijven in RAID en LVM?

Om correct in een bestandssysteem te lezen / schrijven, laadt GRUB een geschikte module.

GRUB gebruikt de diskfilter module (insmod diskfilter) in RAID-partities en de lvm module in LVM-partities.

Laten we de lees / schrijf-implementatie van de diskfilter module:

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

Ik plak de code hier (regels van 808 tot 823). De waarschuwing die in deze vraag wordt weergegeven, verschijnt op regel 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");
}

De grub_diskfilter_read functie is geïmplementeerd (en GRUB kan RAID-bestandssystemen lezen). echter, de grub_diskfilter_writefunctie verhoogt a GRUB_ERR_NOT_IMPLEMENTED_YET fout.

Waarom gebruikt het quick_boot=0 het probleem oplossen? En waarom is het de verkeerde oplossing?

Als je nog een keer kijkt in de /etc/grub.d/00_header code, zult u zien dat de weergegeven recordfail alleen wordt gebruikt wanneer quick_boot=1. Dus, veranderen quick_boot van 1 tot 0 schakelt de functie recordfail uit en schakelt schrijfacties in de RAID / LVM-partitie uit.

Het zal echter ook vele andere functies uitschakelen (uitvoeren grep \$quick_boot /etc/grub.d/* en je zult zien). Als je op een dag je verandert /boot/grub map naar buiten de RAID / LVM, zal de recordfail-functie nog steeds uitgeschakeld zijn.

Kortom, deze oplossing schakelt functies onnodig uit en is niet generiek.

Wat is de juiste oplossing?

De juiste oplossing zou moeten overwegen om de save_env uitspraken wanneer GRUB zich binnen LVM- of RAID-partities bevindt.

Er is één patch voorgesteld in het Debian Bug Tracker-systeem om deze oplossing te implementeren. Het kan worden gevonden in: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921

Het idee achter deze patch is:

  • Voer een uit grub-probe --target=abstraction "${grubdir}" commando om te krijgen wat voor soort abstractie modules GRUB gebruikt om bestanden te lezen / schrijven in de /boot/grub directory;
  • Als GRUB de diskfilter of lvm module, sla recordfail over save_env verklaring en schrijf een geëigend commentaar in de /boot/grub/grub.cfg het dossier;
    • Bijvoorbeeld, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

Hoe de juiste oplossing toe te passen?

Als je niet wilt wachten tot deze patch door de Ubuntu / Debian-jongens in de officiële code wordt toegepast, kun je mijn patched gebruiken 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

143
2017-07-15 22:42



Bedankt voor de foutreferentie. Ik hoop dat je het zult begrijpen dat ik heb gevonden nux 'oplossing wel overtuigender. ;) - Run CMD
Hallo @ClassStacker, ik vat het antwoord samen! Het was heel groot en het was heel moeilijk voor veel mensen om het te begrijpen: p Het is nog steeds groot, maar ik heb het in ieder geval in secties georganiseerd. Dus nu kun je alleen in de secties van belang kijken. - Rarylson Freitas
Wauw. Dank je. Als er een "antwoord van de maand" -functie was, zou ik op de uwe stemmen. Je verdient ook een "geen BS" -prijs. Dit zijn de soort artikelen die echt waarde bieden en die een groot verschil maken tussen dit sitenetwerk in vergelijking met fora. - Run CMD
Helaas ben ik getroffen door deze bug en geen van de oplossingen in het bugrapport of hier door het bewerken van 00_header bestand heeft gewerkt. Ik zal het. Niet uitschakelen quick_boot om het weg te laten gaan. - douggro
@douggro Ik weet niet zeker waarom de bewerkte 00_header bestand (zoals hier aanbevolen) zou niet werken. Ik weet dat het alleen maar omdat het voor mij werkt (en voor Rarylson Freitas) niet betekent dat het noodzakelijkerwijs voor iedereen zou werken. Maar heb je ervoor gezorgd dat je de juiste toestemmingen geeft aan het oude en het nieuwe 00_headeren om te rennen update-grub? (Als u zojuist hebt bewerkt 00_header op zijn plaats, nee chmod is verplicht, maar update-grub blijft noodzakelijk.) - Eliah Kagan


Ik denk dat deze fout optreedt vanwege inval of LVM partitie.

Voor een tijdelijke oplossing voor dit probleem:

Bewerk :/etc/grub.d/10_linux 

Vervangen 'quick_boot="1"' with 'quick_boot="0"'

Dan :

sudo update-grub

33
2018-05-18 00:14



Bedankt, het werkte perfect. Ja, ik gebruik LVM voor alle volumes. - RCF
Bedankt voor deze oplossing. Het heeft me veel werk bespaard. Heb je ook een beetje achtergrondinformatie? - Run CMD
@ClassStacker als u om meer info van nux vraagt, moet u uw commentaar aanvankelijk bewerken met (@nux). Als u mij vraagt, naar wat voor soort achtergrond zoekt u? - RCF
@ RCF-U14.04 1) Nee, dat hoeft niet. Klik gewoon op "reactie toevoegen" -> "help" om te leren dat "de auteur van het bericht altijd op de hoogte wordt gebracht van uw reactie". 2) Ik wilde weten (van nux) waarom dit het probleem oplost, vooral gezien het uitgebreide antwoord van Rarylson Freitas. Maar als u dat kunt beantwoorden, voel u dan vrij om dat te doen. - Run CMD