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

85

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

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

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

error:  Diskfilter writes are not supported

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

    
задан RCF 18.05.2014 в 01:14
источник

2 ответа

142

Это ошибка!

Это ошибка, которая возникает в самой последней версии Ubuntu Server LTS (Ubuntu Server 14.04 LTS) при создании загрузочного раздела (или корневого раздела, когда загрузочный раздел не существует) внутри LVM или раздел RAID.

Вы можете получить дополнительную информацию об этой ошибке в Ubuntu Launchpad: Ошибка # 1274320 "Ошибка: diskfilter записи не поддерживаются ".

Обновление: Эта ошибка уже исправлена ​​в Ubuntu Server 14.04 и некоторых новых версиях Ubuntu. Вероятно, вам нужно запустить apt-get upgrade .

Почему эта ошибка возникает?

Когда система загружается, GRUB считывает данные ( load_env ) в /boot/grub/grubenv . Этот файл называется блоком окружения GRUB .

Из руководства 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 (внутри функции записи) используется, даже если 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 , вы увидите, что функция recordfail используется только в 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 был предложен один патч. Его можно найти в: ссылке

Идея этого патча:

  • Запустите команду grub-probe --target=abstraction "${grubdir}" , чтобы получить, какие модули абстракции GRUB использует для чтения / записи файлов в каталоге /boot/grub ;
  • Если GRUB использует модуль diskfilter или lvm , пропустите оператор recordfail save_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
    
ответ дан Rarylson Freitas 16.07.2014 в 00:42
источник
33

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

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

Изменить: /etc/grub.d/10_linux

Заменить 'quick_boot="1"' with 'quick_boot="0"'

Тогда:

sudo update-grub
    
ответ дан nux 18.05.2014 в 02:14