Что такое 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»?

Я немного погуглил и не смог найти ничего интересного. Я полагаю, что я не единственный, кому это интересно, поэтому я надеюсь, что это правильный вопрос!

MD-7
источник
3
Конечно, не единственный, кому любопытно - я тоже хотел бы знать.
Джоан
Я тоже. Они заняли довольно много времени, когда я занимаюсь apt-get upgrade.
Конг Чон Хо
2
Вероятно, не так увлекательно, как вы думаете - я думаю, что «хак» здесь в системе управления пакетами, а не в ядре. debian.org/doc/debian-policy/ap-pkg-diversions.html
Златовласка
Вот пример из preinstчасти: dpkg-divert --package rpikernelhack --divert /usr/share/rpikernelhack/kernel.img /boot/kernel.img. Ссылка @goldilocks объясняет --packageясно.
PNDA
2
@qbicdesign Я думаю, что это зависит от вашего понимания слова "взломать" . Одним из распространенных применений может быть обращение к чему-то, что, возможно, не является идеальным или правильным решением проблемы, но работает, по крайней мере, в крайнем случае или с минимальными усилиями, поэтому кто-то просто указывает это явно (то, что в начале этой статьи не это не решение проблемы, но общей темой было бы «неправильное» = «использование чего-либо таким образом, для которого это не было предназначено» = «не обязательно неправильно, возможно даже умно»).
Златовласка

Ответы:

69

«rpikernelhack» - это поддельное имя пакета и имя каталога, которое используется как часть хака (в смысле грязного, но целесообразного решения проблемы), чтобы обойти тот факт, что фонд Raspberry Pi решил создать / загрузить раздел fat32 и dpkg плохо ладит с fat32. Первоначально я придумал эту идею, хотя позже ее доработали другие.

dpkg установит новые файлы в раздел FAT32 (выпуская некоторые предупреждения по пути), но если он попытается обновить существующий файл в разделе FAT32, это не удастся (IIRC пытается создать резервную копию старого файла, создав жесткую ссылку и fat32 не поддерживает жесткие ссылки).

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

Мой обходной путь состоял в том, чтобы (ab) использовать функцию "diversion" в dpkg. Эта функция была предназначена для переадресации файлов, чтобы их можно было заменить либо локально измененными версиями, либо версиями из другого пакета, но я смог использовать его из сценариев сопровождающего таким образом, чтобы dpkg выполнял свои задачи установки на Раздел Linux, а затем переместите файл в его окончательное расположение в конце.

Для переадресации требуется указать «имя пакета» или «локальный». Если вы укажете имя пакета, то переадресация повлияет на файлы, принадлежащие всем пакетам, кроме указанного вами (цель здесь - позволить пакету перенаправить файл, принадлежащий другому пакету, а затем установить свои собственные версии). Мне также нужен был каталог для пересылки файлов.

Использование имени устанавливаемого пакета ядра сделало бы взлом неэффективным. Использование «local» также казалось неправильным, поскольку предполагается, что оно зарезервировано для использования локальным системным администратором. Поэтому мне нужно было поддельное имя пакета, которое вряд ли могло конфликтовать с чем-либо. Я придумал «rpikernelhack», я также использовал эту же строку для имени каталога.

Питер Грин
источник
4
Большое спасибо за этот ответ. Это было очень проницательно к решениям дизайна и наименования. Интернет - волшебное место для меня, чтобы я смог получить ответ от парня, который действительно работал над этим конкретным вопросом.
MD-7
Просто обновлял мой RPi и задавался вопросом об этом странном журнале, спасибо за окончательное разъяснение.
Schlump
Не будет ли чище заставить dpkg хорошо играть с FAT32. Вот MR, который я предлагаю: salsa.debian.org/cklein-guest/dpkg/merge_requests/1/diffs
user1202136
43

Это просто имя каталога, данное разработчиками, которые создали специальный набор патчей для Raspberry Pi для ядра Linux.

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

-f, --fix-broken
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) несоответствие хэш-суммы. Возможно, это было именно так, как хранилище обновлялось? Я перезагрузил компьютер, подождал час и выполнил второе обновление, не было несовпадений по хэш-сумме, и это также, когда я получил 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

Я написал это, как неуклюже, в качестве ответа, из-за его продолжительности, надеясь, что он обогатит выбранный ответ, показывая, что такого рода вещи не являются единовременным «исправлением» по сравнению с предыдущим годом.

always_learning
источник
1
Я не понимаю, почему ваше обновление заканчивается старым ядром. Текущее ядро ​​- 4.14.98-v7 + .
Инго
Я выполнил обновление и перезагрузил пару минут назад. Ядро сейчас: Linux ISS 4.14.98-v7 + # 1200 SMP Вт 12 февраля 20:27:48 GMT 2019 armv7l GNU / Linux У меня нет объяснения этому, кроме того, что, как указано в моем посте, у меня, кажется, есть делали первое обновление во время обновления репозитория (следовательно, хэш-сумма не совпадает?). И во втором обновлении либо еще не было доступно 4.14.98-v7 +, либо было больше файлов для обновления, прежде чем оно обновит ядро? Я не знаю. Вы? TY за указание на это.
Always_learning
Нет, понятия не имею Может быть, хранилище было только что обновлено и в несогласованном состоянии? Во всяком случае ...
Инго
Я буду знать об этой возможности в будущем.
Always_learning