Raspberry Pi 3: Von USB-Sticks und SSD-Festplatten booten
Mit der ursprünglichen Ankündigung des Raspberry Pi 3 haben die Entwickler weitere Boot-Optionen für den kleinen Rechner in Aussicht gestellt. Eine davon ist das Booten von USB-Massenspeicher. Diese Ankündigung wurde jetzt mit einem experimentellen Bootloader umgesetzt. Mit diesem kann der Raspberry Pi 3 von SSD-Festplatten und USB-Sticks booten. Eine mircoSD-Karte ist zukünftig nicht mehr notwendig.
Die Einrichtung zum Booten von USB-Sticks und SSD-Festplatten für den Raspberry Pi 3 ist nicht kompliziert. Anwender, die mehr Speicherplatz benötigen, beispielsweise für die Installation von ownCloud auf dem Raspberry Pi, können sich jetzt einige Schritte bei der Einrichtung sparen. Jedoch gilt zu bedenken, dass sich die veröffentlichte Version noch im Beta-Status befindet. Zudem funktioniert diese Anleitung nur mit einem Raspberry Pi 3 und nicht mit den Modellen 2 und 1.
Update (06.10.2016): Durch die Hinweise in den Kommentaren ist mir aufgefallen, dass WordPress die Kommandozeilen falsch darstellt. Das wurde jetzt durch entsprechende Textboxen behoben. Vielen Dank an kiar.
Raspberry Pi 3: Von USB-Sticks und SSD-Festplatten booten
Die Vorab-Version des Bootloaders wird mit dem kommenden Raspbian-Release eingesetzt und ermöglicht das Booten von USB-Laufwerken. Dadurch lässt sich zukünftig die Nutzung der microSD-Karten vermeiden, die für gelegentliche Wackelkontakte und Zugriffsprobleme bekannt sind. Wer die Anleitung umsetzen möchte, muss bedenken, dass sich die Funktion noch in der Testphase befindet.
Hinweis: Nicht alle USB-Sticks und SSD-Festplatten funktionieren mit dieser Anleitung. Einige USB-Massenspeicher starten zu langsam. Der Bootloader erwartet eine Reaktion innerhalb von 2 Sekunden. Diese Antwortzeit lässt sich gegebenenfalls auch auf 5 Sekunden erhöhen. USB-Sticks und SSD-Festplatten, die innerhalb dieser Zeit nicht reagieren, werden vom Bootloader nicht berücksichtigt.
Damit der Raspberry Pi 3 von einer SSD-Festplatte oder USB-Stick bootet, muss der USB boot mode aktiviert werden. Um diesen aktivieren zu können, wird eine spezielle start.elf und bootcode.bin Datei benötigt. Diese lassen sich über den „next“-branch beim rpi-update installieren.
Schritt 1: Raspbian auf SD-Karte installieren
Vor dem Start wird eine lauffähige Installation von Raspbian auf einer microSD-Karte benötigt. Die Einrichtung wird hier im Blog ausführlich erklärt.
Schritt 2: /boot-Verzeichnis bearbeiten
Das /boot-Verzeichnis der Raspbian-Installation ist mit experimentellen Boot-Dateien auszustatten. Anwender die Raspbian Lite nutzen, müssen vorher das rpi-update ausführen.
sudo apt-get update; sudo apt-get install rpi-update sudo BRANCH=next rpi-update
Anschließend lässt sich der USB boot mode wie folgt einschalten:
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
Dadurch wird die Zeile program_usb_boot_mode=1 an das Ende der Datei /boot/config.txt gesetzt. Danach ist der Raspberry Pi neuzustarten.
sudo reboot
Nach dem Neustart ist zu prüfen, ob der OTP (One-Time Programmable Speicher) programmiert wurde:
vcgencmd otp_dump | grep 17:
Das Ergebnis sollte wie folgt lauten:
17:3020000a
Dabei ist zu prüfen, dass das Ergebnis 0x3020000a richtig ist.
Der Raspberry Pi 3 ist jetzt fähig, von einem USB-Stick oder einer SSD-Festplatte zu booten.
Schritt 3: Optional: USB boot mode entfernen
Wenn ihr die mircoSD-Karte mit der Raspbian Installation in verschiedenen Raspberry Pis im Einsatz habt, würde jeder Neustart dazu führen, dass der USB boot mode auf jedem Geräten aktiviert wird. Sollte das nicht gewünscht sein, müsst ihr die Zeile program_usb_boot_mode wieder aus der config.txt entfernen. Vergewissert euch dabei, dass am Ende der Datei keine leere Zeile übrig bleibt. Folgender Befehl ruft die config.txt auf:
sudo nano /boot/config.txt
Schritt 4: USB-Speicher vorbereiten
Warnung: Der USB-Massenspeicher, von dem der Raspberry Pi 3 zukünftig booten soll, darf keine wichtigen Dateien enthalten, da dieser vollständig gelöscht wird.
Verbindet den USB-Massenspeicher mit dem Raspberry Pi. Anstatt das Raspbian Image neu herunterzuladen, wird dieses einfach von der mircoSD-Karte auf den USB-Speicher kopiert. Dazu nutzen wir den Linux CP-Befehl zum Kopieren von Dateien. Die Quelle ist die mircoSD-Karte /dev/mmcblk0 und das Ziel der USB-Speicher /dev/sda. Prüft vor dem Ausführen, dass die Angaben richtig sind. Diese können sich ändern, wenn weitere USB-Geräte verbunden sind.
Mit dem parted Befehl wird eine 100 MB große FAT32 Partition erstellt, gefolgt von einer Linux ext4 Partition, welche den restlichen Speicherplatz einnimmt.
sudo parted /dev/sda (parted) mktable msdos Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue? Yes/No? Yes (parted) mkpart primary fat32 0% 100M (parted) mkpart primary ext4 100M 100% (parted) print Model: SanDisk Ultra (scsi) Disk /dev/sda: 30.8GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 99.6MB 98.6MB primary fat32 lba 2 99.6MB 30.8GB 30.7GB primary ext4 lba
Euer parted Ergebns sollte ähnlich wie aus meinem Beispiel oben aussehen. Anschließend sind die Dateisysteme für boot und root zu setzen:
sudo mkfs.vfat -n BOOT -F 32 /dev/sda1 sudo mkfs.ext4 /dev/sda2
Mountet das Ziel-Dateisystem und kopiert das laufende Raspbian-System auf den USB-Massenspeicher:
sudo mkdir /mnt/target sudo mount /dev/sda2 /mnt/target/ sudo mkdir /mnt/target/boot sudo mount /dev/sda1 /mnt/target/boot/ sudo apt-get update; sudo apt-get install rsync sudo rsync -ax --progress / /boot /mnt/target
Die SSH-Host Keys müssen wiederhergestellt werden:
cd /mnt/target sudo mount --bind /dev dev sudo mount --bind /sys sys sudo mount --bind /proc proc sudo chroot /mnt/target rm /etc/ssh/ssh_host* dpkg-reconfigure openssh-server exit sudo umount dev sudo umount sys sudo umount proc Anschließend ist die /boot/cmdline.txt zu bearbeiten, so dass diese den USB-Massenspeicher anstatt die mircoSD-Karte als root-Dateisystem verwendet:
sudo sed -i "s,root=/dev/mmcblk0p2,root=/dev/sda2," /mnt/target/boot/cmdline.txt
Das gleiche gilt für fstab:
sudo sed -i "s,/dev/mmcblk0p,/dev/sda," /mnt/target/etc/fstab
Danach muss man das Ziel-Dateisystem unmounten und den Raspberry Pi 3 ausschalten:
cd ~ sudo umount /mnt/target/boot sudo umount /mnt/target sudo poweroff
Abschließend den Strom-Stecker von Raspberry Pi abziehen und die mircoSD-Karte entfernen. Jetzt kann der kleine Rechner wieder mit Strom versorgt werden und sollte direkt von USB-Massenspeicher booten.
Persönliche Meinung
Wer große Mengen an Daten auf dem Raspberry Pi speichern möchte, musste bisher Raspbian von der microSD-Karte laufen lassen und anschließend ein USB-Massenspeicher einbinden und diesen als Speicherort festlegen. Beispielsweise für die Installation von Seafile auf dem Raspberry Pi. Dieser Umweg entfällt zukünftig. Auch das Problem mit den Wackelkontakten der mircoSD-Karte lässt sich auf diese Weise vorbeugen.
Ist für euch das Booten vom USB-Massenspeicher für den Raspberry Pi ein großer Vorteil? Schreibt mir eure Meinung in den Kommentaren.
Quelle: Raspberrypi.org
Geek, Blogger, Consultant & Reisender. Auf seiner Detail-Seite findest du weitere Informationen über Benjamin. In seiner Freizeit schreibt Benjamin bevorzugt über Technik-Themen. Neben Anleitungen und How-To’s interessieren Benjamin auch Nachrichten zur IT-Sicherheit. Sollte die Technik nicht im Vordergrund stehen, geht Benjamin gerne wandern.
nix geht!
meine fresse nochmal! wie kann man nur eine anleitung veröffentlich die nicht funktioniert?! das schlimmste ist, dass nach schritt2 sudo reboot keine ssh verbindung aufgebaut werden kann. alter, LÖSCH diese anleitung!!!!!!
Hallo Jonny,
die Anleitung funktionierte bei mir fehlerfrei. Der Beitrag beschreibt die Vorgehensweise von Raspberrypi.org.
Hast du sichergestellt, dass dein USB-Speicher schnell genug ist. Eine herkömmliche USB-Festplatte funktioniert beispielsweise nicht.
Es sollte ein schneller USB-Stick oder eine SSD sein.
Bitte achte auf deine Ausdrucksweise.
Grüße Benjamin
Hi Benjamin,
Ich muß Deiner Ausführung widersprechen.
Ich bekam am Samstag, 16.12.2017 meinen neuen Raspberry.
Ich habe den USB-Boot laut Anleitung durchgeführt.
Da ich meine neue Festplatte erst morgen bekomme, habe ich eine Festplatte genommen, die schon asbach uralt ist. Dieser würde ich definitiv keine Daten anvertrauen. Aber zum testen reicht es.
So der Raspberry hat während des Bootvorganges einen Neustart gemacht. Es hat ewig gedauert, bis das System oben war. Aber es ging.
Ich habe mir bewußt KEINE SSD bestellt, weil dieser Raspberry als reiner Logserver arbeiten soll um alle Zustände der CCU und den dazugehörigen Aktoren/Sensoren zu protokollieren.
Aufgrund der Datenmenge wird auch in einschägigen Foren vor dem Eisatz von SD/SSD gewarnt.
Gruß, Mathias
Ich kriege das laut deiner Anleitung nicht hin. Komme bis zu den Partitionen und wenn er dann die Sd-Karte kopieren soll sagt er mir das die dateien in benutzung sind und nicht kopiert werden können.
Gibt es mittlerweile eineLösung für dieses HowTo? Wenn´s nicht funzt, nütz es wohl niemandem..Vielleicht wäre ein Link auf den entsprechenden Raspberry-Forum Eintrag hilfreich?
sudo mount –bind /dev dev
sudo mount –bind /sys sys
sudo mount –bind /proc proc
sind falsch, müssen heißen
sudo mount –bind /dev dev
sudo mount –bind /sys sys
sudo mount –bind /proc proc
Das verwendete CMS stellt scheinbar keine doppelten Bindestriche dar, sondern macht einen langen Bindestrich daraus.
Die bind-Befehle brauchen aber 2 Bindestriche davor.
Hallo kiar,
vielen Dank für deinen Hinweis. Ich habe die Darstellung im Beitrag überarbeitet.
Beste Grüße
Benjamin
Trotzdem alles bei mir nach Anleitung funktioniert hat, ich will auch mit meckern. Nein, war ein Scherz. Allerdings hast Du vergessen für die Überschlauen anzugeben,daß das Partitionsprogramm mit „quit“ beendet werden muß, bevor man weiter nach Anleitung fortsetzen kann. Danke, bei mir hat alles prima geklappt.
Pingback: Wordpress: Code in Beiträgen richtig darstellen – random brick [DE]
Hallo Benjamin,
Top Anleitung – viiiiiielen Dank!
Eine Frage zum Verständnis zur Nutzung von rsync:
Du mountest / und boot Partition ins target und dann
sudo rsync -ax –progress / /boot /mnt/target
wäre es nicht möglich auch so zu kopieren (nach der mounterei):
sudo rsync -a –progress / /mnt/target
Gruß
*michi*
Hallo Michael,
das müsste man ausprobieren. Ganz sicher bin ich mir da nicht.
Grüße Benjamin
Hallo Benjamin,
recht herzlichen Dank für die super Anleitung – hat bei mir auf Anhieb funktioniert, bis zum apt-get update / upgrade. Danach ist das System nicht mehr hochgefahren. Nach der erneuten Ausführung der Anleitung funktioniert es wieder bis zum Update… Kannst Du mir sagen was da falsch läuft?
Gruß von Frank
Hallo Benjamin,
echt top Deine Anleitung.
Das funktionierte bei mir astrein. Jetzt habe ich eien m.2 ssd am raspy 🙂
Respekt!
Einzige Besonderheit: nachdem alles über die usb-ssd lief und bootete, habe ich einen dist-upgrade gemacht. Danach ging gar nix mehr (bootete nicht mehr).
Ich habe dann die /boot partition nochmal von der sd Karte auf die usb ssd kopiert. Dann hat wieder alles funktioniert.
Hast Du eine Idee was da schief egangen sein könnte?
Traue mich nicht mehr einen dist-upgrade zu machen.
Gruß
*michi*
Hallo *michi*,
das ist komisch, denn eigentlich wurde die Version mit der aktuellen Version ausgeliefert.
Wieso das dist-upgrade das Booten von der SSD-Festplatte zerstört, kann ich dir leider nicht erklären.
Das wäre evtl. etwas für ein entsprechendes Raspberry Pi Forum.
Grüße Benjamin
Hab das Problem bzw. Lösung gefunden: https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=155167&start=200
Man muss nach ‚apt-get dist-upgrade‘ noch:
sudo BRANCH=next rpi-update
ausführen.
Das habe ich nicht gemacht und dann geht das pi nicht mehr zu booten.
Mir hat als Reparatur das hier geholfen:
Just copy fixup* start* and bootcode.bin
from
https://github.com/raspberrypi/firmware/tree/next/boot
to the drive
Also die Anleitung ist Super.
Ich habe einen ziemlich neuen RaspPi 3 da scheint kein Update nötige gewesen zu sein nur dei
Änderunge in der „config.txt“
Ich habe normale Festplatten benutzt und da passierte erst gar nix.
Dann habe ich die mal eine Weile vergessen und siehe da der Regebogen Bootscreen tauchte auf und
die wollte immer noch von der SD-Karte booten.
Dann noch mal nachgeschaut : Die sed Kommandos hatten die boot Datei gar nicht geändert und
in der Fstab standen einfach falsche Werte weil ich ein NOOBS SD-Karte hatte und da Partition 7 und 8 drinn standen.
Boot auf 2 und die fstab auf sda1 und sda2 geändert und schon klappt es !
Super Anleitung, etwas mitdenken und auf den Bildschirm gucken sollte man schon können.
Danke !
Ulli
Auf die Art habe ich jetzt auch ein UBUNTU-MATE zum booten von einer Festplatte gebracht.
Von der Plattform antworte ich gerade 🙂
Stand Januar/ 2018—PI3—-Stretch
Danke, am Ende hat es funktioniert.
sudo sed hat keine Funktion … root=/dev/sda2 usw. funtioniert nicht, denn es wird die PARTUUID verlangt.
Diese kann mann sich mit sudo blkid anzeigen lassen und dann in die jeweiligen Dateien eintragen. Dabei sieht man auch falsche oder keine Label für die jeweiligen Partitionen.
Mit sudo e2label /dev/sda1 boot und sudo e2label /dev/sda2 rootfs kann man das anpassen.
THX, ich bin mit einer laufenden und funktionierende Installation umgezogen!
Vielen Dank für die Anleitung! Nach dem Lesen zahlreicher Blogeinträge und vielen Fehlschlägen ist es nun auch mir gelungen meinen Pi von einer SSD booten zu lassen. Danke auch für den Kommentar, JL LaubegastJens. Genau das Problem hatte ich auch und nachdem ich die Änderungen vorgenommen habe, die du vorgeschlagen hast, ging es einwandfrei. Endlich!
Vielen Dank für die wirklich gute Anleitung! Genau danach habe ich gesucht. Ich habe meine RaspberryPi mit einer 64GB SSD von Suptronic (X850) verbunden, und sie lief auf Anhieb. Ich hatte auf der SD bereits ein installiertes System mit eigenen Programmen. Nach dem Kopieren auf die SSD hat alles nach dem Reboot sofort funktioniert. Ok das PartUUID Thema hatte ich vorausgesehen und im Vorfeld bearbeitet.
Bei mir gibt es ab „sudo rsync -ax –progras… Probleme:
———————————————
sudo rsync -ax –progress / /boot /mnt/target/
sending incremental file list
rsync: chown „/mnt/target/boot“ failed: Operation not permitted (1)
rsync: recv_generator: mkdir „/mnt/target/boot/System Volume Information“ failed: Cannot allocate memory (12)
*** Skipping any contents from this failed directory ***
rsync: recv_generator: mkdir „/mnt/target/boot/overlays“ failed: Cannot allocate memory (12)
*** Skipping any contents from this failed directory ***
boot/
….
———————————————-
UND Siehe auch noch:
———————
boot/start_db.elf
5,120,484 100% 23.14MB/s 0:00:00 (xfr#25, ir-chk=1003/1194)
boot/start_x.elf
4,057,956 100% 15.54MB/s 0:00:00 (xfr#26, ir-chk=1002/1194)
boot/System Volume Information/
rsync: mkstemp „/mnt/target/boot/.COPYING.linux.nzun3c“ failed: Cannot allocate memory (12)
rsync: mkstemp „/mnt/target/boot/.LICENCE.broadcom.UAZWKf“ failed: Cannot allocate memory (12)
rsync: mkstemp „/mnt/target/boot/.LICENSE.oracle.lTMyni“ failed: Cannot allocate memory (12)
rsync: mkstemp „/mnt/target/boot/.bcm2708-rpi-0-w.dtb.umwPWk“ failed: Cannot allocate memory (12)
rsync: mkstemp „/mnt/target/boot/.bcm2708-rpi-b-plus.dtb.F2vdtn“ failed: Cannot allocate memory (12)
—————————————
KANN DA JEMAND WEITERHELFEN????
Hallo,
ich habe es nach diesem Script probiert, und es lauft nicht, Raspberry booted nur von der SD-Karte.
Mir sind diese Zeilen suspekt
sudo sed -i „s,root=/dev/mmcblk0p2,root=/dev/sda2,“ /mnt/target/boot/cmdline.txt
Die datei cmdline.txt enthält nicht den Ausdruck
1) root=/dev/mmcblk0p2
dieser Ausdruck soll ja ersetzt werden durch
root=/dev/sda2
Wenn es den Ausdruck 1 nicht gibt, passiert nichts, wenn ich es richtig verstanden habe. Ich habe mir die Date nach der installation angesehen. Verstehe ich dort etwas nicht richtg. Habe es mehrfach versucht, mit unterschiedlichen USB-Sticks und unterschiedlicher Größe, 16, 32 Giga.
Bin für jeden Tip dankbar.
Reinhold
Eine weitere Lösung:
Die 2 letzten Zeilen (sind veraltet)
sudo sed -i „s,root=/dev/mmcblk0p2,root=/dev/sda2,“ /mnt/target/boot/cmdline.txt
sudo sed -i „s,/dev/mmcblk0p,/dev/sda,“ /mnt/target/etc/fstab
Ich habe mit blkid die PARTUUID herausgelesen und die /etc/fstab und /boot/cmdline.txt auf der SSD von Hand geändert.
Danach habe ich SD-Karte entfernt und von der SSD gebootet.(langsam)
Für den schnelleren Start habe ich die SD-Karte wieder eingeschoben und mit mount die boot-partition hinzugefügt.
Auf der SD-Karte wird die /boot/cmdline.txt, mit der /boot/cmdlinte.txt der SSD überschrieben.
Viel Spaß 🙂
Hallo zusammen,
mitlerweile reicht es mit der Raspberry Lite einmal zu starten in der der Eintrag in der config.txt eingetragen ist.
Anschließen kann das gewünsche Betriebssystem auf einen Sick installiert werden. Am besten über den Raspberry Pi Imager.
Viel Spaß
Vielen Dank für die tolle Beschreibung.
Leider bekomme ich die SSD nicht zum Fliegen. Ein Kontrollversuch mit einem USB-Stick verlief erfolgreich.
Ich habe mit folgendem Code
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
versucht die Pi3 zu einer längeren Wartezeit zu bringen, da meine Vermutung ist, dass die SSD zu langsam für den Pi3 ist und er die bootfähige SSD nicht erkennt.
Gibt es noch eine Idee oder einen Vorschlag, wie ich den Pi3 dazu bewegen kann, dass er länger auf die SSD wartet?
Habe eine Kingston A400 mit 480GB und ein UGREEN Gehäuse genommen, die auf einer Pi3 Seite empfohlen wurden.
Wäre toll wenn man mir hier weiterhelfen könnte.