Записи в Diskfilter не поддерживаются> Что вызывает эту ошибку?

88

Это сообщение появляется при выходе из меню Grub и перед заставкой Ubuntu.

Как мне исправить проблему, чтобы очистить сообщение?

И что это значит?

error:  Diskfilter writes are not supported

Система загружается и, кажется, работает просто отлично.

RCF
источник
1
Все еще не исправлено в Ubuntu Desktop 15.04 ...
ThePiercingPrince
1
Все еще не исправлено в 16.04. С этим головокружительным темпом исправления ошибок трудно поспевать.
Пол Томблин

Ответы:

145

Это ошибка!

Эта ошибка возникает в самой последней версии 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 Environment Block .

Из руководства 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оператор (внутри функции 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.

Идея этого патча заключается в следующем:

  • Запустите grub-probe --target=abstraction "${grubdir}"команду, чтобы узнать, какие модули абстракции GRUB использует для чтения / записи файлов в /boot/grubкаталоге;
  • Если 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
Рарилсон Фрейтас
источник
Большое спасибо за ссылку на ошибку. Я надеюсь, вы поймете, что я нашел решение nux более убедительным. ;)
Запустите CMD
6
Привет @ ClassStacker, я резюмировал ответ! Он был очень большим, и многим людям было очень трудно понять: он все еще большой, но, по крайней мере, я организовал его по разделам. Так что теперь вы можете посмотреть только в интересующих разделах.
Рарилсон Фрейтас
8
Ух ты. Спасибо. Если бы была функция «Ответ месяца», я бы проголосовал за вас. Кроме того, вы заслуживаете награду "no BS". Это те статьи, которые действительно представляют ценность и которые имеют огромное значение для сети этого сайта по сравнению с форумами.
Запустите CMD
1
К сожалению, я был затронут этой ошибкой, и ни одно из исправлений в отчете об ошибке или здесь, редактируя 00_headerфайл, не работало. Я не буду отключать, quick_bootчтобы заставить его уйти.
Дуггро
@ Douggro Я не уверен, почему отредактированный 00_headerфайл (как рекомендуется здесь) не будет работать. Я знаю, что то, что это работает для меня (и для Рарилсона Фрейтаса), не означает, что это обязательно сработает для всех. Но вы удостоверились, что дали правильные разрешения старому и новому 00_headerи запускали update-grub? (Если вы только что отредактировали 00_headerна месте, нет chmodнеобходимости, но update-grubостается необходимым.)
Элия ​​Каган
33

Я думаю, что эта ошибка возникает из-за рейда или LVM раздела.

Для временного решения этой проблемы:

Редактировать :/etc/grub.d/10_linux

замещать 'quick_boot="1"' with 'quick_boot="0"'

Затем :

sudo update-grub
Nux
источник
Спасибо, это сработало отлично. Да, я использую LVM для всех томов.
RCF
Спасибо за это решение. Это спасло мне много работы. У вас также есть немного дополнительной информации?
Запустите CMD
@ClassStacker, если вы запрашиваете дополнительную информацию у nux, вам нужно отредактировать свой комментарий, чтобы начать с (@nux). Если вы спрашиваете меня, какой фон вы ищете?
RCF
2
@ RCF-U14.04 1) Нет, мне не нужно. Просто нажмите «Добавить комментарий» -> «Помощь», чтобы узнать, что «Автор сообщения всегда будет уведомлен о вашем комментарии». 2) Я хотел знать (из nux), почему это решает проблему, особенно учитывая обширный ответ Рарилсона Фрейтаса. Но если вы можете ответить, не стесняйтесь.
Запустите CMD