USB-Festplatte am Raspberry Pi formatieren und automatisch einhängen/mounten (Text +Video)

Als Video ansehen
Bereitgestellt über YouTube

USB-Festplatte am Raspberry Pi formatieren und automatisch einhängen/mounten (Text +Video)

Wie formatiere ich eine an den Raspberry Pi angeschlossene USB-Festplatte und hänge sie automatisch ein, sodass sie zum Speichern von Daten zur Verfügung steht? Dies erfährst du im folgenden Beitrag.

Die Speicherkarte des Raspberry Pi ist nur bedingt als Speicher im Alltag geeignet: Zum einen sind Kapazität und Geschwindigkeit vergleichsweise gering, um beispielsweise eine private Cloud oder einen kleinen Dateiserver zu betreiben. Außerdem ist eine Speicherkarte nicht für das Schreiben größerer Datenmengen vorgesehen, sodass sie schneller kaputt gehen kann. Am einfachsten und günstigsten scheint es daher, einfach eine externe USB-Festplatte als Datenspeicher anzuschließen. Vor allem mit den deutlich schnelleren USB 3.0 Anschlüssen des Raspberry Pi 4 ist dies interessant.

Anschließen und Formatieren der USB-Festplatte

Vorbereitung: Festplatte ermitteln, ggf. Aushängen

Nach dem Anschluss der Festplatte solltet ihr diese in den meisten Fällen zunächst formatieren und eine neue Partition erstellen. Vor allem dann, wenn sie zuvor an einem anderen Betriebssystem wie z.B. Windows verwendet wurde. Zwar ist es prinzipiell möglich, auch solche Dateisysteme wie NTFS (Windows) einzubinden. Dies würde ich nur als Plan B empfehlen, wenn ihr eine größere Festplatte mit bereits vorhandenen Daten besitzt. Am saubersten ist es, die Festplatte zu formatieren und ein natives Linux-Dateisystem wie Ext4 zu verwenden.

Zunächst ermitteln wir mit lsblk, welche Laufwerke verfügbar sind und holen uns für die Zuordnung ein paar Informationen wie Größe, Hersteller, Modell etc.

$ sudo lsblk -e 1,7 -o NAME,FSTYPE,ROTA,SIZE,VENDOR,MODEL
NAME        FSTYPE ROTA   SIZE VENDOR   MODEL
sda                   1 465.8G HGST HTE 725050A7E630
└─sda1      ntfs      1 465.8G
mmcblk0               0  29.7G
├─mmcblk0p1 vfat      0   256M
└─mmcblk0p2 ext4      0  29.5G

Dieser Pi besitzt zwei Laufwerke: Eine 500 GB große HGST-Festplatte sda, zu erkennen an ROTA = 1. mmcblk0 ist dagegen die 30 GB große Micro-SD Speicherkarte. In dieser Ansicht sehen wir auch die Partitionen (also Bereiche) auf den Laufwerken, zu erkennen am └─ Symbol links. Die HGST-Festplatte ist per USB angeschlossen und besitzt noch eine NTFS-Partition von Windows. Bei mehreren Festplatten sollte man sich hier anhand von Größe/Modell vergewissern, welche man tatsächlich formatieren/partitionieren und damit löschen möchte. Im Zweifel die Einhängepunkte/UUID/Seriennummer zusätzlich berücksichtigen, wenn etwa zwei gleiche Festplatten angeschlossen sind und man sich nicht zu 100% sicher ist.

Falls die Platte bereits eingehangen ist, müssen wir sie zunächst aushängen. Dies lässt sich mit df -h /dev/sda* überprüfen, wobei sda der Name eurer Festplatte ist.

$ df -h /dev/sda*
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        1.7G     0  1.7G   0% /dev
/dev/sda1       466G   21G  446G   5% /media/pi/1C98FF0A98FEE166

Taucht hier ein Eintrag auf, bei dem nicht Filesystem devtmpfs steht, ist sie eingehängt. In diesem Falle hängen wir die unter Filesystem angezeigte Partition mit umount aus, hier /dev/sda1:

sudo umount /dev/sda1

Alte Partitionen von der Festplatte löschen

Zur Formatierung und Partitionierung verwenden wir das Programm parted. Es wird unter Raspberry Pi OS standardmäßig installiert. Als Parameter übergeben wir das Laufwerk. NICHT die Partition, welche durch Nummern gekennzeichnet sind! Statt /dev/sda1 soll also /dev/sda übergeben werden. Der Name ist entsprechend dem was ihr zuvor mit lsblk ausgelesen habt anzupassen, hier ist es sda.

sudo parted /dev/sda

Um auf Nummer sicher zu gehen, gebe ich zu Beginn einmal print ein. Dies zeigt die Laufwerksinformationen inklusive der darauf vorhandenen Partitionen

GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: HGST HTE 725050A7E630 (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End    Size   Type     File system  Flags
 1      1049kB  500GB  500GB  primary  ntfs         boot

Hier ist es die richtige HGST-Festplatte. Da sie bereits eine NTFS-Partition enthält, löschen wir diese zunächst. Sollte keine Partition vorhanden sein, ist dieser Schritt nicht notwendig.

ACHTUNG: Ab hier wird es destruktiv! Ihr solltet die folgenden Schritte nur ausführen, wenn sich auf der jeweiligen Festplatte keine wichtigen Daten befinden. Andernfalls legt unbedingt vorher eine Sicherung auf ein anderes Medium an!

Zum Entfernen geben wir rm gefolgt von der Nummer der Partition, die wir mit print ermittelt haben, ein:

rm 1

Erscheint danach keine Ausgabe, können wir fortfahren. Sollten in der Liste von print weitere Partitionen (z.B. mit der Nummer 2, 3 etc) aufgelistet sein, muss dieser Schritt für alle wiederholt werden – also beispielsweise rm 2.

Partition anlegen

Auf unserer leeren Festplatte sollten wir nun eine neue Partitionstabelle anlegen. Gerade weil die Festplatte von Windows stammt, nutzt sie noch eine MS-DOS Partitionstabelle. Die Aufforderung mit y für Yes bestätigen:

(parted) mklabel gpt
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? y

Auf unserer leeren Festplatte können wir nun eine neue Partition anlegen:

mkpart primary ext4 1MB 500GB

Was passiert hier? Es wird eine primäre Partition mit dem Dateisystem ext4 angelegt. Dies ist beim Raspberry Pi das Standard-Dateisystem. Gibt es keinen speziellen Grund ein anderes zu wählen, würde ich dies empfehlen. Danach folgt die Startposition, mit 1MB fügen wir die Partition an den Anfang an, lassen aus technischen Gründen zu Beginn aber noch ein klein wenig Speicher frei. Zu guter letzt das Ende, womit sich die Größe bestimmen lässt. Hier haben wir also eine 500 GB große Partition erstellt, die sich über die gesamte Größe erstreckt. Je nach Vorhaben kann man auch mehrere Partitionen anlegen. Gerade für Anfänger dürfte eine einzige Partition einfacher in der Handhabung sein.

Zum Abschluss geben wir quit ein und bestätigen mit <Enter>, um gparted zu verlassen.

Dateisystem erzeugen

Nach dem Eintrag in der Partitionstabelle müssen wir noch das gewünschte Dateisystem erzeugen. Dies geschieht mit dem Befehl mkfs.ext4, wobei ext4 der Name des gewünschten Dateisystems ist.

$ sudo mkfs.ext4 /dev/sda1

Die Warnmeldung zum alten NTFS-Dateisystem mit y bestätigen.

Hinweis: Nach dem Anlegen eines Ext4-Dateisystemes müssten die Inode-Tabellen erzeugt werden. Dies läuft standardmäßig im Hintergrund und kann – je nach Kapazität – für einige Zeit eine Auslastung verursachen.
Weitere Informationen und wie du dies umgehen kannst, findest du in diesem Beitrag.

Bei der Creating journal Angabe kann der Standardwert mit <Enter> übernommen werden.

mke2fs 1.44.5 (15-Dec-2018)
/dev/sda1 contains a ntfs file system
Proceed anyway? (y,N) y
Creating filesystem with 122096384 4k blocks and 30531584 inodes
Filesystem UUID: -a-b-c-d
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks):
done
Writing superblocks and filesystem accounting information: done

Damit ist unsere Festplatte mit einer frischen Partition bestückt, wie sich z.B. mit lsblk verifizieren lässt – hier sehen wir nun eine Ext4 statt NTFS-Partition:

sudo lsblk -e 1,7 -o NAME,FSTYPE,FSUSED,ROTA,SIZE,VENDOR,MODEL
NAME        FSTYPE FSUSED ROTA   SIZE VENDOR   MODEL
sda                          1 465.8G HGST HTE 725050A7E630
└─sda1      ext4             1 465.8G
...

Automatisches einhängen der Partition über /etc/fstab

Erst einmal überlegen wir uns, wo die Festplatte gemountet werden soll. Für einen speziellen Anwendungszweck macht es ggf. Sinn, die Platte in einem bestimmten Pfad zu mounten – wo andere Anwendungen ihre Daten abspeichern. Ein Beispiel: Wer viel mit Docker arbeitet und eine SSD anschließt, könnte diese unter /var/lib/docker mounten. Dadurch legt Docker sämtliche Daten automatisch auf die SSD ab, statt auf der Speicherkarte. Spielt dies keine Rolle, kann der Pfad frei gewählt werden. Im einfachsten Falle direkt im Wurzelverzeichnis / wie z.B. /hdd.

Unabhängig davon wie euer Einhängepfad aussieht, muss dieser existieren und daher erstellt werden:

sudo mkdir /hdd

Wir könnten die Partition nun einfach mit sudo mount /dev/sda1 /hdd einhängen. Allerdings ist sie damit nur bis zum nächsten Neustart gemountet. Dies ist für Festplatten sinnvoll, die nur temporär benötigt werden, etwa für Datensicherungen. Soll sie jedoch permanent betrieben werden, etwa als Datenspeicher für installierte Anwendungen, bietet sich das automatische Einhängen über die Datei /etc/fstab an.

