¿Qué es rpikernelhack?

96

Al hacer un apt-get upgradeen mi RPi 3, muchas líneas de salida aparecen así:

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'
...
...
...

No estoy muy educado en las características del kernel de Linux y esto parece bastante específico para el RPi.

Mi pregunta es: ¿Qué es todo esto?

¿Qué es un 'desvío'? ¿Qué hacen realmente todos estos archivos (como grupo) a los que se hace referencia? ¿Qué es 'rpikernelhack'?

Busqué en Google un poco y no pude encontrar fácilmente nada interesante. Me imagino que no soy el único que siente curiosidad por esto, ¡así que espero que sea una pregunta adecuada!

MD-7
fuente
3
Ciertamente, no soy el único que tiene curiosidad, también me gustaría saberlo.
joan
Yo también. Tomaron bastante tiempo cuando lo estoy haciendo apt-get upgrade.
Kong Chun Ho
2
Probablemente no sea tan emocionante como crees, creo que el "truco" aquí está en el sistema de administración de paquetes, no en el núcleo. debian.org/doc/debian-policy/ap-pkg-diversions.html
goldilocks
He aquí una muestra de la preinstparte: dpkg-divert --package rpikernelhack --divert /usr/share/rpikernelhack/kernel.img /boot/kernel.img. El enlace de @goldilocks se explica --packageclaramente.
PNDA
2
@qbicdesign Creo que eso depende de tu comprensión de la palabra "piratear" . Un uso común sería referirse a algo que tal vez no sea una solución ideal o adecuada para un problema, pero que funcione, al menos en un apuro o con un esfuerzo mínimo, por lo que alguien simplemente está indicando eso explícitamente (el que está al comienzo de ese artículo no es No es una solución para nada, pero el tema común sería "impropio" = "usar algo de una manera que no fue intencionado" = "no necesariamente incorrecto, tal vez incluso inteligente").
Ricitos de oro

Respuestas:

69

"rpikernelhack" es un nombre de paquete falso y un nombre de directorio utilizado como parte de un hack (en el sentido de una solución sucia pero conveniente a un problema) para evitar el hecho de que la fundación Raspberry Pi decidió hacer / arrancar una partición fat32 y dpkg no se lleva bien con fat32. Yo fui quien inicialmente se le ocurrió la idea, aunque otros la refinaron más tarde.

dpkg instalará nuevos archivos en una partición fat32 (arrojando algunas advertencias en el camino), pero si intenta actualizar un archivo existente en una partición fat32 fallará (iirc intenta hacer una copia de seguridad del archivo antiguo creando un enlace duro y fat32 no admite enlaces duros).

Cuando las personas (incluyéndome a mí) comenzamos a tratar de hacer paquetes deb de núcleos Pi y firmware, se encontraron con este problema, un paquete se instalaría inicialmente, pero tratar de actualizarlo fallaría, ¡ay!

Mi solución era (ab) usar la función de "desvío" en dpkg. Esta función estaba destinada a permitir que los archivos se desvíen para que puedan ser reemplazados por versiones modificadas localmente o versiones de otro paquete, pero pude usarlo desde los scripts del mantenedor de tal manera que dpkg realizaría sus tareas de instalación en un Partición de Linux y luego mueva el archivo a su ubicación final al final.

Las desviaciones requieren que especifique un "nombre de paquete" o "local". Si especifica un nombre de paquete, la desviación afectará a los archivos que pertenecen a todos los paquetes, excepto al que usted especifique (la intención aquí es permitir que un paquete desvíe un archivo propiedad de otro paquete y luego instale sus propias versiones). También necesitaba un directorio para desviar los archivos.

Usar el nombre del paquete de kernel que se está instalando habría dejado el hackeo ineficaz. Usar "local" también parecía incorrecto, ya que se supone que está reservado para el uso del administrador del sistema local. Así que necesitaba un nombre de paquete falso que era poco probable que entrara en conflicto con algo. Se me ocurrió "rpikernelhack", también usé esta misma cadena para el nombre del directorio.

Peter Green
fuente
44
Muchas gracias por esta respuesta. Fue muy perspicaz con respecto a las decisiones de diseño y nomenclatura. Internet es un lugar mágico para que haya podido obtener una respuesta del tipo que realmente trabajó en esta pieza específica en cuestión.
MD-7
Estaba actualizando mi RPi y me pregunté acerca de este registro extraño, gracias por la última aclaración.
Schlump
¿No sería más limpio hacer que dpkg funcione bien con FAT32? Aquí está el MR que sugiero: salsa.debian.org/cklein-guest/dpkg/merge_requests/1/diffs
user1202136
43

Es solo el nombre de directorio dado por los desarrolladores que han creado un conjunto específico de parches de Raspberry Pi para el kernel de Linux.

Es una solución por parte de los desarrolladores de Raspbian para solucionar un FATproblema de corrupción del sistema de archivos presente en el kernel 2016, esto se actualiza al kernel 2017 y no hay nada de qué preocuparse. Para realizar esta actualización del kernel es necesario utilizar sudo apt install -fpara solucionar los problemas de dependencia causada por el insecto (el -fen este contexto significa, de acuerdo con la página de manual, apt-get(8):

-f, --fix-broken
Fix; Intente corregir un sistema con dependencias rotas en su lugar. ...

)

Edmund Broadley
fuente
0

FWIW, esto ocurrió nuevamente cuando realicé una actualización de actualización el 28/02/2019 en un tramo de ejecución rpi3b +. 182 líneas de diversión ... rpikernalhack ... de las cuales aquí hay una muestra:

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'

...
...

Si ayuda, una hora antes hice una actualización de actualización y produjo (2) desajustes de suma de hash. ¿Quizás fue precisamente cuando el repositorio se estaba actualizando? Reinicié, esperé una hora y realicé la segunda actualización de actualización, no tuve desajustes de suma de Hash, y también fue cuando obtuve las 182 líneas de desvío ... rpikernalhack.

La versión resultante:

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

Por supuesto, cuando digo 'actualizar actualizar', quiero decir ...

sudo apt-get update
sudo apt-get upgrade

Publiqué esto, torpemente, como respuesta, debido a su longitud, con la esperanza de que enriquecería la respuesta seleccionada, mostrando que este tipo de cosas no es una "solución" única del año anterior.

siempre aprendiendo
fuente
1
No entiendo por qué su actualización termina con un núcleo antiguo. El núcleo actual es 4.14.98-v7 + .
Ingo
Realicé una actualización de actualización y reinicié hace un par de minutos. El kernel es ahora: Linux ISS 4.14.98-v7 + # 1200 SMP martes 12 de febrero 20:27:48 GMT 2019 armv7l GNU / Linux No tengo una explicación para esto más que, como se indica en mi publicación, parece que tengo estado haciendo la primera actualización en el momento de la actualización del repositorio (¿de ahí la falta de coincidencia de la suma de hash?). ¿Y la segunda actualización aún no tenía 4.14.98-v7 + disponible o había más archivos para actualizar antes de que actualizara el kernal? No lo sé. ¿Vos si? TY por señalarlo.
always_learning
No, no tengo idea. ¿Quizás el repositorio se acaba de actualizar y está en un estado inconsistente? De todos modos ...
Ingo
Seré consciente de esta posibilidad en el futuro.
always_learning