{"id":12402,"date":"2024-02-08T22:16:20","date_gmt":"2024-02-08T20:16:20","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=12402"},"modified":"2024-02-11T15:43:37","modified_gmt":"2024-02-11T13:43:37","slug":"kleines-raspberry-pi-os-update-grosse-probleme-aenderungen-in-boot-und-ihre-folgen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/kleines-raspberry-pi-os-update-grosse-probleme-aenderungen-in-boot-und-ihre-folgen\/","title":{"rendered":"Kleines Raspberry Pi OS Update, gro\u00dfe Probleme: \u00c4nderungen in \/boot und ihre Folgen"},"content":{"rendered":"<p>Eine kleine Aktualisierung verursacht gerade an einigen Stellen im Raspberry Pi OS 12 Probleme &#8211; dabei war sie als \u00dcbergangsl\u00f6sung f\u00fcr eine Umstellung gedacht. Vor allem <code class=\"\" data-line=\"\">config.txt <\/code>und <code class=\"\" data-line=\"\">cmdline.txt<\/code> sind betroffen. Einige Werkzeuge verwenden sie intern. Leider rechnen nicht alle damit, dass es die alten Pfade nicht mehr geben k\u00f6nnte. Im Raspberry Pi OS 12 aka Bookworm ist aber genau das passiert: <code class=\"\" data-line=\"\">\/boot<\/code> wurde nach <code class=\"\" data-line=\"\">\/boot\/firmware<\/code> verschoben. Das irritiert nicht nur einige Nutzer, die sie f\u00fcr erweiterte Funktionen anpassen m\u00f6chten.<\/p>\n<p>Hier erf\u00e4hrst du, warum derzeit Skripte wie <code class=\"\" data-line=\"\">rpi-clone<\/code> nicht mehr funktionieren und wir derzeit mit zwei verschiedenen Pfaden arbeiten m\u00fcssen, um diese beiden Dateien zu bearbeiten. Au\u00dferdem demonstriere ich am quelloffenen <code class=\"\" data-line=\"\">rpi-clone<\/code> Projekt, wie man bei OSS mit wenigen Anpassungen eine L\u00f6sung einbauen kann.<\/p>\n<h2 class=\"wp-block-heading\">Was machen config.txt und cmdline.txt?<\/h2>\n<p>Von X86-PCs sind wir ein BIOS gewohnt, das inzwischen nahezu vollst\u00e4ndig vom Nachfolger UEFI abgel\u00f6st wurde. In beiden F\u00e4llen geht es im Kern um eine Firmware, die beim Starten des Computers weitere Software startet. F\u00fcr gew\u00f6hnlich ist das ein Bootloader, der wiederum ein Betriebssystem wie eine GNU\/Linux-Distribution oder Microsoft Windows startet. Jedes BIOS\/UEFI hat eine Konfigurationsoberfl\u00e4che, um diverse Einstellungen vornehmen zu k\u00f6nnen.  Dort lassen sich Hardware-Funktionen des Mainboards aktivieren oder deaktivieren. Darunter ist z.B. die Startreihenfolge der Medien, von denen das BIOS\/UEFI versuchen soll, Bootloader und Betriebssystem zu starten.<\/p>\n<p>W\u00e4hrend das UEFI im X86-Bereich Standardisiert ist, haben wir bei Einplatinencomputern leider ein Chaos mit selbst entwickelter, oft Propriet\u00e4rer Firmware. Beim Raspberry Pi existiert keine Oberfl\u00e4che f\u00fcr dessen Einstellungen, wie bei BIOS und UEFI. Stattdessen k\u00f6nnen Einstellungen \u00fcber die <code class=\"\" data-line=\"\">config.txt <\/code>Datei vorgenommen werden.<sup data-fn=\"c217e42f-ab12-4c71-8ef8-61c29a4f280b\" class=\"fn\"><a href=\"#c217e42f-ab12-4c71-8ef8-61c29a4f280b\" id=\"c217e42f-ab12-4c71-8ef8-61c29a4f280b-link\">1<\/a><\/sup> Beispielsweise l\u00e4sst sich dort die Tonausgabe deaktivieren. Auch verschiedene GPIO-Schnittstellen kann man dort ein- oder ausschalten.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\"># Tonausgabe aktivieren\ndtparam=audio=on\n# I2C Bus auf den GPIO-Schnittstellen einschalten\ndtparam=i2c_arm=on<\/code><\/pre>\n<p>Die Firmware \u00fcbergibt an den Bootloader. Findet dieser entsprechend seiner Konfiguration ein Betriebssystem (z.B. auf der Speicherkarte oder angeschlossener USB-Ger\u00e4te), wird vereinfacht erst der Linux-Kernel geladen, dann die restliche GNU\/Linux-Distribution (z.B. Raspberry Pi OS). Wie der Name bereits vermuten l\u00e4sst, ist der Kernel zentraler Bestandteil jedes Betriebssystems. Er k\u00fcmmert sich um Prozesse und Dateien an unterster Stelle, d.H. mit direktem Zugriff auf die Hardware (z.B. eine Speicherkarte). Auch hier gibt es daher einige Einstellungen, die man als Parameter an den Kernel \u00fcbermitteln kann. Sie werden beim Raspberry Pi in der <code class=\"\" data-line=\"\">cmdline.txt<\/code> im Format <code class=\"\" data-line=\"\">name=wert<\/code> festgelegt. Im Gegensatz zu <code class=\"\" data-line=\"\">config.txt<\/code> allerdings alle in der gleichen Zeile, getrennt durch ein Leerzeichen.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">console=serial0,115200 console=tty1 root=PARTUUID=7ce26686-02 rootfstype=ext4 ...<\/code><\/pre>\n<p>Im Auszug wird etwa eine serielle Konsole (zu Debug-Zwecken) festlegt und ein tty f\u00fcr die Bildschirmausgabe. TTY steht f\u00fcr <em>teletypewriter<\/em>, zu Deutsch Fernschreiber. Im Kern geht es um Ein- und Ausgabe auf der Konsole, die auch aus der Ferne (tele) stattfinden kann. Dar\u00fcber hinaus ist das Wurzel-Dateisystem mit eindeutiger UUID der Partition angegeben. Wie man sehen kann, ist das nach dem Start in \/ eingeh\u00e4ngt worden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">$ ls -lh \/dev\/disk\/by-partuuid\/7ce26686-02\nlrwxrwxrwx 1 root root 15 Feb  7 00:22 \/dev\/disk\/by-partuuid\/7ce26686-02 -&gt; ..\/..\/mmcblk0p2\n$ lsblk\nNAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS\nmmcblk0     179:0    0 59.5G  0 disk \n\u251c\u2500mmcblk0p1 179:1    0  512M  0 part \/boot\/firmware\n\u2514\u2500mmcblk0p2 179:2    0   59G  0 part \/<\/code><\/pre>\n<p>Es finden sich in der standardm\u00e4\u00dfig vorhandenen <code class=\"\" data-line=\"\">cmdline.txt<\/code> noch weitere Parameter, die hier den Rahmen sprengen w\u00fcrden. Das Konzept dahinter ist nicht spezifisch f\u00fcr den Raspberry Pi: In jeder GNU\/Linux-Distribution kann man Parameter f\u00fcr den Kernel setzen. \u00dcblicherweise geschieht dies auf X86-Systemen \u00fcber den Bootloader. Meist ist das Grub, dieser leitet den Inhalt der Variable <code class=\"\" data-line=\"\">GRUB_CMDLINE_LINUX_DEFAULT<\/code> in <code class=\"\" data-line=\"\">\/etc\/default\/grub<\/code> beim Start an Linux weiter.<\/p>\n<h2 class=\"wp-block-heading\">Was genau wurde beim Raspberry Pi OS ge\u00e4ndert?<\/h2>\n<p>Beide Dateien lagen dort bis Bookworm direkt in <code class=\"\" data-line=\"\">\/boot<\/code>. Unter den meisten GNU\/Linux-Distributionen liegen dort einige Dateien, die notwendig sind, um Linux zu starten &#8211; oft auch die Kernel selbst. Mit dem Raspberry Pi OS 12 (Bookworm) hat sich das ge\u00e4ndert: Die Dateien wurden in <code class=\"\" data-line=\"\">\/boot\/firmware<\/code> verschoben.<sup data-fn=\"abd6ac5e-c40b-4e9b-a07c-2bbdbaec8399\" class=\"fn\"><a href=\"#abd6ac5e-c40b-4e9b-a07c-2bbdbaec8399\" id=\"abd6ac5e-c40b-4e9b-a07c-2bbdbaec8399-link\">2<\/a><\/sup><sup data-fn=\"455bdd84-1ba4-42ea-aa3f-2e8ed3b94728\" class=\"fn\"><a href=\"#455bdd84-1ba4-42ea-aa3f-2e8ed3b94728\" id=\"455bdd84-1ba4-42ea-aa3f-2e8ed3b94728-link\">3<\/a><\/sup> Dabei handelt es sich um ein f\u00fcr den Raspberry Pi spezifisches Verzeichnis.<sup data-fn=\"abe5de88-211c-44e2-bf74-302fa93df6b0\" class=\"fn\"><a href=\"#abe5de88-211c-44e2-bf74-302fa93df6b0\" id=\"abe5de88-211c-44e2-bf74-302fa93df6b0-link\">4<\/a><\/sup><\/p>\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">\/boot\/config.txt<\/code> wurde zu <code class=\"\" data-line=\"\">\/boot\/firmware\/config.txt<\/code><\/li>\n<li><code class=\"\" data-line=\"\">\/boot\/cmdline.txt<\/code> wurde zu <code class=\"\" data-line=\"\">\/boot\/firmware\/&lt;code&gt;cmdline<\/code>.txt<\/code><\/li>\n<\/ul>\n<p>Diese \u00c4nderung blieb lange Zeit unbemerkt, weil man als \u00dcbergangsl\u00f6sung symbolische Verkn\u00fcpfungen (Symlinks) f\u00fcr beide Dateien erstellt hatte. Das ist eine Datei, die auf eine andere zeigt. Viele Programme folgen solchen symbolischen Verkn\u00fcpfungen. Folgendes Beispiel legt eine Textdatei in meinem Heimverzeichnis an und erstellt \/tmp\/demo.txt als symbolische Verkn\u00fcpfung auf diese Datei. Der Schreibvorgang mit <code class=\"\" data-line=\"\">echo<\/code> f\u00fcgt den Text in die originale Datei meines Heimverzeichnisses ein:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">$ touch \/home\/u-labs\/demo.txt\n$ ln -s \/home\/u-labs\/demo.txt \/tmp\/demo.txt\n$ l \/tmp\/demo.txt\nPermissions Size User   Group  Date Modified Name\nlrwxrwxrwx     - u-labs u-labs  5 Feb 16:07  \uf15c \/tmp\/demo.txt -&gt; \/home\/u-labs\/demo.txt\n\n$ echo abc &gt; \/tmp\/demo.txt\n$ cat \/home\/u-labs\/demo.txt\nabc<\/code><\/pre>\n<p>Am 18.01.2024 wurde diese \u00dcbergangsl\u00f6sung jedoch im APT-Paket <code class=\"\" data-line=\"\">raspberrypi-sys-mods <\/code>entfernt.<sup data-fn=\"b33cf469-9878-4f58-a36e-2bc6dd3f04f1\" class=\"fn\"><a href=\"#b33cf469-9878-4f58-a36e-2bc6dd3f04f1\" id=\"b33cf469-9878-4f58-a36e-2bc6dd3f04f1-link\">5<\/a><\/sup> Statt der symbolischen Verkn\u00fcpfung auf die jeweilige Datei im <code class=\"\" data-line=\"\">firmware<\/code> Unterverzeichnis enthalten beide einen Hinweis, man solle diese Datei nicht mehr bearbeiten und stattdessen den neuen Pfad verwenden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">$ cat \/boot\/config.txt \nDO NOT EDIT THIS FILE\n\nThe file you are looking for has moved to \/boot\/firmware\/config.txt<\/code><\/pre>\n<p>Die aktualisierte Version <code class=\"\" data-line=\"\">20240123<\/code> des Pakets wurde Ende Dezember 2023 verteilt. Wer alle Paketquellen und Pakete per <code class=\"\" data-line=\"\">sudo apt update &amp;&amp; sudo apt upgrade<\/code> aktualisiert hat, dem wurden die beiden symbolischen Verkn\u00fcpfungen entfernt.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">$ dpkg -l | grep raspberrypi-sys-mods\nii  raspberrypi-sys-mods                 20240123                            arm64        System tweaks for the Raspberry Pi<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Das sind die Folgen<\/h2>\n<p>Und das hat Konsequenzen: Dadurch funktioniert beispielsweise <code class=\"\" data-line=\"\">rpi-clone<\/code> nicht mehr: Seit dem aktualisierten Paket starten geklonte Laufwerke nicht mehr, sondern landen in einer BusyBox Shell. Bei <code class=\"\" data-line=\"\">rpi-clone<\/code> handelt es sich um ein beliebtes Skript, um u.a. einen kompletten Klon der Karte anfertigen zu k\u00f6nnen &#8211; etwa, um von SD-Speicherkarte auf SSD zu migrieren. Im Gegensatz zum 1:1 Klonen mit <code class=\"\" data-line=\"\">dd<\/code> weist das Skript den Partitionen auf dem Ziellaufwerk neue UUIDs zu. Sonst kann es zu Konflikten kommen, wenn beide Laufwerke verbunden sind. Au\u00dferdem bietet es erweiterte Optionen, die ansonsten ebenfalls manuelle Vorarbeit erforderlich machen. Beispielsweise das Kopieren auf Datentr\u00e4ger, die kleiner als die Partitionen sind (aber immer noch gro\u00df genug f\u00fcr den belegten Speicher). Seit der <\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2024\/02\/busybox-boot.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"487\" height=\"80\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2024\/02\/busybox-boot.jpg\" alt=\"\" class=\"wp-image-12427\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2024\/02\/busybox-boot.jpg 487w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2024\/02\/busybox-boot-300x49.jpg 300w\" sizes=\"auto, (max-width: 487px) 100vw, 487px\" \/><\/a><\/figure>\n<\/div>\n<p>Auch der Einrichtungsassistent von DietPi, welches auf dem Raspberry Pi OS basiert, lief durch diese \u00c4nderung auf Fehler.<sup data-fn=\"e197e6ab-7f9c-4db7-8dc1-2350afceea7b\" class=\"fn\"><a href=\"#e197e6ab-7f9c-4db7-8dc1-2350afceea7b\" id=\"e197e6ab-7f9c-4db7-8dc1-2350afceea7b-link\">6<\/a><\/sup> Der Aufwand einer Portierung von DietPi auf den neuen Raspberry Pi 5 ist u.a. dadurch gestiegen.<sup data-fn=\"4cd18e90-8aa0-46b8-a909-6621778e94b6\" class=\"fn\"><a href=\"#4cd18e90-8aa0-46b8-a909-6621778e94b6\" id=\"4cd18e90-8aa0-46b8-a909-6621778e94b6-link\">7<\/a><\/sup> Im Raspberry Pi Forum wurde und wird diese \u00c4nderung kontrovers diskutiert.<sup data-fn=\"3b301cf7-134c-4f21-a20b-42045508d7e5\" class=\"fn\"><a href=\"#3b301cf7-134c-4f21-a20b-42045508d7e5\" id=\"3b301cf7-134c-4f21-a20b-42045508d7e5-link\">8<\/a><\/sup> Neben diesen Beispielen gibt es wohl eine gr\u00f6\u00dfere Dunkelziffer an Programmen, die nun nicht mehr funktionieren, da sie automatisiert \u00c4nderungen an einer der beiden Dateien vornehmen. Unter Umst\u00e4nden sind eben so Anleitungen und Dokumentationen betroffen.<\/p>\n<h2 class=\"wp-block-heading\">Warum wurde die symbolische Verkn\u00fcpfung entfernt?<\/h2>\n<p>Aus Gr\u00fcnden der Abw\u00e4rtskompatibilit\u00e4t schien die Verkn\u00fcpfung ein sinnvoller Kompromiss zu sein. Einige fragen sich daher, warum man diese nicht schlichtweg hat bestehen lassen &#8211; dazu gibt es ein Ticket auf GitHub.<sup data-fn=\"e1c9eaa1-9d4c-43c0-bab8-f72b5eec5426\" class=\"fn\"><a href=\"#e1c9eaa1-9d4c-43c0-bab8-f72b5eec5426\" id=\"e1c9eaa1-9d4c-43c0-bab8-f72b5eec5426-link\">9<\/a><\/sup> Darin best\u00e4tigt der f\u00fcr die Entfernung verantwortliche Entwickler bereits zuvor ge\u00e4u\u00dferte Vermutungen, dass manche Editoren die symbolische Verkn\u00fcpfung nicht beachten und die Verkn\u00fcpfung \u00fcberschreiben, statt deren Ziel. Ich habe dies mit Vim und Nano getestet, beide haben in das Verkn\u00fcpfungsziel geschrieben.<\/p>\n<p>Anders sieht es dagegen beim beliebten GNU\/Linux Werkzeug <code class=\"\" data-line=\"\">sed<\/code> aus: Standardm\u00e4\u00dfig legt es beim Ersetzen in Dateien mit <code class=\"\" data-line=\"\">-i<\/code> (<code class=\"\" data-line=\"\">--in-place<\/code>) im Pfad der Verkn\u00fcpfung die neue Datei an. Nur wer den Parameter <code class=\"\" data-line=\"\">--follow-symlinks<\/code> kennt und benutzt, schreibt tats\u00e4chlich in das Verkn\u00fcpfungsziel. <\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">$ sed &#039;s\/a\/X\/&#039; \/tmp\/demo.txt -i\n$ cat demo.txt \nabc def ghi\n$ cat \/tmp\/demo.txt\nXbc def ghi\n$ l \/tmp\/demo.txt\nPermissions Size User   Group  Date Modified Name\n.rw-r--r--    12 u-labs u-labs  5 Feb 16:35  \uf15c \/tmp\/demo.txt<\/code><\/pre>\n<p>Das wird schnell zum Problem, da sed als GNU-Werkzeug vorinstalliert ist &#8211; es kommt in vielen Skripten zum Einsatz. Insbesondere wenn das Skript keine vern\u00fcnftige Fehlerbehandlung aufweist (wie bei etwa <code class=\"\" data-line=\"\">rpi-clone<\/code> der Fall), f\u00fchrt das zu schwer auffindbaren Fehlern. Bei <code class=\"\" data-line=\"\">rpi-clone<\/code> wiederum hat man mitgedacht und ruft s\u00e4mtliche Pfade mit dem Werkzeug <code class=\"\" data-line=\"\">realpath<\/code> auf. Dies gibt uns den <em>echten<\/em> Pfad zur\u00fcck, bei Verkn\u00fcpfungen also deren Ziel:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">$ realpath \/tmp\/demo.txt\n\/home\/u-labs\/demo.txt<\/code><\/pre>\n<p>Daher hat es auf dem Raspberry Pi OS 12 auch mit der Verkn\u00fcpfung funktioniert. Erst die Aktualisierung zur Entfernung des Symlinks machte es unbrauchbar. So gut die Idee einer Verkn\u00fcpfung auch gemeint ist &#8211; es ist nicht von der Hand zu weisen, dass dies zu Verwirrung f\u00fchren kann und in gewissen Konstellationen eine fiese Fehlerquelle ist. An dieser Stelle ist ein Ende mit Schrecken wohl besser, als ein Schrecken ohne Ende. Wenngleich man \u00fcber die Entscheidung, die Dateien zu verschieben, sicher streiten kann.<\/p>\n<h2 class=\"wp-block-heading\">Wir reparieren rpi-clone<\/h2>\n<p>Das originale Projekt von billw2 wird leider seit 2020 nicht mehr gepflegt.<sup data-fn=\"5e56ebc0-aa2e-4874-bb4c-8c5fa647a6f0\" class=\"fn\"><a href=\"#5e56ebc0-aa2e-4874-bb4c-8c5fa647a6f0\" id=\"5e56ebc0-aa2e-4874-bb4c-8c5fa647a6f0-link\">10<\/a><\/sup> Doch das ist in der Open Source Gemeinschaft kein Beinbruch: Es gibt andere Personen, es als Abspaltung (Fork) selbst weiterf\u00fchren. Der wohl verbreitetste stammt von Jeff Geerling. Er hat bereits in der Vergangenheit neue Funktionen, Fehlerkorrekturen und andere \u00c4nderungen eingebaut. Ich habe aus diesem Grunde seine Abspaltung als Grundlage genommen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">git clone https:\/\/github.com\/geerlingguy\/rpi-clone.git<\/code><\/pre>\n<p>Da ich die Codebasis nicht kenne, habe ich im Hauptskript (<code class=\"\" data-line=\"\">rpi-clone)<\/code> schlicht nach <em>cmdline<\/em> gesucht &#8211; 11 Treffer. Auch <em>cmdline<\/em> liefert nur 25 Ergebnisse. Das ist \u00fcberschaubar f\u00fcr eine h\u00e4ndische \u00dcberpr\u00fcfung. Zumal der Begriff an einigen Stellen in Kommentaren gefunden wurde. Die Wichtigsten, bei denen wir den Pfad \u00e4ndern m\u00fcssen, lauten:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">cmdline_txt=$(realpath \/boot\/cmdline.txt)\n# ...\ncmdline_txt=${clone}$(realpath \/boot\/cmdline.txt)\n# ...\ncp $cmdline_txt \/boot\/cmdline.txt<\/code><\/pre>\n<p>Nun k\u00f6nnen wir allerdings nicht lediglich an diesen drei Stellen den Pfad um den Unterordner <code class=\"\" data-line=\"\">firmware<\/code> ersetzen. Schlie\u00dflich betrifft die \u00c4nderung nur Raspberry Pi OS 12 Bookworm. Die Vorg\u00e4ngerversion 11 nutzt weiterhin die bestehenden Pfade und ist noch unterst\u00fctzt. Selbst bei Bookworm k\u00f6nnen wir nicht pauschal vom neuen Pfad ausgehen. Gerade zur jetzigen Zeit hat ggf. noch nicht jeder das frische Paket installiert. Daher ist eine Weiche n\u00f6tig: Ich pr\u00fcfe, ob in <code class=\"\" data-line=\"\">\/boot\/cmdline.txt<\/code> der Hinweistext aus dem Paketupdate enthalten ist. In dem Fall m\u00fcssen wir den neuen Pfad nehmen, ansonsten den alten.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\"># In the end of 2023, RPIOS moved cmdline.txt and config.txt from \/boot to \/boot\/firmware:\n# https:\/\/github.com\/raspberrypi\/documentation\/issues\/3089\n# There was a symlink, but it got removed at the end of january 2024 and leaves a notice in \/boot\/cmdline.txst:\n# https:\/\/github.com\/RPi-Distro\/raspberrypi-sys-mods\/commit\/c62cf1a12f4e422c855f7e2fcb39e9cadcb5459b\n# This update has broken pi-clone: The cloned drive would boot into busybox.\n# To fix this, get_cmdline_path() checks if \/boot\/cmdline.txt has moved, so it uses the new path on updated systems.\nget_cmdline_path() {\n       if [ &quot;$(head -1 \/boot\/cmdline.txt)&quot; = &quot;DO NOT EDIT THIS FILE&quot; ]; then\n               echo &quot;\/boot\/firmware\/cmdline.txt&quot;\n       else\n               echo &quot;\/boot\/cmdline.txt&quot;\n       fi\n}<\/code><\/pre>\n<p>Die obigen drei Aufrufe habe ich nun durch <code class=\"\" data-line=\"\">get_cmdline_path<\/code> ersetzt:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">- cmdline_txt=$(realpath \/boot\/cmdline.txt)\n+ cmdline_txt=$(realpath $(get_cmdline_path))\n\n- cmdline_txt=${clone}$(realpath \/boot\/cmdline.txt)\n+ cmdline_txt=${clone}$(realpath $(get_cmdline_path))\n\n- cp $cmdline_txt \/boot\/cmdline.txt\n+ cp $cmdline_txt $(get_cmdline_path)<\/code><\/pre>\n<p>Mit dem neuen Skript erstellt startet das geklonte Abbild wieder wie das Original direkt in das Raspberry Pi OS, statt in BusyBox. Nun w\u00e4re im Sinne der OSS-Bewegung der Zeitpunkt, dem Quell-Repository diese \u00c4nderung zur Verf\u00fcgung zu stellen: So profitieren alle die Geerlings Repository nutzen von den \u00c4nderungen, inklusive ihm selbst. W\u00e4hrend ich das f\u00fcr diesen Beitrag vorbereite, stellte sich allerdings heraus: Er war schneller und hat kurz davor einige \u00c4nderungen (Commits) ver\u00f6ffentlicht. Darunter auch eine Korrektur f\u00fcr das Problem der verschobenen Boot-Partition.<sup data-fn=\"361c2956-e78a-4695-bf5f-bb9089067984\" class=\"fn\"><a href=\"#361c2956-e78a-4695-bf5f-bb9089067984\" id=\"361c2956-e78a-4695-bf5f-bb9089067984-link\">11<\/a><\/sup><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2024\/02\/grafik-6.png\"><img loading=\"lazy\" decoding=\"async\" width=\"911\" height=\"121\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2024\/02\/grafik-6.png\" alt=\"\" class=\"wp-image-12431\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2024\/02\/grafik-6.png 911w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2024\/02\/grafik-6-300x40.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2024\/02\/grafik-6-768x102.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2024\/02\/grafik-6-640x85.png 640w\" sizes=\"auto, (max-width: 911px) 100vw, 911px\" \/><\/a><\/figure>\n<\/div>\n<p>Somit ist die \u00dcbermittlung meines Fix nicht mehr n\u00f6tig. Dies demonstriert die Macht der Open Source Community: Bereits wenige Tage nachdem das Problem bemerkt wird, arbeiten mehrere Personen an einer L\u00f6sung. Alleine hier sind es mindestens drei, da diese Code-\u00c4nderung nicht von Geerling selbst kam. Sondern von einem GNU\/Linux-Nutzer aus Stuttgart.<\/p>\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n<p>Kleine \u00c4nderung, gro\u00dfe Wirkung &#8211; so k\u00f6nnte man die Problematik zusammen fassen. Dieser Beitrag soll ein Verst\u00e4ndnis f\u00fcr das Problem schaffen und sowohl Betroffene als auch Entwickler in die richtige Richtung lotsen, nachdem die Ursache teils nur schwer auffindbar ist. Da nicht alle Nutzer ihre Software sofort aktualisieren, wird es in den n\u00e4chsten Wochen und Monaten wohl sicher noch den einen oder anderen betreffen &#8211; bis alle Projekte entsprechende Weichen eingebaut sowie verteilt haben. Ich habe dies bei <code class=\"\" data-line=\"\">rpi-clone <\/code>durchgef\u00fchrt, da ich es f\u00fcr einen geplanten Beitrag zum \u00fcbertragen von SSD-Karten auf M.2 SSDs am Raspberry Pi ben\u00f6tige.<\/p>\n<p>Ein gro\u00dfer Vorteil von Quelloffener Software: Wir m\u00fcssen nicht zuschauen oder sind gar aufgeschmissen, weil ein Projekt eingestellt wurde &#8211; wie es mit <code class=\"\" data-line=\"\">rpi-clone<\/code> leider der Fall zu sein scheint. Stattdessen k\u00f6nnen wir per Fork unseren eigenen Zweig davon erstellen. Gerade bei vergleichsweise kleinen \u00c4nderungen wie in diesem Falle muss man kein Softwareentwickler mit 20 Jahren Erfahrung sein, um das Problem selbst l\u00f6sen zu k\u00f6nnen. Bei propriet\u00e4rer Software sind nun alle Nutzer darauf angewiesen, dass der Hersteller sie aktualisiert &#8211; sofern es ihn noch gibt &amp; er die Unterst\u00fctzung nicht l\u00e4ngst eingestellt hat.<\/p>\n<h2 class=\"wp-block-heading\">Quellen &amp; weiterf\u00fchrende Informationen<\/h2>\n<ol class=\"wp-block-footnotes\">\n<li id=\"c217e42f-ab12-4c71-8ef8-61c29a4f280b\">https:\/\/www.raspberrypi.com\/documentation\/computers\/config_txt.html <a href=\"#c217e42f-ab12-4c71-8ef8-61c29a4f280b-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 1 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"abd6ac5e-c40b-4e9b-a07c-2bbdbaec8399\">https:\/\/github.com\/raspberrypi\/documentation\/issues\/3089 <a href=\"#abd6ac5e-c40b-4e9b-a07c-2bbdbaec8399-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 2 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"455bdd84-1ba4-42ea-aa3f-2e8ed3b94728\">https:\/\/9to5linux.com\/raspberry-pi-os-is-now-based-on-debian-bookworm-supports-raspberry-pi-5-and-pipewire <a href=\"#455bdd84-1ba4-42ea-aa3f-2e8ed3b94728-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 3 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"abe5de88-211c-44e2-bf74-302fa93df6b0\">https:\/\/askubuntu.com\/a\/1256823\/650986 <a href=\"#abe5de88-211c-44e2-bf74-302fa93df6b0-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 4 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"b33cf469-9878-4f58-a36e-2bc6dd3f04f1\">https:\/\/github.com\/RPi-Distro\/raspberrypi-sys-mods\/commit\/c62cf1a12f4e422c855f7e2fcb39e9cadcb5459b <a href=\"#b33cf469-9878-4f58-a36e-2bc6dd3f04f1-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 5 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"e197e6ab-7f9c-4db7-8dc1-2350afceea7b\">https:\/\/github.com\/MichaIng\/DietPi\/issues\/6747 <a href=\"#e197e6ab-7f9c-4db7-8dc1-2350afceea7b-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 6 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"4cd18e90-8aa0-46b8-a909-6621778e94b6\">https:\/\/github.com\/MichaIng\/DietPi\/issues\/6676#issuecomment-1771124218 <a href=\"#4cd18e90-8aa0-46b8-a909-6621778e94b6-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 7 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"3b301cf7-134c-4f21-a20b-42045508d7e5\">https:\/\/forums.raspberrypi.com\/viewtopic.php?t=364582 <a href=\"#3b301cf7-134c-4f21-a20b-42045508d7e5-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 8 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"e1c9eaa1-9d4c-43c0-bab8-f72b5eec5426\">https:\/\/github.com\/RPi-Distro\/raspberrypi-sys-mods\/issues\/88#issuecomment-1931626454 <a href=\"#e1c9eaa1-9d4c-43c0-bab8-f72b5eec5426-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 9 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"5e56ebc0-aa2e-4874-bb4c-8c5fa647a6f0\">https:\/\/github.com\/billw2\/rpi-clone <a href=\"#5e56ebc0-aa2e-4874-bb4c-8c5fa647a6f0-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 10 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"361c2956-e78a-4695-bf5f-bb9089067984\">https:\/\/github.com\/geerlingguy\/rpi-clone\/commit\/63765e8e84cc978417a75bbb7e1a28746d4ca542 <a href=\"#361c2956-e78a-4695-bf5f-bb9089067984-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 11 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Eine kleine Aktualisierung verursacht gerade an einigen Stellen im Raspberry Pi OS 12 Probleme &#8211; dabei war sie als \u00dcbergangsl\u00f6sung f\u00fcr eine Umstellung gedacht. Vor allem config.txt und cmdline.txt sind betroffen. Einige Werkzeuge verwenden sie intern. Leider rechnen nicht alle damit, dass es die alten Pfade nicht mehr geben k\u00f6nnte. Im Raspberry Pi OS 12 &#8230;<\/p>\n","protected":false},"author":5,"featured_media":12435,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"[{\"content\":\"https:\/\/www.raspberrypi.com\/documentation\/computers\/config_txt.html\",\"id\":\"c217e42f-ab12-4c71-8ef8-61c29a4f280b\"},{\"content\":\"https:\/\/github.com\/raspberrypi\/documentation\/issues\/3089\",\"id\":\"abd6ac5e-c40b-4e9b-a07c-2bbdbaec8399\"},{\"content\":\"https:\/\/9to5linux.com\/raspberry-pi-os-is-now-based-on-debian-bookworm-supports-raspberry-pi-5-and-pipewire\",\"id\":\"455bdd84-1ba4-42ea-aa3f-2e8ed3b94728\"},{\"content\":\"https:\/\/askubuntu.com\/a\/1256823\/650986\",\"id\":\"abe5de88-211c-44e2-bf74-302fa93df6b0\"},{\"content\":\"https:\/\/github.com\/RPi-Distro\/raspberrypi-sys-mods\/commit\/c62cf1a12f4e422c855f7e2fcb39e9cadcb5459b\",\"id\":\"b33cf469-9878-4f58-a36e-2bc6dd3f04f1\"},{\"content\":\"https:\/\/github.com\/MichaIng\/DietPi\/issues\/6747\",\"id\":\"e197e6ab-7f9c-4db7-8dc1-2350afceea7b\"},{\"content\":\"https:\/\/github.com\/MichaIng\/DietPi\/issues\/6676#issuecomment-1771124218\",\"id\":\"4cd18e90-8aa0-46b8-a909-6621778e94b6\"},{\"content\":\"https:\/\/forums.raspberrypi.com\/viewtopic.php?t=364582\",\"id\":\"3b301cf7-134c-4f21-a20b-42045508d7e5\"},{\"content\":\"https:\/\/github.com\/RPi-Distro\/raspberrypi-sys-mods\/issues\/88#issuecomment-1931626454\",\"id\":\"e1c9eaa1-9d4c-43c0-bab8-f72b5eec5426\"},{\"content\":\"https:\/\/github.com\/billw2\/rpi-clone\",\"id\":\"5e56ebc0-aa2e-4874-bb4c-8c5fa647a6f0\"},{\"content\":\"https:\/\/github.com\/geerlingguy\/rpi-clone\/commit\/63765e8e84cc978417a75bbb7e1a28746d4ca542\",\"id\":\"361c2956-e78a-4695-bf5f-bb9089067984\"}]"},"categories":[671],"tags":[1091],"class_list":["post-12402","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","tag-raspberry-pi-os-2"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/12402","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=12402"}],"version-history":[{"count":31,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/12402\/revisions"}],"predecessor-version":[{"id":12437,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/12402\/revisions\/12437"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/12435"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=12402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=12402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=12402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}