यह संदेश ग्रब मेनू से बाहर निकलने और उबंटू स्प्लैश स्क्रीन से पहले होता है।
मैं संदेश को साफ़ करने के लिए समस्या को कैसे ठीक करूँ?
और क्या मतलब है?
error: Diskfilter writes are not supported
सिस्टम बूट और बस ठीक काम करने लगता है।
यह संदेश ग्रब मेनू से बाहर निकलने और उबंटू स्प्लैश स्क्रीन से पहले होता है।
मैं संदेश को साफ़ करने के लिए समस्या को कैसे ठीक करूँ?
और क्या मतलब है?
error: Diskfilter writes are not supported
सिस्टम बूट और बस ठीक काम करने लगता है।
जवाबों:
यह एक बग है जो उबंटू सर्वर एलटीएस (उबंटू सर्वर 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 एक उपयुक्त मॉड्यूल लोड करता है।
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_boot
1 से 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
;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
00_header
फ़ाइल संपादित करके काम नहीं किया है। मैं quick_boot
इसे दूर करने के लिए अक्षम नहीं करूंगा ।
00_header
फ़ाइल (जैसा कि यहाँ अनुशंसित है) काम नहीं करेगी। मुझे पता है कि सिर्फ इसलिए कि यह मेरे लिए काम करता है (और Rarylson Freitas के लिए) इसका मतलब यह नहीं है कि यह सभी के लिए काम करेगा। लेकिन क्या आपने पुराने और नए को सही अनुमति देना 00_header
और चलाना सुनिश्चित किया है update-grub
? (यदि आप सिर्फ 00_header
जगह में संपादित किए गए हैं, तो कोई chmod
आवश्यकता नहीं है, लेकिन update-grub
आवश्यक है।)
मुझे लगता है कि छापे या LVM विभाजन के कारण यह त्रुटि हुई है ।
इस समस्या के लिए एक अस्थायी सुधार के लिए:
संपादित करें:/etc/grub.d/10_linux
बदलने के 'quick_boot="1"' with 'quick_boot="0"'
फिर :
sudo update-grub