Ü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