Это сообщение происходит при отъезде меню Grub и перед экраном-заставкой Ubuntu.
Как я решаю проблему для очистки сообщения?
И какая самка это является средним?
error: Diskfilter writes are not supported
Начальные загрузки системы и, кажется, работают просто великолепно.
Эта ошибка возникает в самой последней версии Ubuntu Server LTS (Ubuntu Server 14.04 LTS) при создании загрузочного раздела (или корневого раздела, при загрузке). раздел не существует) внутри LVM или раздела RAID.
Вы можете получить больше информации об этой ошибке в Ubuntu Launchpad: Ошибка # 1274320 «Ошибка: записи в дисковый фильтр не поддерживаются» .
Обновление: Эта ошибка уже исправлена в Ubuntu Server 14.04 и некоторых более новых версиях Ubuntu. Вероятно, вам нужно всего лишь запустить apt-get upgrade
.
Когда система загружается, GRUB считывает (load_env
) данные в /boot/grub/grubenv
. Этот файл называется Блок среды GRUB .
Из Руководства по GRUB:
Часто полезно иметь возможность запоминать небольшое количество информации от одной загрузки к другой.
[...]
Во время загрузки команда load_env (см. Load_env) загружает из нее переменные среды, а команда save_env (см. Save_env) сохраняет в ней переменные среды.
[...]
blockquote>
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).
blockquote>Функция GRUB recordfail использует инструкцию
save_env
, чтобы обновить состояние ошибки записи (см. Справка Ubuntu - Grub 2 , «Последняя загрузка не удалась» или Загрузитесь в раздел «Режим восстановления»). Однако в Ubuntu 14.04 (и в последних версиях Debian) операторsave_env
(внутри функции recordfail) используется, даже если 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 защищает себя от записи внутри RAID и LVM?
Для правильного чтения / записи в файловых системах GRUB загружает соответствующий модуль.
GRUB использует модуль diskfilter (
insmod diskfilter
) в разделах RAID и модуль lvm в разделах LVM.Давайте посмотрим реализацию чтения / записи модуля diskfilter :
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.В системе Debian Bug Tracker был предложен один патч для реализации этого решения. Его можно найти в: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921
Идея этого патча заключается в следующем:
[ 1184]Запустите команду grub-probe --target=abstraction "${grubdir}"
, чтобы узнать, какие модули абстракции GRUB использует для чтения / записи файлов в каталоге/boot/grub
;Если GRUB использует модуль diskfilter
илиlvm
, пропустите оператор recordfailsave_env
и запишите соответствующий комментарий в файл/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
Я думаю, что эта ошибка происходит из-за набег или раздел LVM .
Для временного приспособления для этой проблемы:
Редактирование: /etc/grub.d/10_linux
Замена 'quick_boot="1"' with 'quick_boot="0"'
Тогда:
sudo update-grub