Що таке rpikernelhack?


96

Коли ви робите apt-get upgradeна моєму RPi 3, багато рядків виводу відображаються так:

Adding 'diversion of /boot/bcm2708-rpi-b-plus.dtb to /usr/share/rpikernelhack/bcm2708-rpi-b-plus.dtb by rpikernelhack'
Adding 'diversion of /boot/bcm2708-rpi-b.dtb to /usr/share/rpikernelhack/bcm2708-rpi-b.dtb by rpikernelhack'
Adding 'diversion of /boot/bcm2708-rpi-cm.dtb to /usr/share/rpikernelhack/bcm2708-rpi-cm.dtb by rpikernelhack'
Adding 'diversion of /boot/bcm2709-rpi-2-b.dtb to /usr/share/rpikernelhack/bcm2709-rpi-2-b.dtb by rpikernelhack'
Adding 'diversion of /boot/bcm2710-rpi-3-b.dtb to /usr/share/rpikernelhack/bcm2710-rpi-3-b.dtb by rpikernelhack'
Adding 'diversion of /boot/kernel.img to /usr/share/rpikernelhack/kernel.img by rpikernelhack'
Adding 'diversion of /boot/kernel7.img to /usr/share/rpikernelhack/kernel7.img by rpikernelhack'
Adding 'diversion of /boot/COPYING.linux to /usr/share/rpikernelhack/COPYING.linux by rpikernelhack'
...
...
...

Я не дуже освічений до функцій ядра Linux, і це виглядає досить специфічно для RPi.

Моє запитання: Що це все?

Що таке "диверсія"? Що насправді роблять усі ці файли (як група), на які посилаються? Що таке "rpikernelhack"?

Я трохи погукав і не міг легко знайти щось цікаве. Я думаю, що я не єдиний, хто цікавиться цим питанням, тож сподіваюся, що це відповідне питання!


3
Звичайно, не єдиний, хто цікавий - я також хотів би це знати.
Джоан

Я також. Вони зайняли досить тривалий час, коли я це роблю apt-get upgrade.
Kong Chun Ho

2
Напевно, не так захоплююче, як ви думаєте - я думаю, що "хак" тут полягає в системі управління пакетами, а не в ядрі. debian.org/doc/debian-policy/ap-pkg-diversions.html
goldilocks

Ось приклад з preinstчастини: dpkg-divert --package rpikernelhack --divert /usr/share/rpikernelhack/kernel.img /boot/kernel.img. Посилання @goldilocks пояснює --packageчітко.
PNDA

