Diskfilter write không được hỗ trợ> Điều gì gây ra lỗi này?


88

Thông báo này xảy ra khi rời menu Grub và trước màn hình giật gân Ubuntu.

Làm cách nào để khắc phục sự cố để xóa tin nhắn?

Và ý nghĩa của nó là gì?

error:  Diskfilter writes are not supported

Hệ thống khởi động và dường như chỉ hoạt động tốt.


1
Vẫn chưa được sửa trong Ubuntu Desktop 15.04 ...
ThePiercingPrince

1
Vẫn chưa được sửa trong 16.04. Tốc độ khắc phục lỗi này là khó theo kịp.
Paul Tomblin

Câu trả lời:


145

Đó là một BUG!

Đây là một lỗi xảy ra trong phiên bản Ubuntu Server LTS mới nhất (Ubuntu Server 14.04 LTS), khi bạn tạo phân vùng khởi động (hoặc phân vùng gốc, khi phân vùng khởi động không tồn tại) bên trong phân vùng LVM hoặc RAID .

Bạn có thể nhận thêm thông tin về lỗi này trong Ubuntu Launchpad: Lỗi # 1274320 "Lỗi: ghi đĩa không được hỗ trợ" .

Cập nhật: Lỗi này đã được sửa trong Ubuntu Server 14.04 và một số phiên bản Ubuntu mới hơn. Có lẽ, bạn chỉ cần chạy apt-get upgrade.

Tại sao lỗi này xảy ra?

Khi hệ thống khởi động, GRUB đọc load_envdữ liệu ( ) /boot/grub/grubenv. Tập tin này được gọi là Khối môi trường GRUB .

Từ Hướng dẫn GRUB:

Nó thường hữu ích để có thể nhớ một lượng nhỏ thông tin từ lần khởi động này đến lần khởi động tiếp theo.

[...]

Khi khởi động, lệnh load_env (xem load_env) tải các biến môi trường từ nó và lệnh save_env (xem save_env) lưu các biến môi trường vào nó.

[...]

grub-mkconfig sử dụng cơ sở này để thực hiện GRUB_SAVEDEFAULT

Hành vi này có thể được thành lập trong /etc/grub.d/00_header( update-grubsử dụng tệp này để tạo /boot/grub/grub.cfgtệp):

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

Vấn đề là save_envcâu lệnh chỉ hoạt động trong các cài đặt đơn giản (bạn không thể chạy save_envbên trong đĩa RAID hoặc LVM). Từ hướng dẫn GRUB:

Vì lý do an toàn, bộ lưu trữ này chỉ khả dụng khi được cài đặt trên một đĩa đơn giản (không có LVM hoặc RAID), sử dụng hệ thống tệp không kiểm tra (không có ZFS) và sử dụng các chức năng BIOS hoặc EFI (không có ATA, USB hoặc IEEE1275).

Tính năng bản ghi GRUB sử dụng save_envcâu lệnh để cập nhật trạng thái bản ghi (xem Trợ giúp Ubuntu - Grub 2 , phần "Khởi động lần cuối không thành công hoặc Khởi động vào Chế độ khôi phục"). Tuy nhiên, trong Ubuntu 14.04 (và trong các phiên bản Debian gần đây), save_envcâu lệnh (bên trong tính năng bản ghi) được sử dụng ngay cả khi GRUB được cài đặt trong LVM hoặc RAID.

Chúng ta hãy xem các dòng từ 104 đến 124 trong /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 bỏ qua chính xác tính năng bản ghi khi sử dụng các hệ thống tệp không được hỗ trợ (btrfs, zfs, v.v.), nhưng nó không bỏ qua LVM và RAID bất cứ lúc nào .

GRUB bảo vệ bản thân khỏi việc ghi bên trong RAID và LVM như thế nào?

Để đọc / ghi chính xác trong hệ thống tệp, GRUB tải một mô-đun thích hợp.

GRUB sử dụng mô đun bộ lọc đĩa ( insmod diskfilter) trong các phân vùng RAID và mô đun lvm trong các phân vùng LVM.

Chúng ta hãy xem việc thực hiện đọc / ghi của mô-đun bộ lọc đĩa :

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

Tôi đang dán mã ở đây (các dòng từ 808 đến 823). Cảnh báo cho thấy trong câu hỏi này xuất hiện ở dòng 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");
}

Các grub_diskfilter_readchức năng được thực hiện (và GRUB có thể đọc hệ thống tập tin RAID). Tuy nhiên, grub_diskfilter_writechức năng tăng một GRUB_ERR_NOT_IMPLEMENTED_YETlỗi.

Tại sao sử dụng quick_boot=0giải quyết vấn đề? Và tại sao nó là giải pháp sai?

Nếu bạn nhìn thêm một lần nữa vào /etc/grub.d/00_headermã, bạn sẽ thấy rằng bản ghi đặc trưng chỉ được sử dụng khi quick_boot=1. Vì vậy, việc thay đổi quick_boottừ 1 thành 0 sẽ vô hiệu hóa tính năng recordfail và vô hiệu hóa ghi trong phân vùng RAID / LVM.

