Diskfilter लिखते हैं समर्थित नहीं हैं> क्या इस त्रुटि को ट्रिगर करता है?


88

यह संदेश ग्रब मेनू से बाहर निकलने और उबंटू स्प्लैश स्क्रीन से पहले होता है।

मैं संदेश को साफ़ करने के लिए समस्या को कैसे ठीक करूँ?

और क्या मतलब है?

error:  Diskfilter writes are not supported

सिस्टम बूट और बस ठीक काम करने लगता है।


1
अभी भी उबंटू डेस्कटॉप 15.04 में तय नहीं है ...
ThePiercingPrince

1
अभी भी 16.04 में तय नहीं है। बग फिक्सिंग की इस टूटने की गति को बनाए रखना मुश्किल है।
पॉल टॉम्बलिन

जवाबों:


145

यह एक बग है!

यह एक बग है जो उबंटू सर्वर एलटीएस (उबंटू सर्वर 14.04 एलटीएस) के सबसे हाल के संस्करण में होता है, जब आप एक LVM या RAID विभाजन के अंदर बूट विभाजन (या रूट विभाजन, जब बूट विभाजन मौजूद नहीं होता है) बनाते हैं। ।

आप उबंटू लॉन्चपैड में इस बग के बारे में अधिक जानकारी प्राप्त कर सकते हैं: बग # 1274320 "त्रुटि: डिस्कफिल्टर लिखते हैं समर्थित नहीं हैं"

अद्यतन: यह बग पहले से ही Ubuntu सर्वर 14.04 और कुछ नए उबंटू संस्करणों में तय हो गया है। शायद, आपको केवल चलाने की आवश्यकता है apt-get upgrade

यह बग क्यों होता है?

जब सिस्टम बूट हो रहा है, GRUB पढ़ता है ( load_env) में डेटा /boot/grub/grubenv। इस फ़ाइल को GRUB पर्यावरण ब्लॉक कहा जाता है ।

GRUB मैनुअल से:

यह अक्सर उपयोगी होता है कि एक बूट से दूसरे तक जानकारी की एक छोटी मात्रा को याद रखने में सक्षम हो।

[...]

बूट समय पर, load_env कमांड (load_env देखें) इससे पर्यावरण चर को लोड करता है, और save_env (save_env देखें) आदेश पर्यावरण चर को बचाता है।

[...]

grub-mkconfig लागू करने के लिए इस सुविधा का उपयोग करता है GRUB_SAVEDEFAULT

इस व्यवहार को इसमें स्थापित किया जा सकता है /etc/grub.d/00_header( update-grubफ़ाइल को उत्पन्न करने के लिए इस फ़ाइल का उपयोग करता है /boot/grub/grub.cfg):

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

समस्या यह है कि save_envबयान केवल सरल प्रतिष्ठानों में काम करता है (आप save_envएक RAID या LVM डिस्क के अंदर नहीं चला सकते हैं )। GRUB मैनुअल से:

सुरक्षा कारणों से, यह स्टोरेज केवल तब उपलब्ध होता है जब एक सादे डिस्क (कोई LVM या RAID) पर स्थापित किया जाता है, एक गैर-चेकसमिंग फाइल सिस्टम (कोई ZFS) का उपयोग करके, और BIOS या EFI फ़ंक्शन (कोई ATA, USB या IEEE1275) का उपयोग नहीं किया जाता है।

GRUB रिकॉर्डफ़ेल सुविधा save_envरिकॉर्डफ़ाइल स्थिति को अपडेट करने के लिए स्टेटमेंट का उपयोग करती है (देखें उबंटू हेल्प - ग्रब 2 , "लास्ट बूट फ़ेल या बूट इन रिकवरी मोड" सेक्शन)। हालाँकि, उबंटू में 14.04 (और हाल के डेबियन संस्करणों में), save_envकथन (रिकॉर्डफ़ेल सुविधा के अंदर) का उपयोग किया जाता है, भले ही GRUB LVM या RAID में स्थापित हो।

आइए देखें 104 से 124 तक की लाइनें /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 असमर्थित फ़ाइल सिस्टम (btrfs, zfs, आदि) का उपयोग करते समय रिकॉर्डफ़ेल सुविधा को सही ढंग से छोड़ देता है, लेकिन यह किसी भी समय LVM और RAID को छोड़ता नहीं है

GRUB खुद को RAID और LVM के अंदर लिखने से कैसे बचाता है?

फाइलसिस्टम में सही ढंग से पढ़ने / लिखने के लिए, GRUB एक उपयुक्त मॉड्यूल लोड करता है।

GRUB RAID विभाजन में डिस्कफिल्टर मॉड्यूल ( insmod diskfilter) और LVM विभाजन में lvm मॉड्यूल का उपयोग करता है ।

आइए देखें डिस्कफिल्टर मॉड्यूल का पढ़ने / लिखने का कार्यान्वयन :

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

मैं यहां कोड चिपका रहा हूं (808 से 823 तक लाइनें)। इस प्रश्न में दिखाई गई चेतावनी लाइन 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समारोह लागू किया गया है (और GRUB RAID फ़ाइल सिस्टम पढ़ सकते हैं)। हालाँकि, grub_diskfilter_writeफ़ंक्शन कोई GRUB_ERR_NOT_IMPLEMENTED_YETत्रुटि उठाता है ।

quick_boot=0समस्या का समाधान क्यों करता है? और यह गलत समाधान क्यों है?

यदि आप /etc/grub.d/00_headerकोड में एक बार देखते हैं, तो आप देखेंगे कि दर्ज की गई फ़ाइल का उपयोग केवल तभी किया जाता है जब quick_boot=1। इसलिए, quick_boot1 से 0 से बदलकर रिकॉर्डफेल सुविधा को निष्क्रिय कर देता है, और RAID / LVM विभाजन में लिखता है।

