dpkg замінює файли у файловій системі FAT


22

Під час оновлення або перевстановлення пакету з dpkg(і в кінцевому підсумку всього, що його використовує, наприклад, apt-get і т.д.), він створює резервну копію існуючих файлів, створюючи жорстке посилання на файл перед його заміною. Таким чином, якщо розпакувати не вдасться, можна легко повернути наявні файли. Це чудово, адже він захищає операційну систему від подій Bad Things ™.

За винятком ... працює лише у тому випадку, якщо ваша файлова система підтримує жорсткі посилання . Не всі файлові системи роблять - наприклад, файлові системи FAT.

Я працюю над дистрибутивом Debian для певної вбудованої платформи ARM, і середовище завантаження вимагає, щоб певні файли (включено ядро) були у файловій системі FAT, щоб код завантаження міг їх знайти та завантажити.

Коли ви переходите до оновлення пакета ядра (або будь-якого іншого пакета, який містить файли в цьому розділі FAT), установка не вдається:

dpkg: error processing archive linux-image3.18.11+_3.18.11.2.armadillian_armhf.deb (--install):
 unable to make backup link of `./boot/vmlinuz-3.18.11+' before installing new version: Operation not permitted

І ціле оновлення не вдається.

Я переглянув Інтернет, і єдині посилання, які я можу знайти, - це конкретні люди з певними проблемами під час конкретних оновлень, відповідь на які, як правило, "Видалити /boot/vmlinuz-3.18.11+ і спробувати ще раз", і так, це виправляє конкретну проблему.

Але це не для мене відповідь. Я розповсюджувач ОС, а не користувач ОС, тому мені потрібен спосіб виправити це, що не передбачає, щоб кінцевий користувач видалив свої файли ядра вручну перед оновленням. Мені потрібен спосіб сказати dpkg "копіювати, не жорстке посилання" для файлів у / boot (або всіх файлів для всіх, що мені важливо, хоча це дещо уповільнить операцію оновлення), або ще краще "Якщо жорстке посилання не вдасться, не скаржись, просто скопіюй це замість ".

Я пробував такі речі, як прапорці --force-unsafe-ioі навіть , але нічого не має ефекту.--force-alldpkg


Здається, що час для списку бажань :-)
Faheem Mitha

Відповіді:


13

Поведінка, яку ви бачите, реалізована в archives.c в dpkgджерелі, рядку 1030 (для версії 1.18.1):

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf))
  ohshite(_("unable to make backup link of '%.255s' before installing new version"),
          ti->name);

Мені здається, ви могли б впоратися з відмовою посилання, повернувшись до поведінки перейменованих рядків 1003 та наступних; щось на кшталт (це не перевірено):

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf)) {
  debug(dbg_eachfiledetail,"link failed, nonatomic");
  nifd->namenode->flags |= fnnf_no_atomic_overwrite;
  if (rename(fnamevb.buf,fnametmpvb.buf))
    ohshite(_("unable to move aside '%.255s' to install new version"),
            ti->name);
}

Я не dpkgфахівець, хоча ... (І жоден варіант вже не доступний уdpkg щоб надати таку поведінку.)


Безумовно, упаковка моєї власної версії dpkg - це можливість, хоча я вважаю за краще не мати накладних витрат на відстеження змін у верхній частині моєї версії.
Majenko

Гаразд, я можу підтвердити, що це працює добре, тому це, безумовно, варіант. Інший варіант, який мені трапляється, можливо, є можливість - це вручну переміщувати файли-скривди в preinstсценарії пакету , але оскільки ядро ​​побудоване за допомогою стандартних сценаріїв упаковки ядра, я не знаю, як би це змінити. Також не було б автоматичного відката.
Маєнко

1
Дійсно, це спрацювало б; Ви також можете дослідити dpkgгачки ( dpkg --pre-invoke=).
Стівен Кітт

+1 Як ти не dpkgфахівець, коли це знаєш!
nikhil

1
малинове ядро ​​також оновлюється за допомогою аналогічного трюку, використовуючи dpkg-divert. Взяті з raspberrypi.stackexchange.com/questions/51410 / ... ,
akarapatis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.