Diskfilter yazma desteklenmiyor> Bu hatayı ne tetikliyor?


88

Bu mesaj Grub menüsünden çıkarken ve Ubuntu açılış ekranından önce görülür.

Mesajı silmek için sorunu nasıl düzeltebilirim?

Ve bu ne anlama geliyor?

error:  Diskfilter writes are not supported

Sistem önyükleme yapıyor ve iyi çalışıyor gibi görünüyor.


1
Ubuntu Desktop
15.04'te

1
16.04'te hala sabit değil. Bu çığır açıcı hata düzeltme hızına ayak uydurmak zordur.
Paul Tomblin

Yanıtlar:


145

Bu bir böcek!

Bu, bir LVM veya RAID bölümünün içindeki önyükleme bölümünü (veya önyükleme bölümü olmadığında kök bölümünü) oluşturduğunuzda Ubuntu Server LTS'nin (Ubuntu Server 14.04 LTS) en son sürümünde meydana gelen bir hatadır .

Bu hata hakkında daha fazla bilgiyi Ubuntu Launchpad'de bulabilirsiniz: Hata # 1274320 "Hata: diskfilter yazma desteklenmiyor" .

Güncelleme: Bu hata zaten Ubuntu Server 14.04 ve bazı yeni Ubuntu sürümlerinde düzeltildi. Muhtemelen, sadece koşman gerek apt-get upgrade.

Bu hata neden oluyor?

Sistem önyüklenirken GRUB, load_enviçindeki verileri okur /boot/grub/grubenv. Bu dosyaya GRUB Çevre Bloğu denir .

GRUB El Kitabından:

Bir açılıştan diğerine az miktarda bilgi hatırlayabilmek genellikle yararlıdır.

[...]

Önyükleme sırasında, load_env komutu (bkz. Load_env) ortam değişkenlerini buradan yükler ve save_env (bkz: save_env) komutu ortam değişkenlerini buna kaydeder.

[...]

grub-mkconfig uygulamak için bu tesisi kullanır GRUB_SAVEDEFAULT

Bu davranış kurulan edilebilir /etc/grub.d/00_header( update-gruboluşturmak için bu dosyayı kullanır /boot/grub/grub.cfgdosyası):

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

Sorun, save_envifadenin yalnızca basit kurulumlarda işe yaramasıdır ( save_envbir RAID veya LVM diskinde çalışamazsınız ). GRUB el kitabından:

Güvenlik nedenleriyle, bu depolama yalnızca düz bir diske (LVM veya RAID olmadan), kontrol toplamı olmayan bir dosya sistemi (ZFS olmadan) ve BIOS veya EFI işlevlerini kullanarak (ATA, USB veya IEEE1275 olmadan) kullanılabilir.

GRUB kayıt hatası özelliği, save_envkayıt hatası durumunu güncellemek için ifadeyi kullanır (bkz. Ubuntu Yardım - Grub 2 , "Son Önyükleme Başarısız Oldu veya Kurtarma Moduna Başlatma" bölümü). Bununla birlikte, Ubuntu 14.04'te (ve son Debian versiyonlarında), save_envGRUB bir LVM'ye veya RAID'e kurulsa bile , ifade (kayıt hatası özelliğinin içinde) kullanılır.

104'den 124'e kadar olan satırları görelim /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, desteklenmeyen dosya sistemlerini (btrfs, zfs, vb.) Kullanırken kayıt hatası özelliğini doğru atlar, ancak hiçbir zaman LVM ve RAID'i atlamaz .

GRUB, RAID ve LVM içine yazmaktan nasıl korunur?

Bir dosya sisteminde doğru okumak / yazmak için GRUB uygun bir modül yükler.

GRUB, RAID bölümlerinde diskfilter modülünü ( insmod diskfilter) ve LVM bölümlerinde lvm modülünü kullanır.

Diskfilter modülünün okuma / yazma uygulamasını görelim :

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

Kodu buraya yapıştıracağım (satır 808 - 823). Bu soruda gösterilen uyarı 821 satırında görünür:

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_readFonksiyonu (ve GRUB RAID dosya sistemleri okuyabilir) uygulanmaktadır. Ancak, grub_diskfilter_writeişlev bir GRUB_ERR_NOT_IMPLEMENTED_YEThataya neden olur.

Neden kullanmak quick_boot=0sorunu çözüyor? Ve neden yanlış bir çözüm?

/etc/grub.d/00_headerKodda bir kez daha bakarsanız , özellikli kaydın yalnızca ne zaman kullanıldığını göreceksiniz quick_boot=1. Bu nedenle, quick_boot1'den 0'a değiştirmek , kayıt hatası özelliğini devre dışı bırakır ve RAID / LVM bölümünde yazmayı devre dışı bırakır.

Ancak, diğer birçok özelliği de devre dışı bırakacaktır (çalıştırın grep \$quick_boot /etc/grub.d/*ve göreceksiniz). Dahası, bir gün /boot/grubdizinizi RAID / LVM dışına değiştirirseniz, kayıt hatası özelliği hala devre dışı kalır.

Özetle, bu çözüm gereksiz yere özellikleri devre dışı bırakır ve genel değildir.

Doğru çözüm nedir?

Doğru çözüm save_env, GRUB LVM veya RAID bölümlerinin içindeyken ifadeleri devre dışı bırakmayı düşünmelidir .

Bu çözümü uygulamak için Debian Bug Tracker sisteminde bir yama önerildi. Bu bulunabilir: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921

Bu yamanın arkasındaki fikir:

  • grub-probe --target=abstraction "${grubdir}"GRUB /boot/grubdizindeki dosyaları okumak / yazmak için ne tür soyutlama modüllerini kullandığını öğrenmek için bir komut çalıştırın ;
  • GRUB diskfilterveya lvmmodülünü kullanıyorsa, recordfail save_envdeyimini atlayın ve dosyaya uygun bir yorum /boot/grub/grub.cfgyazın;
    • Örneğin, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

Doğru çözüm nasıl uygulanır?

Bu yamayı beklemek istemiyorsanız resmi koddaki Ubuntu / Debian adamları tarafından uygulanacaksa yamalarımı kullanabilirsiniz 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

Özellikle hata referansı için teşekkürler. Umarım nux'un çözümünü daha çekici bulduğumu anlarsınız . ;)
CMD

6
Merhaba @ ClassStacker, cevabı özetledim! Çok büyüktü ve birçok insanın anlaması çok zordu: p Hala büyük, ama en azından bölümler halinde organize ettim. Şimdi sadece ilgilendiğiniz bölümlere bakabilirsiniz.
Rarylson Freitas

8
Vay. Teşekkür ederim. "Ayın cevabı" özelliği olsaydı, senin için oy kullanırdım. Ayrıca, "BS yok" ödülünü hak ediyorsun. Bu, gerçekten değer sağlayan ve forumlarla karşılaştırıldığında bu site ağı arasında büyük bir fark yaratan yazı türüdür.
Çalıştır CMD

1
Ne yazık ki bu hatadan etkilendim ve hata raporundaki düzeltmelerin hiçbiri ya da burada 00_headerdosyayı düzenleyerek işe yaramadı. Bunu quick_bootortadan kaldırmak için onu etkisiz hale getirmeyeceğim.
douggro

@douggro Düzenlenen 00_headerdosyanın (burada tavsiye edildiği şekilde) neden işe yaramadığından emin değilim . Bunun sadece benim için (ve Rarylson Freitas için) işe yaraması, mutlaka herkes için işe yarayacağı anlamına gelmiyor. Fakat eski ve yeniye doğru olan izinleri verdiğinizden 00_headerve kaçtığınızdan emin update-grubmisiniz? (Yeni düzenlediğiniz takdirde 00_headeryerinde, hiçbir chmodgerekli, ancak update-grubgerekli kalır.)
Eliah Kagan

33

Bu hatanın baskın veya LVM bölümünden kaynaklandığını düşünüyorum.

Bu sorunla ilgili geçici bir düzeltme için:

Düzenle :/etc/grub.d/10_linux

değiştirmek 'quick_boot="1"' with 'quick_boot="0"'

Sonra :

sudo update-grub

Teşekkürler, mükemmel çalıştı. Evet, tüm hacimler için LVM kullanıyorum.
RCF

Bu çözüm için teşekkür ederim. Bana çok iş kazandırdı. Biraz da arka plan bilgin var mı?
Çalıştır CMD

@ClassStacker nux'tan daha fazla bilgi istiyorsanız, (@nux) ile başlamak için yorumunuzu düzenlemeniz gerekir. Bana soruyorsan, ne tür bir arka plan arıyorsun?
RCF,

2
@ RCF-U14.04 1) Hayır, mecbur değilim. "Yazarı yazara her zaman yorumunuzdan haberdar olun" ifadesini öğrenmek için sadece "yorum ekle" -> "yardım" seçeneğine tıklayın. 2) neden bu sorunu çözdüğünü (nux'dan) bilmek istedim, özellikle Rarylson Freitas tarafından verilen geniş cevap. Fakat buna cevap verebilirseniz, bunu yapmaktan çekinmeyin.
Çalıştır CMD
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.