Diskfilter yazıyor desteklenmiyor Bu hatayı tetikleyen nedir?

86

Bu mesaj Grub menüsünü ve Ubuntu açılış ekranından çıkarken oluşur.

Mesajı temizlemek için sorunu nasıl çözebilirim?

Ve ne demek istiyorsun?

error:  Diskfilter writes are not supported

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

    
sordu RCF 18.05.2014 01:14

2 cevap

143

Bu bir HATA!

Bu, bir LVM içinde önyükleme bölümünü (veya önyükleme bölümü yokken kök bölümü oluşturduğunuzda), Ubuntu Server LTS'nin (Ubuntu Server 14.04 LTS) en son sürümünde oluşan bir hata veya bir RAID bölümü.

Ubuntu Launchpad'de bu hata hakkında daha fazla bilgi edinebilirsiniz: Hata # 1274320 "Hata: diskfilter yazmalar desteklenmiyor ".

Güncelleme: Bu hata Ubuntu Server 14.04 ve bazı yeni Ubuntu sürümlerinde zaten sabitlenmiştir. Muhtemelen, yalnızca apt-get upgrade dosyasını çalıştırmanız gerekir.

Bu hata neden oluşuyor?

Sistem önyüklendiğinde, GRUB load_env cinsinden veri ( /boot/grub/grubenv ) okur. Bu dosya GRUB Ortam Bloğu olarak adlandırılır.

GRUB El Kitabından:

  

Bir önyüklemeden diğerine küçük miktarda bilgiyi hatırlayabilmek genellikle yararlıdır.

     

[...]

     

Önyükleme zamanında, load_env komutu (bkz. load_env) ortam değişkenlerini ondan yükler ve save_env (save_env) komutuna ortam değişkenlerini kaydeder.

     

[...]

     

grub-mkconfig , GRUB_SAVEDEFAULT uygulamak için bu özelliği kullanıyor

Bu davranış /etc/grub.d/00_header 'da ( update-grub /boot/grub/grub.cfg dosyası oluşturmak için bu dosyayı kullanır) kurulabilir:

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

Sorun, save_env ifadesinin yalnızca basit yüklemelerde çalıştığıdır (bir RAID veya LVM diskte save_env çalıştırılamıyor). GRUB kılavuzundan:

  

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

GRUB recordfail özelliği, recordfail durumunu güncellemek için save_env ifadesini kullanır (bkz. Ubuntu Yardımı - Grub 2 , "Son Önyükleme Başarısız veya Kurtarma Moduna Hazırlanıyor" bölümü). Ancak, Ubuntu 14.04'te (ve son Debian sürümlerinde), GRUB bir LVM'de veya bir RAID'de kurulu olsa bile, save_env ifadesi (recordfail özelliğinin içinde) kullanılır.

Satırları /etc/grub.d/00_header 'den 104 ile 124 arasında görelim:

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 recordfail özelliğini doğru bir şekilde atlar, ancak her an LVM ve RAID'yi atlamaz .

GRUB kendini RAID ve LVM içinde yazımdan nasıl koruyor?

Bir dosya sistemlerinde doğru şekilde okuma / yazma 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.

Diskfiltresi 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ırıyorum (808'den 823'e kadar olan satırlar). Bu soruda gösterilen uyarı 821 satırında görünüyor:

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 işlevi uygulandı (ve GRUB, RAID dosya sistemlerini okuyabilir). Ancak, grub_diskfilter_write işlevi GRUB_ERR_NOT_IMPLEMENTED_YET hatasını artırıyor.

quick_boot=0 kullanımı neden sorunu çözüyor? Ve neden bu yanlış çözüm?

/etc/grub.d/00_header kodunda bir kez daha bakarsanız, özellikli recordfail'in yalnızca quick_boot=1 olduğunda kullanıldığını görürsünüz. Bu nedenle, quick_boot değerini 1'den 0'a değiştirmek, recordfail özelliğini devre dışı bırakır ve RAID / LVM bölümündeki yazımları devre dışı bırakır.

Ancak, diğer birçok özelliği de devre dışı bırakır ( grep $quick_boot /etc/grub.d/* dosyasını çalıştırın ve göreceksiniz). Dahası, bir gün /boot/grub dizini RAID / LVM'nin dışına değiştirirseniz, recordfail özelliği yine de devre dışı bırakılacaktır.

Özetle, bu çözüm özellikleri gereksiz yere devre dışı bırakıyor ve genel bir özellik değil.

Doğru çözüm nedir?

Doğru çözüm, GRUB, LVM veya RAID bölümleri içinde olduğunda save_env ifadelerini devre dışı bırakmayı düşünmelidir.

Bu çözümü uygulamak için Debian Bug Tracker sisteminde bir yama önerildi. Şurada bulunabilir: İşte

Bu yamanın ardındaki fikir şudur:

  • GRUB'un grub-probe --target=abstraction "${grubdir}" dizinindeki dosyaları okumak / yazmak için kullandığı soyutlama modülleri türlerini almak için /boot/grub komutunu çalıştırın;
  • GRUB diskfilter veya lvm modülünü kullanıyorsa, recordfail save_env ifadesini atlayın ve /boot/grub/grub.cfg dosyasına uygun bir yorum yazın;
    • Örneğin, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

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

Bu kodun resmi koddaki Ubuntu / Debian üyeleri tarafından uygulanmasını beklemek istemezseniz,% co_de yamacımı kullanabilirim:

# 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
    
verilen cevap Rarylson Freitas 16.07.2014 00:42
33

Bu hatanın baskını veya LVM bölümü nedeniyle oluştuğunu düşünüyorum.

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

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

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

dizinini değiştir

Sonra:

sudo update-grub
    
verilen cevap nux 18.05.2014 02:14

Etiketlerdeki diğer soruları oku