हालाँकि, यह कई अन्य सुविधाओं को भी निष्क्रिय grep \$quick_boot /etc/grub.d/*कर देगा (चलाएँ और आप देखेंगे)। अभी तक, यदि एक दिन आप अपनी /boot/grubनिर्देशिका को RAID / LVM के बाहर बदलते हैं , तो रिकॉर्डफ़ेल सुविधा अभी भी अक्षम हो जाएगी।

संक्षेप में, यह समाधान अनावश्यक रूप से सुविधाओं को अक्षम करता है, और यह सामान्य नहीं है।

सही समाधान क्या है?

save_envजब GRUB LVM या RAID विभाजन के अंदर होता है, तो सही समाधान को उन कथनों को निष्क्रिय करना चाहिए ।

इस समाधान को लागू करने के लिए डेबियन बग ट्रैकर प्रणाली में एक पैच प्रस्तावित किया गया था। इसमें पाया जा सकता है: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug/75g21

इस पैच के पीछे का विचार है:

  • निर्देशिका grub-probe --target=abstraction "${grubdir}"में फ़ाइलों को पढ़ने / लिखने के लिए GRUB किस प्रकार के अमूर्त मॉड्यूल प्राप्त करने के लिए एक कमांड चलाता है /boot/grub;
  • यदि GRUB diskfilterया lvmमॉड्यूल का उपयोग करता है , तो रिकॉर्डफाइल save_envस्टेटमेंट को छोड़ दें और /boot/grub/grub.cfgफ़ाइल में एक विनियोजित टिप्पणी लिखें ;
    • उदाहरण के लिए, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

सही समाधान कैसे लागू करें?

यदि आप आधिकारिक कोड में उबंटू / डेबियन लोगों द्वारा इस पैच के लिए इंतजार नहीं करना चाहते हैं, तो आप मेरे पैच का उपयोग कर सकते हैं 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

विशेष रूप से बग संदर्भ के लिए धन्यवाद। मुझे आशा है कि आप समझ जाएंगे कि मुझे नक्स का समाधान अधिक सम्मोहक लगा, हालाँकि। ;)
CMD

6
हाय @ClassStacker, मैं जवाब संक्षेप में! यह बहुत बड़ा था और कई लोगों के लिए यह समझना बहुत मुश्किल था: पी यह अभी भी बड़ा है, लेकिन कम से कम मैंने इसे वर्गों में व्यवस्थित किया। तो अब आप केवल ब्याज के वर्गों में देख सकते हैं।
रार्लिसन फ्रीटास

8
वाह। धन्यवाद। यदि "महीने का जवाब" सुविधा होती, तो मैं आपको वोट देता। इसके अलावा, आप "नो बीएस" पुरस्कार के लायक हैं। यह इस तरह के लेख हैं जो वास्तव में मूल्य प्रदान करते हैं, और जो मंचों की तुलना में इस साइट नेटवर्क के बीच एक बड़ा अंतर रखते हैं।
CMD

1
अफसोस की बात है कि मैं इस बग से प्रभावित हुआ हूं और बग रिपोर्ट में कोई भी सुधार या यहां 00_headerफ़ाइल संपादित करके काम नहीं किया है। मैं quick_bootइसे दूर करने के लिए अक्षम नहीं करूंगा ।
डॉग्रो

@douggro मुझे यकीन नहीं है कि एडिट की गई 00_headerफ़ाइल (जैसा कि यहाँ अनुशंसित है) काम नहीं करेगी। मुझे पता है कि सिर्फ इसलिए कि यह मेरे लिए काम करता है (और Rarylson Freitas के लिए) इसका मतलब यह नहीं है कि यह सभी के लिए काम करेगा। लेकिन क्या आपने पुराने और नए को सही अनुमति देना 00_headerऔर चलाना सुनिश्चित किया है update-grub? (यदि आप सिर्फ 00_headerजगह में संपादित किए गए हैं, तो कोई chmodआवश्यकता नहीं है, लेकिन update-grubआवश्यक है।)
एलियाह कगन

33

मुझे लगता है कि छापे या LVM विभाजन के कारण यह त्रुटि हुई है ।

इस समस्या के लिए एक अस्थायी सुधार के लिए:

संपादित करें:/etc/grub.d/10_linux

बदलने के 'quick_boot="1"' with 'quick_boot="0"'

फिर :

sudo update-grub

धन्यवाद, यह पूरी तरह से काम किया। हां, मैं सभी संस्करणों के लिए LVM का उपयोग कर रहा हूं।
आरसीएफ

इस समाधान के लिए धन्यवाद। इसने मुझे बहुत काम बचाया। क्या आपके पास पृष्ठभूमि की थोड़ी जानकारी भी है?
CMD

@ClassStacker यदि आप nux से अधिक जानकारी मांग रहे हैं, तो आपको (@nux) से शुरू करने के लिए अपनी टिप्पणी संपादित करने की आवश्यकता है। यदि आप मुझसे पूछ रहे हैं, तो आप किस प्रकार की पृष्ठभूमि की तलाश कर रहे हैं?
RCF

2
@ RCF-U14.04 1) नहीं, मुझे नहीं करना है। बस "टिप्पणी जोड़ें" -> "सहायता" पर क्लिक करें यह जानने के लिए कि "पोस्ट लेखक को हमेशा आपकी टिप्पणी के बारे में सूचित किया जाएगा"। 2) मैं जानना चाहता था (नक्स से) यह समस्या क्यों हल करता है, विशेष रूप से Rarylson Freitas द्वारा व्यापक उत्तर दिया गया। लेकिन अगर आप इसका जवाब दे सकते हैं, तो बेझिझक ऐसा करें।
CMD
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.