Tuy nhiên, nó cũng sẽ vô hiệu hóa nhiều tính năng khác (chạy grep \$quick_boot /etc/grub.d/*và bạn sẽ thấy). Hơn nữa, nếu một ngày nào đó bạn thay đổi /boot/grubthư mục của mình ra bên ngoài RAID / LVM, tính năng bản ghi sẽ vẫn bị tắt.

Cuối cùng, giải pháp này vô hiệu hóa các tính năng một cách không cần thiết và nó không chung chung.

Giải pháp nào là đúng?

Giải pháp chính xác nên xem xét vô hiệu hóa các save_envcâu lệnh khi GRUB nằm trong phân vùng LVM hoặc RAID.

Một bản vá đã được đề xuất trong hệ thống Trình theo dõi lỗi Debian để thực hiện giải pháp này. Nó có thể được tìm thấy trong: https://bugs.debian.org/cgi-bin/ormsreport.cgi?orms=754921

Ý tưởng đằng sau bản vá này là:

  • Chạy một grub-probe --target=abstraction "${grubdir}"lệnh để có được loại mô-đun trừu tượng mà GRUB sử dụng để đọc / ghi tệp trong /boot/grubthư mục;
  • Nếu GRUB sử dụng diskfilterhoặc lvmmô-đun, hãy bỏ qua save_envcâu lệnh recordfail và viết bình luận thích hợp trong /boot/grub/grub.cfgtệp;
    • Ví dụ, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

Làm thế nào để áp dụng giải pháp đúng?

Nếu bạn không muốn đợi bản vá này được áp dụng bởi những người Ubuntu / Debian trong mã chính thức, bạn có thể sử dụng bản vá của tôi 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

Cảm ơn bạn đặc biệt cho các tài liệu tham khảo lỗi. Tôi hy vọng bạn sẽ hiểu rằng tôi tìm thấy giải pháp nux ' hấp dẫn hơn, mặc dù. ;)
Chạy CMD

6
Xin chào @ClassStacker, tôi đã tóm tắt câu trả lời! Nó rất lớn và rất khó để nhiều người hiểu: p Nó vẫn còn lớn, nhưng ít nhất tôi đã tổ chức nó theo từng phần. Vì vậy, bây giờ bạn chỉ có thể nhìn vào các phần quan tâm.
Rarylson Freitas

8
Ồ Cảm ơn bạn. Nếu có tính năng "câu trả lời của tháng", tôi sẽ bỏ phiếu cho bạn. Ngoài ra, bạn xứng đáng nhận giải thưởng "không có BS". Đây là loại bài viết thực sự cung cấp giá trị và tạo ra sự khác biệt lớn giữa mạng trang web này so với các diễn đàn.
Chạy CMD

1
Đáng buồn là tôi đã bị ảnh hưởng bởi lỗi này và không có bản sửa lỗi nào trong báo cáo lỗi hoặc ở đây bằng cách chỉnh sửa 00_headertệp đã hoạt động. Tôi sẽ không vô hiệu hóa quick_bootđể làm cho nó biến mất.
douggro

@douggro Tôi không chắc tại sao 00_headertệp được chỉnh sửa (như được đề xuất ở đây) sẽ không hoạt động. Tôi biết rằng chỉ vì nó hiệu quả với tôi (và cho Rarylson Freitas) không có nghĩa là nó nhất thiết phải có hiệu quả với tất cả mọi người. Nhưng bạn có chắc chắn cung cấp quyền phù hợp cho cũ và mới 00_headervà để chạy update-grubkhông? (Nếu bạn chỉ chỉnh sửa 00_headertại chỗ, không chmodbắt buộc, nhưng update-grubvẫn cần thiết.)
Eliah Kagan

33

Tôi nghĩ rằng lỗi này xảy ra do phân vùng đột kích hoặc LVM .

Để khắc phục tạm thời cho sự cố này:

Biên tập :/etc/grub.d/10_linux

Thay thế 'quick_boot="1"' with 'quick_boot="0"'

Sau đó :

sudo update-grub

Cảm ơn, nó đã làm việc hoàn hảo. Có, tôi đang sử dụng LVM cho tất cả các tập.
RCF

Cảm ơn bạn cho giải pháp này. Nó đã tiết kiệm cho tôi rất nhiều công việc. Bạn có một chút thông tin nền không?
Chạy CMD

@ClassStacker nếu bạn đang yêu cầu thêm thông tin từ nux, bạn cần chỉnh sửa nhận xét của mình để bắt đầu bằng (@nux). Nếu bạn đang hỏi tôi, bạn đang tìm kiếm loại nền nào?
RCF

2
@ RCF-U14.04 1) Không, tôi không phải làm vậy. Chỉ cần nhấp vào "thêm nhận xét" -> "trợ giúp" để biết rằng "Tác giả bài đăng sẽ luôn được thông báo về nhận xét của bạn". 2) Tôi muốn biết (từ nux) tại sao điều này giải quyết vấn đề, đặc biệt là đưa ra câu trả lời mở rộng của Rarylson Freitas. Nhưng nếu bạn có thể trả lời điều đó, hãy thoải mái làm như vậy.
Chạy CMD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.