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

Это сообщение происходит при отъезде меню Grub и перед экраном-заставкой Ubuntu.

Как я решаю проблему для очистки сообщения?

И какая самка это является средним?

error:  Diskfilter writes are not supported

Начальные загрузки системы и, кажется, работают просто великолепно.

88
задан 23 January 2016 в 09:29

2 ответа

Это ошибка!

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

[...]

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

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

[ 1184]
  • Запустите команду 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
      
    145
    ответ дан 22 November 2019 в 23:10

    Я думаю, что эта ошибка происходит из-за набег или раздел LVM .

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

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

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

    Тогда:

    sudo update-grub
    
    33
    ответ дан 22 November 2019 в 23:10

    Другие вопросы по тегам:

    Похожие вопросы: