ไม่รองรับการเขียน Diskfilter> อะไรที่ทำให้เกิดข้อผิดพลาดนี้?


88

ข้อความนี้จะเกิดขึ้นเมื่อออกจากเมนู Grub และก่อนที่หน้าจอ Splash ของ Ubuntu

ฉันจะแก้ไขปัญหาเพื่อล้างข้อความได้อย่างไร

และมันหมายความว่าอย่างไร

error:  Diskfilter writes are not supported

บูทระบบและดูเหมือนว่าจะทำงานได้ดี


1
ยังไม่ได้รับการแก้ไขใน Ubuntu Desktop 15.04 ...
ThePiercingPrince

1
ยังไม่ได้รับการแก้ไขใน 16.04 การแก้ไขจุดบกพร่องที่ไม่หยุดยั้งนี้เป็นเรื่องยากที่จะติดตาม
Paul Tomblin

คำตอบ:


145

มันเป็นข้อผิดพลาด!

นี่เป็นข้อผิดพลาดที่เกิดขึ้นใน Ubuntu Server รุ่นล่าสุดของ LTS (เซิร์ฟเวอร์ Ubuntu 14.04 LTS) เมื่อคุณสร้างพาร์ติชันสำหรับเริ่มระบบ (หรือพาร์ติชันรากเมื่อพาร์ติชันสำหรับบูตไม่มีอยู่) ภายใน LVM หรือพาร์ติชัน RAID .

คุณสามารถได้รับข้อมูลเพิ่มเติมเกี่ยวกับปัญหานี้ในอูบุนตู Launchpad: bug # 1274320 "ข้อผิดพลาด: เขียน diskfilter ไม่สนับสนุน"

อัปเดต:ข้อบกพร่องนี้ได้รับการแก้ไขแล้วใน Ubuntu Server 14.04 และ Ubuntu รุ่นใหม่กว่าบางรุ่น apt-get upgradeอาจเป็นคุณจะต้องทำงาน

เหตุใดข้อผิดพลาดนี้จึงเกิดขึ้น

เมื่อระบบบูตด้วงอ่าน ( load_env) /boot/grub/grubenvข้อมูลใน ไฟล์นี้จะเรียกว่าด้วงสิ่งแวดล้อมบล็อก

จากคู่มือ 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 recordfailใช้save_envคำสั่งเพื่ออัพเดตสถานะบันทึก (ดูวิธีใช้ Ubuntu - Grub 2 , "การบูตครั้งล่าสุดล้มเหลวหรือบูตเข้าสู่โหมดการกู้คืน") อย่างไรก็ตามใน Ubuntu 14.04 (และในรุ่น Debian ล่าสุด) 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

ด้วงอย่างถูกต้องข้ามคุณลักษณะ recordfail เมื่อใช้ระบบไฟล์ที่ไม่สนับสนุน (btrfs, ZFS ฯลฯ ) แต่ก็ไม่ได้ข้าม LVM และ RAID ในช่วงเวลาใด

GRUB ป้องกันตัวเองจากการเขียนภายใน RAID และ LVM อย่างไร

ในการอ่าน / เขียนอย่างถูกต้องในระบบไฟล์ GRUB จะโหลดโมดูลที่เหมาะสม

GRUB ใช้โมดูลdiskfilter ( insmod diskfilter) ในพาร์ติชั่น RAID และโมดูล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รหัสคุณจะเห็นว่า recordfail quick_boot=1ที่โดดเด่นจะใช้เฉพาะเมื่อ ดังนั้นการเปลี่ยนquick_bootจาก 1 เป็น 0 จะเป็นการปิดการใช้งานคุณสมบัติ recordfail และปิดการใช้งานการเขียนในพาร์ติชั่น RAID / LVM

