Учебники (How-To & F.A.Q)
   786

Обходим проблему GRUB - boot diskfilter writes are not supported на LVM или RAID

Описание ошибки

При запуске системы, после вывода меню загрузчика GRUB появляется на экране ошибка:

Учебники (How-To & F.A.Q): Исправляем ошибку GRUB - boot diskfilter writes are not supported на LVM или RAID

boot diskfilter writes are not supported

Этот bug (ошибка) хорошо изложен здесь. Ниже дан небольшой отрывок из оригинального ответа, его перевод и инструкция по устранению проблемы.

Краткое описание работы GRUB влияющая на проблему

Когда GRUB загружается, он зачитывает переменные окружения (environment variables) из ранее сохраненного файла /boot/grub/grubenv. Этот файл называется GRUB Environment Block. Из документации GRUB:

Часто полезно иметь возможность запоминать небольшое количество информации от одной загрузки к другой. Например, вы можете захотеть установить пункт меню по умолчанию на основе того, что было выбрано в последний раз. GRUB намеренно не реализует поддержку записи файлов, чтобы минимизировать вероятность того, чтобы загрузчик в случае чего, не отвечал за повреждение файловой системы. Поэтому, файл конфигурации GRUB не может просто создать файл обычным способом. Тем не менее, GRUB предоставляет «environment block», который можно использовать для сохранения небольшого количества состояния.

environment block представляет собой предварительно выделенный 1024-байтовый файл, который обычно находится в /boot/grub/grubenv. Во время загрузки, команда load_env загружает из нее переменные среды, а команда save_env сохраняет в ней переменные среды. Из работающей системы утилиту grub-editenv можно использовать для редактирования environment block.

По соображениям безопасности это хранилище доступно только при установке на обычном диске (без LVM или RAID), с использованием файловой системы без контрольной суммы (не ZFS) и с использованием функций BIOS или EFI (не ATA, USB или IEEE1275).

grub-mkconfig использует эту возможность для реализации GRUB_SAVEDEFAULT

Поведение чтения environment block можно найти в /etc/grub.d/00_header (update-grub использует этот файл для генерации файла /boot/grub/grub.cfg):

if [ -s $prefix/grubenv ]; then
  load_env
fi

Проблема с командой чтения load_env не проявляется, но проявляется с командой сохранения save_env которая сохраняет переменные окружения только на простых разделах диска (она не может запуститься внутри диска RAID или LVM как следует из документации).

Простое решение

Простое решение заключается в том, чтобы отключить в конфиге использование команды записи save_env выставив запрет на её использование в конфигурационном файле /etc/default/grub:

GRUB_SAVEDEFAULT="false"

Затем, следует сгенерировать конечный конфиг-файл GRUB'а /boot/grub/grub.cfg с обновленными параметрами командой:

sudo update-grub

Минусы этого решения не значительны:
  • Не будет возможности сохранять/запоминать состояние между перезагрузками системы. Например, не будет возможности при выборе другого пункта меню загрузки GRUB запомнить его как дефолтный.
  • Если содержимое GRUB в /boot/grub перенесётся вами на другой раздел, на котором файловые системы будут поддреживаться GRUB'ом, то потребуется установить опцию равную значению true, а затем обновить конфиг GRUB'а запустив sudo update-grub

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.