Darin können wir theoretisch mit den Standard-Gerätepfaden zur Partition wie /dev/sda1 arbeiten. Aus Erfahrung rate ich davon jedoch ab: Sie sind nicht an das jeweilige Gerät gebunden! So lange du nur eine Festplatte/SSD besitzt, ist dies unproblematisch – die wird immer in /dev/sda gemountet. Kommen jedoch weitere hinzu, kann es passieren, dass sich dies unter Umständen tauscht. Auch wenn dies eher selten ist, würde ich dem vorbeugen – denn es gibt Alternativen.

Eine Möglichkeit ist die UUID des Dateisystems, sie ist einzigartig – allerdings absolut nicht sprechend. Besser finde ich /dev/disk/by-id/ da hier verschiedene sprechende Parameter wie die Anschlussart (USB), Hersteller (HGST) und Modell genutzt werden:

$ ls -lh /dev/disk/by-id/ | grep sda1
lrwxrwxrwx 1 root root 10 Aug  9 16:11 usb-HGST_HTE_725050A7E630_00A12345678D-0:0-part1 -> ../../sda1

Diesen Link (hier f34e3621-c270-4b43-a405-ada4365734fd) kopieren wir uns und öffnen die Datei /etc/fstab mit Root-Rechten im Texteditor deiner Wahl – ich nutze vim, alternativ kannst du auch den für Einsteiger einfacheren nano verwenden.

sudo vim /etc/fstab

Darin erzeugen wir eine neue Zeile:

/dev/disk/by-id/usb-HGST_HTE_725050A7E630_00A12345678D-0:0-part1 /hdd ext4 defaults 0 2
  1. /dev/disk/by-id/usb-HGST_HTE_725050A7E630_00A12345678D-0:0-part1
    Das erste Argument ist der Pfad zu unserer Partition. Wie bereits erwähnt, könnten wir theoretisch hier auch /dev/sda1 benutzen – aus Sicherheitsgründen empfehle ich /dev/disk/by-id, da wir mit der Kombination aus Anschluss, Hersteller, Modell und Seriennummer einen einzigartigen Bezeichner erhalten, der sich nicht ändern wird.
  2. /hdd
    Es folgt der Einhängepunkt, an dem die Partition zur Verfügung gestellt werden soll.
  3. ext4
    Das Dateisystem. Falls ihr nicht ext4 verwendet habt, muss dies entsprechend angepasst werden.
  4. default
    Spezielle Optionen zum Mounten (Beim mount Befehl mit dem Schalter -o übergeben) können hier angegeben werden, falls nötig. Im Regelfall reicht es, hier default Einzutragen. Dies setzt die Flags rw,suid,dev,exec,auto,nouser,async.
  5. 0
    Gibt an, ob die Partition in der Sicherung des Backup-Programmes dump mit eingeschlossen (1) ist oder nicht (0). Je nachdem wie ihr eure Daten sichert, ist dies zu überlegen. Ich habe es deaktiviert, da ich statt dump ein anderes Programm zur Sicherung nutze.
  6. 2
    Der letzte Parameter ist für die regelmäßig und automatisch vom Betriebssystem durchgeführte Dateisystemprüfung vorgesehen: 0 deaktiviert sie, was z.B. für Windows-Dateisysteme wie NTFS sinn macht. 1 prüft die Partition während des Bootens, was ich nur für die Root-Partition aktivieren würde. 2 führt die Überprüfung nach dem Start durch.

Damit die Änderungen wirksam werden, ist kein Neustart notwendig. Man kann die Datei mit sudo mount -a neu einlesen. Dies würde ich sogar bevorzugen, da eventuell vorhandene Fehler nicht den Bootprozess behindern. Nun sollte uns die externe Festplatte im Einhängepunkt /hdd zur Verfügung stehen:

$ df -h /hdd
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       458G   73M  435G   1% /hdd

Berechtigungen für Schreibzugriffe ohne root aktivieren

Der gesamte Ordner /hdd gehört allerdings root. Versuchen wir mit einem nicht privilegierten Nutzer dort zu schreiben, erscheint dementsprechend eine Fehlermeldung:

$ touch /hdd/test
touch: cannot touch '/hdd/test': Permission denied

Aus Sicherheitsgründen sollten wir den root-Benutzer nur sparsam dort verwenden, wo es zwingend nötig ist – also eben nicht jedem Befehl oder gar Programm, dass auf diese Platte schreiben soll, mit sudo auszuführen. Es macht daher Sinn, den Eigentümer zu ändern.

sudo chown pi:pi /hdd -R

Benutzer und Gruppe pi (Standardbenutzer vom Raspberry Pi) sind damit Eigentümer von /hdd inklusive aller Unterordner. Abhängig davon was ihr mit dem Pi machen möchtet, sollte dies ggf. angepasst werden – eventuell mit Berechtigung mehrerer Benutzer. Dies kann man bei Bedarf mit FACL (File Access Control List) umsetzen.

Leave a Reply