อย่างไรก็ตามมันจะปิดการใช้งานคุณสมบัติอื่น ๆ อีกมากมาย (เรียกใช้grep \$quick_boot /etc/grub.d/*แล้วคุณจะเห็น) ยิ่งกว่านั้นถ้าวันหนึ่งคุณเปลี่ยน/boot/grubไดเรกทอรีเป็นนอก RAID / LVM คุณสมบัติบันทึกจะยังคงปิดใช้งาน

โดยสรุปแล้วโซลูชันนี้จะปิดใช้งานคุณสมบัติโดยไม่จำเป็นและไม่ใช่คุณสมบัติทั่วไป

ทางออกที่ถูกต้องคืออะไร?

โซลูชันที่ถูกต้องควรพิจารณาปิดใช้งานsave_envคำสั่งเมื่อ GRUB อยู่ในพาร์ติชัน LVM หรือ RAID

มีการเสนอแพตช์หนึ่งในระบบ Debian Bug Tracker เพื่อใช้โซลูชันนี้ สามารถพบได้ใน: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921

แนวคิดเบื้องหลังแพทช์นี้คือ:

  • เรียกใช้grub-probe --target=abstraction "${grubdir}"คำสั่งเพื่อรับโมดูล abstraction ชนิดใดที่ GRUB ใช้เพื่ออ่าน / เขียนไฟล์ใน/boot/grubไดเรกทอรี
  • หาก GRUB ใช้diskfilterหรือlvmโมดูลให้ข้ามsave_envคำสั่งrecordfail และเขียนความคิดเห็นที่เหมาะสมใน/boot/grub/grub.cfgไฟล์
    • ตัวอย่างเช่น, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

จะใช้วิธีแก้ไขปัญหาที่ถูกต้องได้อย่างไร

หากคุณไม่ต้องการรอให้แพตช์นี้ถูกนำไปใช้โดยพวก Ubuntu / Debian ในรหัสอย่างเป็นทางการคุณสามารถใช้แพทช์ของฉัน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

ขอบคุณโดยเฉพาะสำหรับการอ้างอิงข้อผิดพลาด ฉันหวังว่าคุณจะเข้าใจว่าฉันพบโซลูชันของ nux ที่น่าสนใจมากกว่านี้ ;)
เรียกใช้ CMD

6
สวัสดี @ClassStacker ฉันสรุปคำตอบ! มันใหญ่มากและเป็นเรื่องยากมากที่หลาย ๆ คนจะเข้าใจ: p มันยังใหญ่อยู่ แต่อย่างน้อยฉันก็จัดการมันในส่วนต่างๆ ดังนั้นตอนนี้คุณสามารถดูได้เฉพาะในส่วนที่สนใจ
Rarylson Freitas

8
ว้าว. ขอขอบคุณ. หากมีคุณสมบัติ "คำตอบของเดือน" ฉันจะลงคะแนนให้คุณ นอกจากนี้คุณควรได้รับรางวัล "no BS" นี่คือประเภทของบทความที่ให้คุณค่าและสร้างความแตกต่างอย่างมากระหว่างเครือข่ายไซต์นี้เมื่อเทียบกับฟอรัม
เรียกใช้ CMD

1
น่าเศร้าที่ฉันได้รับผลกระทบจากข้อผิดพลาดนี้และไม่มีการแก้ไขใด ๆ ในรายงานข้อบกพร่องหรือที่นี่โดยการแก้ไข00_headerไฟล์ทำงานได้ ฉันจะไม่ปิดการใช้งานquick_bootเพื่อให้หายไป
douggro

@douggro ฉันไม่แน่ใจว่าทำไม00_headerไฟล์ที่แก้ไข(ตามคำแนะนำที่นี่) ไม่ทำงาน ฉันรู้ว่าเพียงเพราะมันใช้งานได้สำหรับฉัน (และสำหรับ Rarylson Freitas) ไม่ได้หมายความว่ามันจำเป็นสำหรับทุกคน แต่คุณแน่ใจหรือไม่ว่าจะให้สิทธิ์ที่ถูกต้องแก่ทั้งเก่าและใหม่00_headerและเพื่อให้ทำงานได้update-grub? (ถ้าคุณเพิ่งแก้ไข 00_headerในสถานที่ที่ไม่chmodจำเป็น แต่update-grubยังคงจำเป็น.)
Eliah Kagan

33

ฉันคิดว่าข้อผิดพลาดนี้เกิดขึ้นเนื่องจากการโจมตีหรือพาร์ทิชันLVM

สำหรับการแก้ไขชั่วคราวสำหรับปัญหานี้:

แก้ไข:/etc/grub.d/10_linux

แทนที่ 'quick_boot="1"' with 'quick_boot="0"'

จากนั้น:

sudo update-grub

ขอบคุณมันทำงานได้อย่างสมบูรณ์ ใช่ฉันใช้ LVM สำหรับทุกเล่ม
RCF

ขอบคุณสำหรับการแก้ปัญหานี้ มันช่วยให้ฉันทำงานเยอะมาก คุณมีข้อมูลพื้นหลังบ้างไหม?
เรียกใช้ CMD

@ClassStacker หากคุณขอข้อมูลเพิ่มเติมจาก nux คุณต้องแก้ไขความคิดเห็นของคุณเพื่อเริ่มต้นด้วย (@nux) หากคุณถามฉันคุณกำลังมองหาภูมิหลังประเภทใด
RCF

2
@ RCF-U14.04 1) ไม่ฉันไม่ต้องทำ เพียงคลิกที่ "เพิ่มความคิดเห็น" -> "ความช่วยเหลือ" เพื่อเรียนรู้ว่า "ผู้เขียนโพสต์จะได้รับแจ้งความคิดเห็นของคุณเสมอ" 2) ฉันต้องการทราบ (จาก nux) ว่าเหตุใดจึงแก้ปัญหานี้ได้โดยเฉพาะอย่างยิ่งได้รับคำตอบที่กว้างขวางโดย Rarylson Freitas แต่ถ้าคุณสามารถตอบได้อย่าลังเลที่จะทำเช่นนั้น
เรียกใช้ CMD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.