{"id":8298,"date":"2022-01-03T00:41:37","date_gmt":"2022-01-02T22:41:37","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=8298"},"modified":"2022-12-12T16:56:26","modified_gmt":"2022-12-12T14:56:26","slug":"nur-103-mb-alpine-linux-getestet-kleine-simple-und-sichere-linux-distribution-fuer-den-raspberry-pi","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/nur-103-mb-alpine-linux-getestet-kleine-simple-und-sichere-linux-distribution-fuer-den-raspberry-pi\/","title":{"rendered":"Nur 103 MB &#8211; Alpine Linux getestet: Kleine, simple und sichere Linux-Distribution f\u00fcr den Raspberry Pi"},"content":{"rendered":"<p>Im Rahmen meiner Beitragsreihe zu Alternativen Betriebssystemen f\u00fcr den Raspberry Pi m\u00f6chte ich euch heute Alpine Linux vorstellen. &#8222;Klein, simpel und sicher&#8220; &#8211; mit diesen drei Worten beschreibt sich die seit 2010 existierende Distribution. Sie wurde vor allem im Zusammenhang mit Docker bekannt: Ein Alpine Basisimage ist nur wenige MB gro\u00df und damit deutlich kleiner als Debian, Ubuntu und andere Alternativen. Ich habe Alpine Linux auf dem Raspberry Pi getestet und zeige euch sowohl die Vor- als auch Nachteile auf. <\/p>\n<h2 class=\"wp-block-heading\">Eine Linux-Distribution in 103 MB<\/h2>\n<p>Das Erste was einem auff\u00e4llt: Alpine Linux ist sehr klein. Das gepackte Tar-Gz-Archiv umfasst lediglich etwa <strong>90 MB<\/strong>. Auspackt sind es 97 MB und installiert auf einem Raspberry Pi belegt es auf der Speicherkarte ungef\u00e4hr <strong>103 MB<\/strong>. Zum Vergleich: Bei der Light-Edition des Raspberry Pi OS werden etwa 1.200 MB belegt, DietPi ben\u00f6tigt immerhin noch knappe 700 MB.<\/p>\n<p>Diese Angaben sind nat\u00fcrlich immer als ungef\u00e4hre Werte zu verstehen. Mit Updates und anderen \u00c4nderungen werden die Betriebssysteme schon in wenigen Wochen ein paar MB gr\u00f6\u00dfer oder kleiner sein.<\/p>\n<h2 class=\"wp-block-heading\">Deutliche Unterschiede zu DietPi und dem Raspberry Pi OS<\/h2>\n<h3 class=\"wp-block-heading\">Installation<\/h3>\n<p>Die Installation ist etwas aufw\u00e4ndiger, da Alpine Linux den Raspberry Pi zwar offiziell unterst\u00fctzt. Jedoch werden keine vorgefertigten Abbilder angeboten, die sich etwa mit Etcher oder dem Imager einfach flashen lassen. Stattdessen muss man die Partitionierung von Hand \u00fcbernehmen. <a href=\"https:\/\/u-labs.de\/portal\/alpine-linux-auf-dem-raspberry-pi-mit-bildschirm-tastatur-maus-unter-windows-installieren\/\" title=\"Alpine Linux auf dem Raspberry Pi mit Bildschirm\/Tastatur\/Maus unter Windows  installieren\">Wie dies unter Windows mit der grafischen Datentr\u00e4gerverwaltung funktioniert, habe ich im vorherigen Beitrag bereits aufgezeigt<\/a>. Alternativ l\u00e4sst sich <strong>diskpart <\/strong>auf der Kommandozeile verwenden. Unter Linux ist die Partitionierung nat\u00fcrlich ebenfalls m\u00f6glich.<\/p>\n<h3 class=\"wp-block-heading\">(Erste) Einrichtung<\/h3>\n<p>\u00dcber den Befehl <strong>setup-alpine<\/strong> kann ein Skript gestartet werden, welches die wichtigsten Einrichtungsschritte \u00fcbernimmt: Etwa das Festlegen des Tastaturlayouts, der Zeitzone, Verbindung per Kabel bzw. WLAN herstellen oder die Installation eines SSH-Servers. Ein grafisches Men\u00fc existiert eben so wenig wie eine Erkl\u00e4rung zu den einzelnen Fragen des Skriptes. Ein Anf\u00e4nger wird ohne Anleitung bzw. Hintergrundwissen wahrscheinlich \u00fcberfordert sein.<\/p>\n<p>Weitere Standardeinstellungen gibt es nicht. Es liegt daher in der Verantwortung des Anwenders, sich beispielsweise einen normalen Benutzer ohne Administratorrechte anzulegen &#8211; standardm\u00e4\u00dfig existiert nur root. Alpine Linux richtet sich damit \u00e4hnlich wie Arch eher an erfahrene Anwender, die sich mit Linux auskennen und ihr System individuell einrichten k\u00f6nnen und m\u00f6chten.<\/p>\n<h3 class=\"wp-block-heading\">Installation von Paketen: APK statt APT<\/h3>\n<p>Unter Alpine kommt nicht der Paketmanager APT zum Einsatz, den das Raspberry Pi OS von Debian \u00fcbernommen hat. Stattdessen bringt die Distribution ihre eigene Paketverwaltung namens APK mit. Und der ist extrem schnell: In 0,7 Sekunden wurde die Paketliste mit derzeit rund 4.800 Paketen aktualisiert. Der Prozessmanager htop (13 MB) ist in rund 0,5 Sekunden auf dem Pi, beim Apache2 Webserver (16 MB) dauert es eine gute Sekunde.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\napk update      # 0.65s\napk add htop    # 0,47s (13 MB)\napk add apache2 # 1,21s (16 MB)\napk add curl    # 1,36s (18 MB)\n<\/pre>\n<\/div>\n<p>Das entfernen ist noch schneller: 0,43 Sekunden um Apache2 mit dem Befehl <strong>apk del apache2<\/strong> zu deinstallieren. Zum Vergleich: Die Paketlisten zu aktualisieren, kann unter dem Raspberry Pi OS schon mal 10 Sekunden dauern. Apache2 wird dort in 15,3s installiert und in 14 Sekunden entfernt. Jeweils mit 150 Mbit Download-Geschwindigkeit, sodass die Internetverbindung nicht der Flaschenhals ist.<\/p>\n<h3 class=\"wp-block-heading\">Vielfalt und Aktualit\u00e4t der Pakete<\/h3>\n<p>Ich habe f\u00fcr ein paar bekannte, verbreitete Pakete die Versionen verglichen. Wie man sieht, ist Alpine fast \u00fcberall auf der aktuellsten stabilen Version und zieht Updates zeitnah nach.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<tbody>\n<tr>\n<td><strong>Paket\/Software<\/strong><\/td>\n<td><strong>Raspberry Pi OS Version<\/strong><\/td>\n<td><strong>Alpine Linux Version<\/strong><\/td>\n<td><strong>Aktuellste stabile Version<\/strong><\/td>\n<\/tr>\n<tr>\n<td>apache2<\/td>\n<td>2.4.51<\/td>\n<td>2.4.52 (20.12.2021)<\/td>\n<td>2.4.52<\/td>\n<\/tr>\n<tr>\n<td>nginx<\/td>\n<td>1.18.0<\/td>\n<td>1.20.2 (17.11.2021)<\/td>\n<td>1.20.2 (Stable)\r\n1.21.5 (Mainline)<\/td>\n<\/tr>\n<tr>\n<td>PHP<\/td>\n<td>7.4.25<\/td>\n<td>8.0.14* (18.12.2021)\r\n8.1.1* (17.12.2021)<\/td>\n<td>8.0.14<\/td>\n<\/tr>\n<tr>\n<td>Node.JS<\/td>\n<td>12.22.5<\/td>\n<td>16.13.1-rc0 (3.15)\r\n16.13.1-rc1 (edge)<\/td>\n<td>16.13.1 (LTS)\r\n17.3.0 (Neueste)<\/td>\n<\/tr>\n<tr>\n<td>MariaDB<\/td>\n<td>10.5.12<\/td>\n<td>10.6.4-r2 (08.12.2021)<\/td>\n<td>10.6.5<\/td>\n<\/tr>\n<tr>\n<td>Docker<\/td>\n<td>Nicht offiziell verf\u00fcgbar<\/td>\n<td>20.10.11 (3.15, 19.11.2021)<\/td>\n<td>20.10.11 (17.11.2021)<\/td>\n<\/tr>\n<\/tbody>\n<\/table><figcaption class=\"wp-element-caption\">* Verf\u00fcgbar \u00fcber das Community-Repository statt Main<\/figcaption><\/figure>\n<p>PHP ist \u00fcber das Community-Repository erh\u00e4ltlich. Darin erh\u00e4ltliche Pakete werden in Zusammenarbeit mit dem Alpine-Team gepflegt, aber sind m\u00f6glicherweise nicht dauerhaft verf\u00fcgbar, wenn der Verantwortliche die Arbeit einstellt. Daf\u00fcr muss man das Repo in <strong>\/etc\/apk\/repositories<\/strong> aktivieren.<\/p>\n<p>Alpine Linux pflegt die Haupt- bzw. Nebenversion eines Paketes f\u00fcr eine bestimmte Betriebssystem-Version: Alpine v3.15 erh\u00e4lt z.B. NodeJS 16, w\u00e4hrend Alpine v3.15 die Vorg\u00e4nger-LTS-Version 14.18 bereitstellt. Wahlweise kann man seine Pakete aber auch auf Rolling Release umstellen, d.H. man bekommt immer die aktuellste stabile Version. Dazu in  <strong>\/etc\/apk\/repositories<\/strong> die Betriebssystemversion (z.B. 3.14) durch <strong>edge <\/strong>ersetzen.<\/p>\n<p>Rein von der Anzahl her gewinnt das Raspberry Pi OS: Zum 31.12.2021 sind dort \u00fcber <strong>59.000 Pakete<\/strong> enthalten, bei Alpine Linux dagegen &#8222;nur&#8220; rund <strong>4.800 St\u00fcck<\/strong> im Main sowie <strong>15.400<\/strong> zusammen mit dem Community-Repository.<\/p>\n<h3 class=\"wp-block-heading\">Kein Systemd: Alpine setzt auf OpenRC<\/h3>\n<p>Systemd hat sich in den letzten Jahren als Init-System in vielen Linux-Distributionen durchsetzen k\u00f6nnen Debian, Ubuntu und Red Hat nutzen es beispielsweise, daher auch das von Debian abstammende Raspberry Pi OS. Alpine verwendet stattdessen OpenRC, ein vergleichsweise eher leichtgewichtiges Init-System. <\/p>\n<p>Standardm\u00e4\u00dfig landen installierte Programme nicht im Autostart und werden nach der Installation nicht gestartet. Wer das z.B. beim Webserver Nginx einrichten m\u00f6chte, muss diesen h\u00e4ndisch starten und in das Standard-Runlevel eintragen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nrc-service nginx start\nrc-update add nginx default\n<\/pre>\n<\/div>\n<p>Das erfordert etwas Eingew\u00f6hnung, wenn man bisher nur Systemd kennt. <\/p>\n<h3 class=\"wp-block-heading\">Ein Betriebssystem vollst\u00e4ndig im Arbeitsspeicher<\/h3>\n<p>Ungew\u00f6hnlicher ist dagegen, dass sich Alpine Linux beim Starten in den RAM l\u00e4dt. Alle Schreibvorg\u00e4nge werden dort ausgef\u00fchrt &#8211; statt auf das Systemlaufwerk. F\u00fcr den Raspberry Pi ist das optimal: Speicherkarten sind nicht f\u00fcr all zu viele Schreibvorg\u00e4nge ausgelegt und zudem nicht besonders schnell. Alpine wird dadurch besonders resistent gegen z.B. Festplattenausf\u00e4lle oder im Falle des Raspberry dem direkten Ziehen des Netzsteckers ohne sauberes Herunterfahren.<\/p>\n<p>Dadurch ist es notwendig, seine \u00c4nderungen abzuspeichern. Daf\u00fcr gibt es das (Alpine) Linux Backup Utility, kurz LBU. Wenn man etwas an seinem Pi ver\u00e4ndert hat, muss man mit LBU diese \u00c4nderung permanent auf die Karte in eine sogenannte <strong>Overlay-Datei<\/strong> schreiben:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nlbu commit\n# Bzw. mit -d, um vorherige Overlay-Dateien zu entfernen\nlbu commit -d\n<\/pre>\n<\/div>\n<p>Vergisst man das Speichern per commit, sind diese nach einem Neustart weg. Das kann aber auch hilfreich sein, um etwas auszuprobieren.<\/p>\n<p><strong>Wichtig<\/strong>: Standardm\u00e4\u00dfig schlie\u00dft LBU nur Ordner und Dateien innerhalb von <strong>\/etc<\/strong> ein! Weitere Pfade lassen sich einschlie\u00dfen, dies muss aber h\u00e4ndisch vorgenommen werden.<\/p>\n<h3 class=\"wp-block-heading\">Fokus auf Sicherheit<\/h3>\n<p>Alpine nutzt einen geh\u00e4rteten Kernel. Au\u00dferdem werden alle Pakete mit Schutz vor Puffer\u00fcberlauf kompiliert, um die Auswirkungen von Schwachstellen zu reduzieren. Der minimalistische Ansatz kommt der Sicherheit ebenfalls zugute: Je weniger (nicht ben\u00f6tigte) Software man auf dem System installiert hat, um so weniger Angriffsfl\u00e4che ist vorhanden. <\/p>\n<h3 class=\"wp-block-heading\">Einsatz von Musl statt glibc kann Probleme bereiten<\/h3>\n<p>Viele Programme sind in C oder C++ geschrieben. Die GNU-C-Bibliothek ist eine freie Implementierung von Standardfunktionen f\u00fcr C und wird von vielen Programmen genutzt. Sie steht allerdings in der Kritik, aufgebl\u00e4ht zu sein, wodurch damit entwickelte Programme unn\u00f6tig gr\u00f6\u00dfer werden. Alpine Linux hat sich daher f\u00fcr <strong>Musl <\/strong>entschieden. Musl ist teilweise mit glibc Bin\u00e4rkompatibel, also kein 1:1 Ersatz.<\/p>\n<p>In der Praxis hei\u00dft das: Programme m\u00fcssen f\u00fcr Musl neu kompiliert werden. Nicht alle laufen unter Alpine Linux. Ein pers\u00f6nliches Beispiel ist das <strong>IBM.Data.DB2.Core-lnx <\/strong>NuGet-Paket. Es erm\u00f6glicht .NET Core, sich mit einer DB2 zu verbinden. Unter Alpine st\u00fcrzt die Bibliothek mit Fehlercode<em> 139\/Segmentation fault<\/em> ab. Gerade wenn Binaries in Bibliotheken verwendet werden, kann dies eine Fehlerquelle sein. Ob Probleme auftreten oder nicht, h\u00e4ngt am Ende davon ab, welche Software genutzt wird, was diese genau macht und ob sie mit Musl kompatibel ist.<\/p>\n<h3 class=\"wp-block-heading\">Stromverbrauch<\/h3>\n<p>Da Alpine besonders leichtgewichtig ist, fand ich es interessant, einen Blick auf den Stromverbrauch zu werfen. Im Leerlauf liegt dieser zwischen 1,6 und 1,7 Watt bei einem Raspberry Pi 4. Das ist minimal weniger als <a href=\"https:\/\/u-labs.de\/portal\/raspberry-pi-4-stromverbrauch-gemessen-so-viel-stromkosten-verursacht-der-pi\/\" title=\"Raspberry Pi 4 Stromverbrauch gemessen: So viel Stromkosten verursacht der Pi\">beim Raspberry Pi OS in seiner Standard-Konfiguration, dies hatte ich in der Vergangenheit bereits getestet<\/a>. Allerdings liegt dieser Unterschied im Bereich der Messtoleranz und ist ohnehin derart gering, dass er selbst im 24\/7 Dauerbetrieb nicht ins Gewicht fallen w\u00fcrde.<\/p>\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n<p>Alpine Linux ist eine sehr schlanke Distribution, die sich zudem auf Einfachheit und Sicherheit spezialisiert hat. Sie bietet deutlich weniger Pakete als Debian bzw. das Raspberry Pi OS. Daf\u00fcr sind die vorhandenen deutlich aktueller. Standardm\u00e4\u00dfig liegt das komplette Betriebssystem im Arbeitsspeicher. Optional kann dies deaktiviert werden. Aber gerade f\u00fcr den Pi ist es optimal, um Zugriffe auf die Speicherkarte zu vermeiden. Damit muss man jedoch umgehen k\u00f6nnen, sonst gehen \u00c4nderungen ungewollt verloren. F\u00fcr Anf\u00e4nger ist Alpine weniger geeignet &#8211; schon f\u00fcr die Einrichtung ist eine gewisse Erfahrung notwendig.<\/p>\n<p>Auch f\u00fcr Fortgeschrittene Anwender bleibt dennoch ein gr\u00f6\u00dferer Nachteil: Die nicht 100%tige Kompatibilit\u00e4t zur verbreiteten glibc. Zwar sind die Gr\u00fcnde f\u00fcr den Einsatz von musl nachvollziehbar. Als Nutzer bleibt jedoch ein Risiko. Im Zweifel kann man nur testen.<\/p>\n<p>Beachten sollte man hierbei: Falls es jetzt oder in Zukunft Probleme gibt, muss man den Pi mit einem anderen Betriebssystem neu installieren. Das ist aufw\u00e4ndiger als mit Docker: In einem Container-Image wechselt man das Basis-Image, passt die Befehle an und nutzt eben wieder Debian oder etwas anderes. Gerade durch Docker entsteht teils aber auch offizielle Unterst\u00fctzung, da einige Images zumindest eine Alpine-Variante als Alternative anbieten. Durch Containerisierung kann man solche Probleme l\u00f6sen und bei Bedarf eine Software, die nicht mit Musl kompatibel ist, in einem Container mit z.B. Debian und glibc laufen lassen. Bei nativen Installationen gibt es diese M\u00f6glichkeit nicht, da musl und glibc nicht parallel installiert werden k\u00f6nnen.<\/p>\n<p>Dennoch ist der Ansatz von Alpine Linux sehr interessant und die Bedienung v.a. vom Paketmanager APK angenehm schnell. Vor allem dort, wo die Ressourcen knapp sind &#8211; etwa auf einem Zero oder Zero 2 mit nur 512 MB Arbeitsspeicher. Als Webserver mit PHP kann Alpine z.B. gute Dienste leisten, sofern keine exotischen PHP-Module verwendet werden, die hier nicht laufen. <\/p>\n<p>Wer m\u00f6glichst uneingeschr\u00e4nkt alles ausprobieren m\u00f6chte und zudem vielleicht auch noch nicht so erfahren mit Linux ist, der sollte nicht unbedingt mit Alpine einsteigen &#8211; sondern zun\u00e4chst DietPi oder Raspberry Pi OS ausprobieren. Dort erzielt man auch leichter und damit schneller Erfolgserlebnisse. Zudem ist die Unterst\u00fctzung daf\u00fcr nach wie vor am gr\u00f6\u00dften, wenngleich Alpine mittlerweile auch eine beachtliche Anzahl an recht aktuellen Paketen besitzt.<\/p>\n<h2 class=\"wp-block-heading\">Quellen und weiterf\u00fchrende Informationen<\/h2>\n<p>https:\/\/wiki.alpinelinux.org\/wiki\/Raspberry_Pi\r\nhttps:\/\/wiki.alpinelinux.org\/wiki\/Create_a_Bootable_Device#Format_USB_stick\r\nhttps:\/\/wiki.alpinelinux.org\/wiki\/Alpine_local_backup\r\nhttps:\/\/www.alpinelinux.org\/about\/\r\nhttps:\/\/wiki.alpinelinux.org\/wiki\/Enable_Community_Repository\r\nhttps:\/\/wiki.alpinelinux.org\/wiki\/Xfce\r\nhttps:\/\/wiki.alpinelinux.org\/wiki\/Upgrading_Alpine#Upgrading_Alpine_Linux_on_other_removable_media_.28such_as_CF.2FUSB.29\r\nhttp:\/\/www.etalabs.net\/compare_libcs.html\r\nhttps:\/\/wiki.musl-libc.org\/functional-differences-from-glibc.html<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Rahmen meiner Beitragsreihe zu Alternativen Betriebssystemen f\u00fcr den Raspberry Pi m\u00f6chte ich euch heute Alpine Linux vorstellen. &#8222;Klein, simpel und sicher&#8220; &#8211; mit diesen drei Worten beschreibt sich die seit 2010 existierende Distribution. Sie wurde vor allem im Zusammenhang mit Docker bekannt: Ein Alpine Basisimage ist nur wenige MB gro\u00df und damit deutlich kleiner &#8230;<\/p>\n","protected":false},"author":5,"featured_media":8305,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1053],"tags":[1010],"class_list":["post-8298","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi-betriebssysteme","tag-alpine"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8298","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=8298"}],"version-history":[{"count":8,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8298\/revisions"}],"predecessor-version":[{"id":9788,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8298\/revisions\/9788"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/8305"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=8298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=8298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=8298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}