ข้อความนี้จะเกิดขึ้นเมื่อออกจากเมนู Grub และก่อนที่หน้าจอ Splash ของ Ubuntu
ฉันจะแก้ไขปัญหาเพื่อล้างข้อความได้อย่างไร
และมันหมายความว่าอย่างไร
error: Diskfilter writes are not supported
บูทระบบและดูเหมือนว่าจะทำงานได้ดี
ข้อความนี้จะเกิดขึ้นเมื่อออกจากเมนู Grub และก่อนที่หน้าจอ Splash ของ Ubuntu
ฉันจะแก้ไขปัญหาเพื่อล้างข้อความได้อย่างไร
และมันหมายความว่าอย่างไร
error: Diskfilter writes are not supported
บูทระบบและดูเหมือนว่าจะทำงานได้ดี
คำตอบ:
นี่เป็นข้อผิดพลาดที่เกิดขึ้นใน 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 จะโหลดโมดูลที่เหมาะสม
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
ไดเรกทอรี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
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