2
@qbicdesign Я думаю, що це залежить від вашого розуміння слова "рубати" . Одним звичним використанням було б посилання на щось, що, можливо, не є ідеальним або правильним рішенням проблеми, але працює, принаймні, в крайній мірі або з мінімальними зусиллями, тому хтось просто вказує на це явно (те, що знаходиться на початку цієї статті, чи не так 't рішення на що завгодно, але загальною темою було б "неправильне" = "використовувати щось таким чином, як це не було призначено" = "не обов'язково неправильно, можливо навіть розумно").
золотинок

Відповіді:


67

"rpikernelhack" - це підроблена назва пакета та ім'я каталогу, що використовується як частина хаку (у сенсі брудного, але доцільного рішення проблеми), щоб вирішити той факт, що фонд Raspberry Pi вирішив зробити / завантажувати розділ fat32 і dpkg не добре вживається з жиром32. Я був тим, хто спочатку придумав цю ідею, хоча згодом її вдосконалили інші.

dpkg встановить нові файли на розділ fat32 (висловлюючи деякі попередження попутно), але якщо він намагається оновити наявний файл на розділі fat32, він не вдасться (iirc намагається створити резервну копію старого файлу, створивши жорстке посилання і fat32 не підтримує жорсткі посилання).

Коли люди (включаючи мене) почали намагатися складати деб-пакети з ядер Pi та мікропрограмного забезпечення, вони зіткнулися з цією проблемою, пакет спочатку встановився б, але намагатися оновити його не вдасться, ой.

Моє вирішення полягало в тому, щоб (ab) використовувати функцію "диверсія" в dpkg. Ця функція покликана була переадресувати файли, щоб вони могли бути замінені або локально модифікованими версіями, або версіями з іншого пакету, але я зміг використовувати її із сценаріїв сервісного сервісу таким чином, щоб dpkg виконував завдання встановлення на Розділ Linux, а потім перемістіть файл у його остаточне місце наприкінці.

Для переадресації потрібно вказати "назву пакета" або "локальну". Якщо ви вказали ім'я пакета, то переадресація вплине на файли, які належать усім пакетам, крім того, який ви вказали (тут має намір дозволити пакет перенаправити файл, що належить іншому пакету, а потім встановити власні версії). Також мені знадобився каталог, до якого потрібно переадресувати файли.

Використання імені встановленого пакета ядра зробить хак неефективним. Використання "локального" також здавалося невірним, оскільки це повинно бути зарезервовано для використання місцевим sysadmin. Тож мені потрібна була фальшива назва пакета, яка навряд чи ні з чим конфліктувала. Я придумав "rpikernelhack", я також використав цей самий рядок для імені каталогу.


4
Дуже дякую за цю відповідь. Він був дуже проникливим щодо прийняття рішень щодо дизайну та називання. Інтернет - це чарівне місце для мене, що я зміг отримати відповідь від хлопця, який насправді працював над цим конкретним твором.
MD-7,

Щойно оновлював мій RPI і цікавився цим дивним журналом, дякую за остаточне уточнення.
шлуп

Чи не було б чистіше змусити dpkg добре грати з FAT32. Ось ЗР, який
user1202136

43

Це лише назва каталогів, яку дали розробники, які створили специфічний набір патчів Raspberry Pi до ядра Linux.

Це виправлення розробниками Raspbian, щоб виправити FATпроблему з пошкодженням файлової системи, наявну в ядрі 2016 року, це оновлення ядра 2017 року і нічого не турбує. Щоб зробити це оновлення ядра, вам потрібно скористатися, sudo apt install -fщоб виправити проблеми залежності, викликані помилкою ( -fв цьому контексті означає, відповідно до сторінки man apt-get(8):

-f, -
виправлена помилка Fix; спроба виправити систему з розбитими залежностями на місці. ...

)


0

FWIW, це повторилося, коли я здійснив оновлення 2019-02-28 на rpi3b + запущений натяг. 182 лінії відхилення ... rpikernalhack ... з яких ось зразок:

Preparing to unpack .../17-raspberrypi-kernel_1.20190215-1_armhf.deb ...
Adding 'diversion of /boot/bcm2708-rpi-0-w.dtb to /usr/share/rpikernelhack/bcm2708-rpi-0-w.dtb by rpikernelhack'
Adding 'diversion of /boot/bcm2708-rpi-b-plus.dtb to /usr/share/rpikernelhack/bcm2708-rpi-b-plus.dtb by rpikernelhack'
Adding 'diversion of /boot/bcm2708-rpi-b.dtb to /usr/share/rpikernelhack/bcm2708-rpi-b.dtb by rpikernelhack'
Adding 'diversion of /boot/bcm2708-rpi-cm.dtb to /usr/share/rpikernelhack/bcm2708-rpi-cm.dtb by rpikernelhack'
Adding 'diversion of /boot/bcm2709-rpi-2-b.dtb to /usr/share/rpikernelhack/bcm2709-rpi-2-b.dtb by rpikernelhack'
Adding 'diversion of /boot/bcm2710-rpi-3-b-plus.dtb to /usr/share/rpikernelhack/bcm2710-rpi-3-b-plus.dtb by rpikernelhack'

...
...

Якщо це допомагає, за годину раніше я зробив оновлення оновлення, і це призвело до (2) невідповідностей хеш-суми. Можливо, саме в той час, коли репозитарій оновлювався? Я перезавантажив, почекав годину і зробив друге оновлення оновлення, не було невідповідностей суми Hash, і це теж коли я отримав 182 рядки переадресації ... rpikernalhack.

Отримана версія:

pi@___:~ $ uname -a
Linux ISS 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux
pi@___:~ $

Звичайно, коли я кажу "оновлення оновлення", я маю на увазі ...

sudo apt-get update
sudo apt-get upgrade

Я розмістив це незручно, як відповідь, через свою тривалість, сподіваючись, що це збагатить обрану відповідь, показавши, що подібні речі не є одноразовими «виправленнями» попереднього року.


1
Я не розумію, чому ваше оновлення закінчується старим ядром. Поточне ядро 4.14.98-v7 + .
Інго

Я провів оновлення оновлення та перезавантажився пару хвилин тому. Ядро тепер: Linux ISS 4.14.98-v7 + # 1200 SMP Вт 12 лютого 20:27:48 GMT 2019 armv7l GNU / Linux У мене немає пояснень для цього, окрім, як зазначено у моєму дописі, я, здається, маю робив перше оновлення під час оновлення сховища (звідси невідповідність суми Hash?). А в другому оновлення або ще не було 4.14.98-v7 +, або, було оновлено більше файлів, перш ніж оновити ядро? Я не знаю. Чи ти? TY для його вказівки.
always_learning

Ні, я не маю ідеї. Може бути, сховище було лише оновлене та невідповідне? У всякому разі ...
Інго

Я буду усвідомлювати цю можливість у майбутньому.
always_learning
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.