O que é rpikernelhack?


96

Ao fazer um apt-get upgradeno meu RPi 3, muitas linhas de saída aparecem assim:

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

Não sou muito educado sobre os recursos do kernel do Linux e isso parece bastante específico para o RPi.

Minha pergunta é: O que é tudo isso?

O que é um 'desvio'? O que todos esses arquivos (como um grupo) que estão sendo referenciados realmente fazem? O que é 'rpikernelhack'?

Pesquisei um pouco no Google e não consegui encontrar nada interessante com facilidade. Eu acho que não sou o único que está curioso sobre isso, então espero que seja uma pergunta apropriada!


3
Certamente não é o único que está curioso - eu gostaria de saber também.
Joan

Eu também. Eles levaram um longo tempo quando eu estou fazendo apt-get upgrade.
Kong Chun Ho

2
Provavelmente não é tão empolgante quanto você pensa - acho que o "hack" aqui está no sistema de gerenciamento de pacotes, não no kernel. debian.org/doc/debian-policy/ap-pkg-diversions.html
goldilocks

Aqui está uma amostra da preinstparte: dpkg-divert --package rpikernelhack --divert /usr/share/rpikernelhack/kernel.img /boot/kernel.img. O link da @goldilocks explica --packageclaramente.
PNDA 20/07/19

2
@qbicdesign Eu acho que depende da sua compreensão da palavra "hack" . Um uso comum seria se referir a algo que talvez não seja uma solução ideal ou adequada para um problema, mas que funcione, pelo menos com uma pitada ou com um esforço mínimo, para que alguém esteja apenas indicando isso explicitamente (o que está no início desse artigo não é é uma solução para qualquer coisa, mas o tema comum seria "impróprio" = "usar algo de uma maneira que não foi planejada" = "não necessariamente errado, talvez até inteligente").
goldilocks

Respostas:


69

"rpikernelhack" é um nome de pacote falso e um nome de diretório usado como parte de um hack (no sentido de uma solução suja, mas conveniente para um problema) para solucionar o fato de que a fundação Raspberry Pi decidiu criar / inicializar uma partição fat32 e o dpkg não se dá bem com o fat32. Fui eu quem inicialmente teve a ideia, embora ela tenha sido refinada mais tarde por outros.

O dpkg instalará novos arquivos em uma partição fat32 (lançando alguns avisos ao longo do caminho), mas se tentar atualizar um arquivo existente em uma partição fat32, ele falhará (iirc, tentará fazer um backup do arquivo antigo criando um hardlink e o fat32 não suporta hardlinks).

Quando as pessoas (inclusive eu) começavam a tentar criar pacotes deb de kernels e firmware do Pi, encontravam esse problema, um pacote era instalado inicialmente, mas a tentativa de atualizá-lo falhava, ai.

Minha solução alternativa foi (ab) usar o recurso "desvio" no dpkg. Esse recurso tinha como objetivo permitir que os arquivos fossem desviados para que pudessem ser substituídos por versões modificadas localmente ou versões de outro pacote, mas eu pude usá-lo nos scripts do mantenedor de forma que o dpkg realizasse suas tarefas de instalação em um pacote. Partição Linux e, em seguida, mova o arquivo para seu local final no final.

Os desvios exigem que você especifique um "nome do pacote" ou "local". Se você especificar um nome de pacote, o desvio afetará os arquivos pertencentes a todos os pacotes, exceto aquele que você especificar (a intenção aqui é permitir que um pacote desvie um arquivo pertencente a outro pacote e, em seguida, instale suas próprias versões). Eu também precisava de um diretório para desviar os arquivos.

Usar o nome do pacote do kernel sendo instalado tornaria o hack ineficaz. O uso de "local" também parecia errado, pois isso deveria ser reservado para uso pelo administrador do sistema local. Então, eu precisava de um nome de pacote falso que provavelmente não entraria em conflito com nada. Eu vim com "rpikernelhack", também usei essa mesma string para o nome do diretório.


4
Muito obrigado por esta resposta. Foi muito perspicaz em relação às decisões de design e nomeação. A internet é um lugar mágico para eu ter conseguido uma resposta do cara que realmente trabalhou nessa peça específica em questão.
MD-7

Estava apenas atualizando meu RPi e me perguntei sobre esse log estranho, obrigado pelo esclarecimento final.
schlump 15/06

Não seria mais fácil fazer o dpkg funcionar bem com o FAT32. Aqui está o MR que eu sugiro: salsa.debian.org/cklein-guest/dpkg/merge_requests/1/diffs
user1202136

43

É apenas o nome do diretório fornecido pelos desenvolvedores que criaram um conjunto específico de patches do Raspberry Pi para o kernel do Linux.

É uma correção dos desenvolvedores do Raspbian para corrigir um FATproblema de corrupção do sistema de arquivos presente no kernel de 2016, que é atualizado para o kernel de 2017 e não precisa se preocupar. Para fazer essa atualização do kernel, você precisa usar sudo apt install -fpara corrigir os problemas de dependência causados ​​pelo bug ( -fneste contexto, de acordo com a página de manual apt-get(8):

Correção -f, --fix-broken
; tente corrigir um sistema com dependências quebradas. ...

)


0

FWIW, isso ocorreu novamente quando eu fiz uma atualização de atualização em 28/02/2019 em um trecho de execução do rpi3b +. 182 linhas de desvio ... rpikernalhack ... das quais aqui está uma amostra:

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'

...
...

Se isso ajudar, uma hora antes eu fiz uma atualização e ela produziu (2) incompatibilidades de soma de hash. Talvez fosse precisamente quando o repositório estava sendo atualizado? Reiniciei, esperei uma hora e fiz a segunda atualização de atualização, não tinha incompatibilidades de soma Hash, e foi também nesse momento que recebi as 182 linhas de desvio ... rpikernalhack.

A versão resultante:

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

Claro que quando digo 'atualizar atualização', quero dizer ...

sudo apt-get update
sudo apt-get upgrade

Eu postei isso, de forma desajeitada, como resposta, devido ao seu comprimento, esperando que enriquecesse a resposta selecionada, mostrando que esse tipo de coisa não é uma "correção" única de um ano anterior.


1
Não entendo por que sua atualização termina com um kernel antigo. O kernel atual é 4.14.98-v7 + .
Ingo

Fiz uma atualização e reinicializei alguns minutos atrás. O kernal é agora: Linux ISS 4.14.98-v7 + # 1200 SMP Ter 12 de fevereiro às 20:27:48 GMT 2019 armv7l GNU / Linux realizou a primeira atualização no momento de uma atualização do repositório (daí a soma do Hash não corresponder?). E a segunda atualização ainda não tinha o 4.14.98-v7 + disponível ou havia mais arquivos a serem atualizados antes de atualizar o kernal? Eu não sei. Você? TY por apontar.
always_learning 03/03

Não, eu não tenho uma ideia. Talvez o repositório tenha sido atualizado e em um estado inconsistente? Enfim ...
Ingo

Estarei ciente dessa possibilidade no futuro.
always_learning 03/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.