Co to jest rpikernelhack?

96

Kiedy robię apt-get upgradena moim RPi 3, wiele linii wyjściowych pokazuje się następująco:

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

Nie jestem zbyt wykształcony w zakresie funkcji jądra Linuksa i wygląda to dość specyficznie dla RPi.

Moje pytanie brzmi: co to wszystko jest?

Co to jest „przekierowanie”? Co właściwie robią wszystkie te pliki (jako grupa), do których istnieją odniesienia? Co to jest „rpikernelhack”?

Trochę googlowałem i nie mogłem łatwo znaleźć niczego interesującego. Myślę, że nie jestem jedyny, który jest tym ciekawy, więc mam nadzieję, że to właściwe pytanie!

MD-7
źródło
3
Z pewnością nie jedyny, który jest ciekawy - też chciałbym wiedzieć.
joan
Ja też. Zajęło mi to dość dużo czasu apt-get upgrade.
Kong Chun Ho
2
Prawdopodobnie nie tak ekscytujące, jak myślisz - myślę, że „hack” dotyczy systemu zarządzania pakietami, a nie jądra. debian.org/doc/debian-policy/ap-pkg-diversions.html
Złotowłosa
Oto próbka z preinstczęści: dpkg-divert --package rpikernelhack --divert /usr/share/rpikernelhack/kernel.img /boot/kernel.img. Link @goldilocks wyjaśnia --packagejasno.
PNDA
2
@qbicdesign Myślę, że to zależy od zrozumienia słowa „hack” . Jednym z powszechnych zastosowań byłoby odniesienie się do czegoś, co być może nie jest idealnym lub właściwym rozwiązaniem problemu, ale działa, przynajmniej w niewielkim stopniu lub przy minimalnym wysiłku, więc ktoś po prostu wyraźnie to zaznacza (ten na początku tego artykułu nie jest to rozwiązanie czegokolwiek, ale wspólnym tematem byłoby „niewłaściwe” = „używanie czegoś w sposób niezgodny z przeznaczeniem” = „niekoniecznie zły, może nawet sprytny”).
goldilocks

Odpowiedzi:

67

„rpikernelhack” jest fałszywą nazwą pakietu i nazwą katalogu używaną jako część włamania (w sensie brudnego, ale celowego rozwiązania problemu) w celu obejścia faktu, że fundacja Raspberry Pi postanowiła utworzyć / uruchomić partycję fat32 i dpkg nie radzi sobie dobrze z fat32. To ja początkowo wpadłem na ten pomysł, choć później został dopracowany przez innych.

dpkg zainstaluje nowe pliki na partycji fat32 (po drodze wyrzucając ostrzeżenia), ale jeśli spróbuje zaktualizować istniejący plik na partycji fat32, zawiedzie (iirc spróbuje utworzyć kopię zapasową starego pliku, tworząc hardlink a fat32 nie obsługuje hardlinków).

Gdy ludzie (w tym ja) zaczęli próbować tworzyć pakiety deb jądra Pi i oprogramowania układowego, napotkali ten problem, pakiet instalowałby się początkowo, ale próba jego uaktualnienia nie powiodła się, ouch.

Moim obejściem było (ab) użycie funkcji „przekierowania” w dpkg. Ta funkcja miała na celu umożliwienie przekierowania plików, aby mogły zostać zastąpione wersjami zmodyfikowanymi lokalnie lub wersjami z innego pakietu, ale mogłem użyć go ze skryptów opiekuna w taki sposób, aby dpkg wykonywał swoje zadania instalacyjne na Partycja Linuksa, a następnie przenieś plik do końcowej lokalizacji na końcu.

Różnice wymagają podania „nazwy pakietu” lub „lokalnego”. Jeśli podasz nazwę pakietu, przekierowanie wpłynie na pliki należące do wszystkich pakietów oprócz tego, który sam określisz (celem jest umożliwienie pakietowi przekierowania pliku należącego do innego pakietu, a następnie zainstalowanie jego własnych wersji). Potrzebowałem też katalogu do przekierowania plików.

