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.
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.
Câu trả lời:
Đâ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
.
Khi hệ thống khởi động, GRUB đọc load_env
dữ 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ệnGRUB_SAVEDEFAULT
Hành vi này có thể được thành lập trong /etc/grub.d/00_header
( update-grub
sử dụng tệp này để tạo /boot/grub/grub.cfg
tệp):
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
Vấn đề là save_env
câu lệnh chỉ hoạt động trong các cài đặt đơn giản (bạn không thể chạy save_env
bê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_env
câ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_env
câ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 .
Để đọ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_read
chứ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_write
chức năng tăng một GRUB_ERR_NOT_IMPLEMENTED_YET
lỗi.
quick_boot=0
giả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_header
mã, 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_boot
từ 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/grub
thư 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 chính xác nên xem xét vô hiệu hóa các save_env
câ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à:
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/grub
thư mục;diskfilter
hoặc lvm
mô-đun, hãy bỏ qua save_env
câu lệnh recordfail và viết bình luận thích hợp trong /boot/grub/grub.cfg
tệp;
# GRUB lacks write support for /dev/md0, so recordfail support is disabled.
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
00_header
tệp đã hoạt động. Tôi sẽ không vô hiệu hóa quick_boot
để làm cho nó biến mất.
00_header
tệ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_header
và để chạy update-grub
không? (Nếu bạn chỉ chỉnh sửa 00_header
tại chỗ, không chmod
bắt buộc, nhưng update-grub
vẫn cần thiết.)
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