Записи Diskfilter не підтримуються> Що викликає цю помилку?


88

Це повідомлення виникає під час виходу з меню Grub та перед екраном сплеску Ubuntu.

Як вирішити проблему, щоб очистити повідомлення?

А що це за лань?

error:  Diskfilter writes are not supported

Система завантажується і, здається, працює просто чудово.


1
Досі не зафіксовано у Ubuntu Desktop 15.04 ...
ThePiercingPrince

1
Все ще не зафіксовано 16.04. Цей важкий темп виправлення помилок важко не відставати.
Пол Томблін

Відповіді:


145

Це БУГ!

Це помилка, яка виникає в останній версії Ubuntu Server LTS (Ubuntu Server 14.04 LTS), коли ви створюєте завантажувальний розділ (або кореневий розділ, коли завантажувальний розділ не існує) всередині LVM або розділу RAID .

Ви можете отримати більш детальну інформацію про цю помилку в стартовій панелі Ubuntu: Помилка № 1274320 "Помилка: записи diskfilter не підтримуються" .

Оновлення: ця помилка вже виправлена ​​в 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).

Функція GRF Recordfail використовує save_envоператор для оновлення стану рекорду (див. Довідка Ubuntu - Grub 2 , розділ "Остання помилка завантаження або завантаження в режим відновлення"). Однак в Ubuntu 14.04 (і в останніх версіях Debian) save_envоператор (всередині функції rekfail) використовується, навіть якщо 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заяву про запис і напишіть відповідний коментар у /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, я підсумував відповідь! Це було дуже велике і багатьом людям було дуже важко зрозуміти: p Він все ще великий, але принаймні я організував це за секціями. Тож тепер ви можете подивитися лише у розділах, що цікавлять.
Rarylson Freitas

8
Ого. Дякую. Якби була функція "відповідь місяця", я би голосував за ваше. Крім того, ви заслуговуєте на нагороду "без BS". Це такі статті, які дійсно мають цінність, і які мають величезну різницю між цією мережею сайтів порівняно з форумами.
Виконати CMD

1
На жаль, на цю помилку я вплинув, і жодне з виправлень у звіті про помилку чи тут, редагуючи 00_headerфайл, не працювало. Я не відключатиму, quick_bootщоб зникнути.
douggro

@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

Дякую, це спрацювало чудово. Так, я використовую LVM для всіх томів.
RCF

Дякую за таке рішення. Це врятувало мені багато роботи. Чи маєте також трохи довідкової інформації?
Запустіть CMD

@ClassStacker, якщо ви вимагаєте отримати більше інформації від nux, вам потрібно відредагувати коментар для початку (@nux). Якщо ви запитуєте мене, який тип фону ви шукаєте?
RCF

2
@ RCF-U14.04 1) Ні, не треба. Просто натисніть на "Додати коментар" -> "допомогу", щоб дізнатися, що "Автор публікації завжди буде повідомлений про ваш коментар". 2) Я хотів дізнатися (з нуля), чому це вирішує проблему, особливо з огляду на обширну відповідь Рарільсона Фрейтаса. Але якщо ви можете на це відповісти, сміливо робіть це.
Виконати CMD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.