Użycie nazwy instalowanego pakietu jądra sprawiłoby, że hack byłby nieskuteczny. Używanie „lokalnego” również wydawało się niewłaściwe, ponieważ ma to być zarezerwowane do użytku przez lokalnego administratora systemu. Potrzebowałem więc fałszywej nazwy pakietu, która prawdopodobnie nie powodowałaby konfliktu z czymkolwiek. Wymyśliłem „rpikernelhack”, użyłem tego samego ciągu dla nazwy katalogu.

Peter Green
źródło
4
Dziękuję bardzo za tę odpowiedź. Był bardzo wnikliwy w podejmowaniu decyzji dotyczących projektu i nazewnictwa. Internet to dla mnie magiczne miejsce, w którym mogłem uzyskać odpowiedź od faceta, który faktycznie pracował nad tym konkretnym fragmentem.
MD-7
Właśnie aktualizowałem moje RPi i zastanawiałem się nad tym dziwnym logiem, dzięki za najlepsze wyjaśnienie.
schlump
Czy nie byłoby czystiej, aby dpkg ładnie grał w FAT32. Oto MR, który sugeruję: salsa.debian.org/cklein-guest/dpkg/merge_requests/1/diffs
user1202136
43

Jest to tylko nazwa katalogu podana przez programistów, którzy stworzyli zestaw łatek do jądra Linuksa dla Raspberry Pi.

Programiści Raspbian rozwiązują FATproblem uszkodzenia systemu plików występujący w jądrze 2016. To uaktualnienie jądra 2017 i nie ma się o co martwić. Aby zaktualizować jądro, musisz sudo apt install -fnaprawić problemy z zależnościami spowodowane przez błąd ( -fw tym kontekście oznacza, zgodnie ze stroną podręcznika apt-get(8):

-f, -fix-broken
Fix; próba poprawienia systemu z przerwanymi zależnościami. ...

)

Edmund Broadley
źródło
0

FWIW, zdarzyło się to ponownie, kiedy zaktualizowałem aktualizację 28.02.2019 na odcinku rpi3b +. 182 linie przekierowania ... rpikernalhack ... z czego tutaj jest próbka:

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'

...
...

Jeśli to pomoże, godzinę wcześniej zrobiłem aktualizację aktualizacji i spowodowałem (2) niedopasowania sumy mieszania. Być może właśnie w momencie aktualizacji repozytorium? Uruchomiłem ponownie, zaczekałem godzinę i zrobiłem drugą aktualizację aktualizacji, nie miałem niezgodności sumy Hash, i wtedy też otrzymałem 182 linie przekierowania ... rpikernalhack.

Powstała wersja:

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

Oczywiście, kiedy mówię „aktualizacja aktualizacji”, mam na myśli ...

sudo apt-get update
sudo apt-get upgrade

Opublikowałem to, niezręcznie, jako odpowiedź, ze względu na jego długość, mając nadzieję, że wzbogaci wybraną odpowiedź, pokazując, że tego rodzaju rzecz nie jest jednorazową „poprawką” z poprzedniego roku.

always_learning
źródło
1
Nie rozumiem, dlaczego uaktualnienie kończy się na starym jądrze. Obecne jądro to 4.14.98-v7 + .
Ingo
Przeprowadziłem aktualizację aktualizacji i uruchomiłem ponownie kilka minut temu. Jądro jest teraz: Linux ISS 4.14.98-v7 + # 1200 SMP Wt 12 lutego 20:27:48 GMT 2019 armv7l GNU / Linux Nie mam wyjaśnienia tego innego niż, jak stwierdzono w moim poście, wydaje się, że mam robiłem pierwszą aktualizację w momencie aktualizacji repozytorium (stąd niezgodność sumy Hash?). A druga aktualizacja albo nie miała jeszcze dostępnej wersji 4.14.98-v7 +, albo też było więcej plików do zaktualizowania przed aktualizacją jądra? Nie wiem. Czy ty? TY za wskazanie tego.
always_learning
Nie, nie mam pomysłu. Może repozytorium zostało właśnie zaktualizowane i jest niespójne? W każdym razie ...
Ingo
Będę świadomy tej możliwości w przyszłości.
always_learning