Raspbian auf einen USB-Stick installieren

Üblicherweise verwendet der Raspberry Pi eine SD-Karte als einzigen Datenspeicher: Die SD-Karte enthält sowohl das Betriebssystem (oft Raspbian) als auch Ihre eigenen Daten, z.B. mit dem Raspberry Pi erstellte Fotos, Messdaten etc. Optional kann ein USB-Stick als zusätzlicher Datenspeicher verwendet werden.

Abweichend von diesem Standardszenario besteht auch die Möglichkeit, Linux direkt auf einen USB-Stick zu installieren. Die SD-Karte wird weiterhin benötigt, weil Raspbian von dort die für den Boot-Prozess erforderlichen Dateien liest. Aber alle weiteren Linux-Dateien und -Programme werden in der Folge direkt vom USB-Stick gelesen. Anstelle eines USB-Sticks können Sie auch eine USB-Festplatte mit eigener Stromversorgung verwenden.

Vorsicht: Diese Anleitung richtet sich an fortgeschrittene Raspberry-Pi-Nutzer, die mit Linux schon einigermaßen fit sind.

Vor- und Nachteile

Die Verwendung eines USB-Sticks anstelle einer SD-Karte hat einige Vorteile:

  • USB-Sticks sind mitunter zuverlässiger als SD-Karten.

  • Die Übertragungsgeschwindigkeit von bzw. zu USB-Sticks ist ein wenig höher als bei SD-Karten. In der Praxis ist der Geschwindigkeitszuwachs freilich kleiner als erwartet. Der limitierende Faktor bleibt das USB-System des Raspberry Pi.

Dem stehen die folgenden Nachteile gegenüber:

  • Für die erste Phase des Boot-Prozesses wird weiterhin eine SD-Karte benötigt. Die erforderlichen Dateien beanspruchen weniger als 30 MByte. Den verbleibenden Platz können Sie immerhin als zusätzlichen Datenspeicher verwenden.

  • Der USB-Stick blockiert einen USB-Slot.

  • Installation und Konfiguration sind etwas komplizierter.

Boot-Prozess OHNE SD-Karte: Aktuelle Modelle des Raspberry Pi 3 (Modell B) sind theoretisch sogar in der Lage, ohne SD-Karte direkt von einem Datenträger zu booten. Bei meinen Tests hat das aber nicht funktioniert. Zudem ist es seit der Ankündigung dieses Beta-Features wieder recht ruhig in dieser Sache geworden. Kurzum, Sie können Ihr Glück versuchen, aber dieser Blog-Beitrag geht davon aus, dass Sie den Boot-Prozess mit einer kleinen SD-Karte initiieren.

USB-Stick vorbereiten

Wir gehen im Folgenden davon aus, dass Sie Raspbian installieren möchten. Prinzipiell ist eine USB-Stick-Installation natürlich auch für andere Distributionen möglich, allerdings sind dann unter Umständen kleine Abweichungen erforderlich.

Als Erstes müssen Sie Ihren USB-Stick so vorbereiten wie eine SD-Karte. Sofern es sich nicht um ein fabrikneues Modell handelt, formatieren Sie den USB-Stick. Anschließend übertragen Sie die Raspbian-Image-Datei auf den USB-Stick. Dazu können Sie dieselben Programme wie zum Beschreiben einer SD-Karte verwenden, also z.B. Etcher oder das Kommando dd.

SD-Karte vorbereiten

Wie bereits erwähnt wurde, benötigen Sie zusätzlich zum USB-Stick auch eine SD-Karte, wobei ein kleines Modell mit z.B. 1 GByte Speicher vollkommen ausreichend ist. Nachdem Sie die SD-Karte VFAT-formatiert haben, kopieren Sie alle Dateien aus der Boot-Partition des USB-Sticks dorthin. Es handelt sich dabei insbesondere um die Dateien bcm*, bootcode.bin, kernel*.img, config.txt, cmdline.txt, start*.* und das gesamte overlays-Verzeichnis. Diese Dateien müssen direkt auf der SD-Karte gespeichert werden, also nicht in einem Verzeichnis.

Nun laden Sie die Datei cmdline.txt der SD-Karte in einen beliebigen Texteditor. Diese Datei enthält in einer einzigen, sehr langen Zeile diverse Optionen, die beim Hochfahren des Raspberry Pi an den Kernel übergeben werden. Sie müssen im Editor nun eine Option veränden: Anstelle von root=/dev/mmcblk0p2 muss es root=/dev/sda2 heißen. Diese Änderung bewirkt, dass Linux die zweite Partition des USB-Sticks als Systempartition verwendet, nicht wie sonst üblich die zweite Partition der SD-Karte. Nachdem Sie cmdline.txt gespeichert haben, stecken Sie die SD-Karte und den USB-Stick an Ihren Raspberry Pi und starten den Minicomputer.

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh quiet splash plymouth.ignore-serial-consoles

cmdline-Syntax: Achten Sie darauf, dass die Datei cmdline.txt weiterhin aus nur einer Zeile bestehen darf. Manche Editoren umbrechen den Text und machen aus der Optionszeile mehrere kürzere Zeilen. In diesem Fall würde nur die erste Zeile berücksichtigt und der Boot-Vorgang würde scheitern!

Systempartition vergrößern

Sofern Ihnen bei den Vorbereitungsarbeiten keine Fehler unterlaufen sind, verläuft der Startprozess genauso wie bei der Verwendung einer normalen SD-Karte. Allerdings müssen Sie sich nun selbst darum kümmern, das Dateisystem auf dem USB-Stick so zu vergrößern, dass es den gesamten auf dem Datenträger zur Verfügung stehenden Platz nutzt. raspi-config bietet zwar mit Expand Filesystem eine entsprechende Funktion, diese kann aber nur verwendet werden, wenn sich Raspbian auf der SD-Karte befindet.

Damit Sie also den ganzen Platz Ihres USB-Sticks verwenden können, müssen Sie selbst Hand anlegen. Die folgenden Kommandos zeigen, wie Sie mit dem Programm fdisk die Systempartition zuerst löschen und dann neu anlegen, wobei Sie unbedingt exakt dieselbe Startposition verwenden müssen. fdisk führen Sie wahlweise direkt in der Textkonsole oder in einem Terminalfenster aus.

sudo fdisk /dev/sda
Command (m for help): p
  Disk /dev/sda: 31.4 GB, 31440961536 bytes
  64 heads, 32 sectors/track, 29984 cylinders, 
    total 61408128 sectors
  Units = sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disk identifier: 0x000981cb
     Device Boot  Start     End  Blocks   Id  System
  /dev/sda1        8192  122879   57344    c  W95 FAT32 (LBA)
  /dev/sda2      122880 5785599 2831360   83  Linux

Command (m for help): d
  Partition number (1-4): 2

Command (m for help): n
  Partition type:
     p   primary (1 primary, 0 extended, 3 free)
     e   extended
  Select (default p): p
  Partition number (1-4, default 2): 2
  First sector (2048-61408127, default 2048): 122880
  Last sector, +sectors or +size{K,M,G} (122880-61408127, 
    default 61408127): <Return>
  Using default value 61408127

Command (m for help): p
  Disk /dev/sda: 31.4 GB, 31440961536 bytes
  64 heads, 32 sectors/track, 29984 cylinders, 
    total 61408128 sectors
  Units = sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disk identifier: 0x000981cb
     Device Boot Start      End   Blocks   Id  System
  /dev/sda1       8192   122879    57344    c  W95 FAT32 (LBA)
  /dev/sda2     122880 61408127 30642624   83  Linux

Command (m for help): w
  The partition table has been altered!
  Calling ioctl() to re-read partition table.
  WARNING: Re-reading the partition table failed with error 16: 
  Das Gerät oder die Ressource ist belegt.  The kernel still uses
  the old table. The new table will be used at the next reboot or
  after you run partprobe(8) or kpartx(8)

Nun die ausführliche Erklärung, was hier vor sich geht: fdisk ist ein Kommando zur Partitionierung von Festplatten und anderen Datenträgern. Beim Start muss der sogenannte Device-Name des Geräts angegeben werden, also eine Spezialdatei, über die Linux auf die Festplatte zugreifen kann. Für den USB-Stick des Raspberry Pi lautet der Device-Name /dev/sda.

fdisk ist ein interaktives Programm, in dem Sie Kommandos ausführen. Die Eingabe von Kommandos erfolgt durch Buchstaben und [Return]. Das erste Kommando [p] (print) listet die aktuelle Partitionstabelle auf. Es gibt also zwei Partitionen: eine kleine Partition mit einem Windows-Dateisystem, das in unserem Setup gar nicht verwendet wird, und eine größere Linux-Partition. Alle Start- und Endpositionen jeder Partition werden in Blöcken angegeben, wobei jeder Block 512 Byte groß ist. Davon abweichend wird die Größe der Partition in der Spalte Blocks hingegen in Vielfachen von 1024 Byte angegeben.

Die wichtigste Information für Sie ist die Startposition der zweiten Partition beim Block 122880. Sollte sich das Raspbian-Installations-Image nach Erscheinen dieses Buchs ändern, kann es sein, dass fdisk bei Ihnen eine andere Position anzeigt. Diese Position müssen Sie sich merken.

[d] (delete) löscht nun die zweite Partition. Keine Angst, sofern Sie die weitere Anleitung exakt befolgen, verlieren Sie dabei keine Daten! Denn bereits im nächsten Schritt wird die Partition mit [n] (new) wieder neu angelegt. fdisk fragt nun zuerst nach der Partitionsnummer (2), dann nach dem Partitionstyp (p für primary) und schließlich nach der Startposition der neuen Partition: Jetzt ist es entscheidend, dass Sie exakt dieselbe
Startposition wie bisher angeben, in unserem Beispiel also 122880 Blöcke. Unkompliziert ist die Frage nach der Endposition: fdisk schlägt den letzten Block des USB-Sticks vor, und Sie bestätigen diese Position einfach mit [Return].

Bis jetzt haben Sie alle Änderungen nur im Speicher durchgeführt. Erst mit [w] (write) wird die neue Partitionstabelle tatsächlich auf dem USB-Stick gespeichert. Jetzt gibt es also kein Zurück mehr.

Nach dem Neustart mit sudo reboot erkennt Linux die neue Partitionsgröße. Unverändert geblieben ist aber das Dateisystem, das weiterhin nur einige GByte der Partition nutzt. Daher ist nun ein letzter Schritt erforderlich: Die Anpassung des Dateisystems an die neue Partitionsgröße. Dazu führen Sie das folgende Kommando in der Textkonsole oder in einem Terminal aus:

sudo resize2fs /dev/sda2
  resize2fs 1.42.5 (29-Jul-2012)
  Das Dateisystem auf /dev/sda2 ist auf / eingehängt; 
  Online-Grössenveränderung nötig
  old_desc_blocks = 1, new_desc_blocks = 2
  Das Dateisystem auf /dev/sda2 ist nun 7660656 Blöcke groß.

Zuletzt sollten Sie sich vergewissern, ob alles funktioniert hat. Dazu führen Sie das Kommando df -h aus. Es gibt einen Überblick über alle aktiven Dateisysteme. Gleich die erste Zeile des Ergebnisses zeigt, dass das Dateisystem in der Systempartition auf unserem 32-GByte-USB-Stick nun rund 29 GByte beträgt. Vielleicht fragen Sie sich, wo die übrigen drei GByte geblieben sind. Der Grund für die Diskrepanz sind unterschiedliche Rechenweisen. Datenträgerhersteller rechnen immer dezimal. Ein USB-Stick mit 32 GByte umfasst demnach rund 32.000.000.000 Byte. df rechnet hingegen binär. Ein GByte entspricht dort 2^30 Byte, also 1.073.741.824 Byte.

Die restlichen Zeilen des df-Ergebnisses betreffen größtenteils temporäre bzw. virtuelle Dateisysteme. Interessant wird es erst wieder bei den letzten beiden Zeilen. Die /boot-Partition stammt von der SD-Karte und enthält die für den Boot-Prozess erforderlichen Daten. Über das Verzeichnis /media/boot ist außerdem die erste Partition des USB-Sticks zugänglich. Diese enthält ebenfalls Boot-Dateien, die aber ungenutzt sind.

df -h
  Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
  rootfs           29G    2.0G   26G    8% /
  /dev/root        29G    2.0G   26G    8% /
  devtmpfs        211M       0  211M    0% /dev
  tmpfs            44M    288K   44M    1% /run
  ...
  /dev/mmcblk0p1  7.3G     22M  7.3G    1% /boot
  /dev/sda1        56M     19M   38M   34% /media/boot