RasPi: USB-Speichermedium ins System integrieren

Der Blog ist aus Performancegründen umgezogen nach: http://greplacement.fherb.de (Link zu diesem Artikel)
Dieser Artikel wird hier nicht mehr aktualisiert.

 

Eine Anleitung; Prinzipiell auch für andere Plattformen anwendbar

Gewünschtest Ziel:

  • Nutz-Daten und z.B. Logfiles auf die USB-Festplatte (oder Stick)
  • Betriebssystem auf der SD-Karte lassen
  • Speicherplatz des USB-Speichermediums in der Systemstruktur an mehreren Stellen einblenden (die logische Struktur der root-Partition soll erhalten bleiben)

Insbesondere bei Systemen, deren Betriebssystem auf SD-Karte ist und auf dem regelmäßig, z.B. über einen cron-job, apt-get update/upgrade läuft, wird neben dem Ordner für die Logfiles /var/log/ auch der Ordner /var/cache/… und /var/lib/… strapaziert.

Die SD-Karte als Root-Laufwerk möchte ich „behalten“ und das Root-Verzeichnis nicht auf das USB-Speichermedium verschieben, damit ich für Tests, z.B. Neuinstallation eines Dienstes einfach eine andere SD-Karte vorbereiten kann (Ausgehend von einer Kopie der bisherigen SD-Karte) und ich bis zur vollständigen Fertigstellung der Arbeit in der Zwischenzeit immer noch mit dem bisherigen System meinen Server laufen lassen kann. Das entspannt, da ein neuer oder geänderter Dienst nicht noch am gleichen Tag voll lauffähig sein muss. Einfach bisherige SD-Karte zurückstecken und das System arbeitet im alten Zustand, bis ich mal wieder Zeit habe, den neuen Dienst vollständig zum Laufen zu bringen.

Das USB-Speichermedium soll also folgendermaßen eingebunden werden:

  • Eine einzige Partition auf dem USB-Speichermedium wird vollständig unter der Wurzel als „volume1“ gemountet.
  • In dieser Partition werden verschiedene Ordner zum Bsp. für die Logs, Home-Verzeichnisse u.a. angelegt und diese dann einzeln in die Ordnerstruktur des Systems gemountet.

Auf diese Weise entkoppelt man das physische Speichermedium Festplatte/Stick von der logischen Struktur der Daten bzw. Ordner. Die für Linux typische Ordnerstruktur auf der Systempartition bleibt erhalten. Es kann im Einzelfall und jederzeit immer wieder neu entschieden werden, welcher Ordner aus dem System auf das USB-Speichermedium verlagert werden.

Das hat außerdem den Vorteil, dass man so später auch noch ein weiteres USB-Speichermedium einbinden kann, ohne dass sich die logische Struktur aller Daten im Verzeichnis ändert.

Für die folgende Beschreibung gehe ich von einem Image aus, dass entsprechend RasPi: Debian installieren auf dem RasPi eingerichtet wurde.

Vorbereitung

Die Stromversorgung des RasPi reicht nicht aus, auch eine Festplatte zu betreiben. Deshalb ist die Festplatte entweder mit einem Adapter (oder Gehäuse) zu betreiben, dass über eine eigene Stromversorgung verfügt, oder zumindest ein USB-Hub mit eigenem Netzteil zwischen zu schalten.

Da der RasPi über keine SATA-Schnittstelle verfügt und die USB-Schnittstelle der Version 2.0 entspricht, kann man getrost eine langsame Festplatte verwenden. Bei Dauerbetrieb steht eher die Frage, wie groß die Leistungsaufnahme ist.

Auch bei einem Stick kann die Stromversorgung knapp werden. Zumindest sollte man den Stick vor dem Zuführen der Stromversorgung schon stecken haben.

Erster Schritt nach Anschluss des USB-Speichermediums: Wir sehen uns die Laufwerke an, die das System erkennt:

fdisk -l

Erklärung einiger Ausgaben des Systems:

Disk /dev/mmcblk0

ist das „Gerät“ SD-Karte. Die darauf befindlichen Partitionen werden so angezeigt:

/dev/mmcblk0p1 ...
/dev/mmcblk0p2 ...

sind die zwei Partitionen auf der SD-Karte, die uns das Image erzeugt hat.

Spätestens durch die Größenangabe, fällt uns die Festplatte oder der Stick ins Auge:

Disk /dev/sda: 80.0 GB, ...

Sind darauf (noch) Partitionen vorhanden, werden die genau wie bei der SD-Karte mit einer fortlaufenden Zahl hinter dem Gerät angezeigt:

/dev/sda1   ...
/dev/sda2   ...

Partitionieren

Ich gehe hier davon aus, dass wir das Medium mit einer einzigen Partition über den vollen Speicherbereich ausschließlich unter Linux betreiben wollen. (Eine weitere Swap-Partition wäre eine Alternative. Aktuell arbeitet der RasPi mit einem Swapfile unter /var .) Ich gehe von meinem Beispiel aus und rufe deshalb fdisk mit dem angezeigten USB-Speichermedium sda auf:

fdisk /dev/sda

Wie man sieht, verfügt fdisk über eine eigene primitive Benutzerschnittstelle. Mit m (manual) erreichen wir jederzeit „help“. Die einzelnen Schritte werden nicht sofort ausgeführt, sondern nur vorbereitet. Erst wenn man fdisk mit w verlässt, wird die neue Partitionstabelle geschrieben.

Zur Sicherheit zeigen wir uns noch einmal die Partitionen an:

Command (m for help): p

In meinem Falle also sda1 und sda2. Um eine neue, große Partition anzulegen, werden diese Partitionen zuerst mit d gelöscht:

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

Command (m for help): d
Selected partition 2

Ein erneutes

Command (m for help): p

Zeigt uns, dass die Partitionstabelle nun leer ist.

Mit dem Commando n erzeugen wir nun eine neue Partition:

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-156301487, default 2048): (nur ENTER drücken)
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-156301487, default 156301487): (nur ENTER drücken)
Using default value 156301487

Fett dargestellt sind meine Eingaben. Da wir eine Partition über den gesamten Speicherbereich anlegen, können mittels ENTER die meisten Angaben ohne Änderung übernommen werden.

Mit

Command (m for help): w

Lassen wir nun die neue Partitionstabelle schreiben und beenden fdisk. Das wird mit einem kurzen Kommentar vom System quittiert:

The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Gesamtes Speichermedium einbinden

Für das Ziel, den Speicherplatz auf dem Laufwerk an mehreren Stellen ins System einzubinden, müssen wir uns auf dem Medium eine Ordnerstruktur erstellen, die wir dann automatisch per fstab beim Systemstart an verschiedenen Stellen in der Ordnerhierarchie einbinden lassen. Doch um das überhaupt vorbereiten zu können, müssen wir das USB-Speichermedium zuerst als Ganzes einbinden (mounten).

Die gesamte Einbindung soll mittels der Datei fstab vom System beim Hochfahren automatisch erledigt werden.

Zuerst das USB-Speichermedium als Ganzes unter /volume1 einbinden

Zuerst richten wir den Ordner direkt unter der Wurzel ein, in den wir die Partition als ganzes einbinden wollen.

mkdir /volume1

Es ist sinnvoll, beim mounten die eindeutige UUID der Partition des Mediums zu verwenden, damit später keine Zuweisungsschwierigkeiten auftreten, wenn wir weitere Speichermedien an die USB-Schnittstelle anschließen.

Die UUID der Partition fragen wir ab mit:

blkid

Das Ergebnis bei meinem System ist

/dev/mmcblk0p1: SEC_TYPE="msdos" LABEL="boot" UUID="993B-8922" TYPE="vfat"

/dev/mmcblk0p2: UUID="fc254b57-8fff-4f96-9609-ea202d871acf" TYPE="ext4"

/dev/sda1: UUID="86698836-f6aa-4291-979c-edb2278711eb" TYPE="ext3"

/dev/mmcblk… ist die SD-Karte. Haben wir nun keine weiteren Speichemedien angeschlossen ist klar, dass die Partition des USB-Speichermediums im Moment mit /dev/sda1 eingebunden ist. Die gewünschte UUID und den Dateisystemtyp können wir unmittelbar danach ablesen.

Ich möchte jedoch ext4 als Dateisystem verwenden. Deshalb formatiere ich diese Partition als erstes mit ext4:

mkfs.ext4 /dev/sda1

Jetzt nochmals blkid aufrufen! Es sollte eine neue ID vergeben worden sein:

/dev/mmcblk0p1: SEC_TYPE="msdos" LABEL="boot" UUID="993B-8922" TYPE="vfat"
/dev/mmcblk0p2: UUID="fc254b57-8fff-4f96-9609-ea202d871acf" TYPE="ext4"
/dev/sda1: UUID="30a1202c-38f3-4d1c-844a-30e629f46d60" TYPE="ext4"

Jetzt kann der notwendige Eintrag in die fstab erfolgen. Zum Editieren öffnen:

nano /etc/fstab

Folgende Zeile hängen wir nun an:

UUID=30a1202c-38f3-4d1c-844a-30e629f46d60 /volume1 ext4 defaults,nofail 0 2

Auch wenn es hier anders dargestellt wird: Das ist unbedingt als eine Zeile einzufügen. Tab oder Leerzeichen können als Trennzeichen verwendet werden.

nofail ist sehr sinnvoll, falls einmal ohne Medium gebootet wird oder das Medium defekt ist. In dem Fall bootet das System trotzdem vollständig. Betreiben wir das Syste „headless“, also ohne Bildschirm und Tastatur, könnten wir per Terminal nicht mehr drauf zugreifen, falls das System deshalb stecken bleibt.

Wir müssen jetzt nicht neu booten. Um den Eintrag zu testen, lassen wir fstab einfach erneut abarbeiten:

mount -a

Kommt keine Fehlermeldung, testen wir mal, ob wir den Ordner anzeigen können:

ls -a /volume1

führt zur Ausgabe

.  ..  lost+found

Bestens!

Einzelne Ordner anlegen und in die Systemhierarchie einbinden

Welche Ordner man mit dem Platz auf dem Medium ersetzen will, sollte jeder selbst und für seine Nutzung einschätzen. Welche Ordner überhaupt in einem Linux-System typisch sind und für was sie da sind, findet man z.B.

Ich möchte 2 Dinge erreichen:

  • Ordner mit größeren Datenmengen und
  • Systemordner, in die häufig geschrieben wird

auf das USB-Speichermedium legen. Neben der Frage des Speicherplatzes vor allem auch, damit die SD-Karte nicht beizeiten kaputt-geschrieben wird.

Zu beachten ist, dass der Inhalt dieser Ordner erst während des laufenden Bootvorgangs gemountet wird. Ordner, die das System vorher benötigt, dürfen nicht mit auf das USB-Speichermedium.

Deshalb entscheide ich mich, folgende Ordner auf das USB-Speichermedium zu schieben:

  • /home
  • /tmp
  • /var
  • /opt

Damit wir beim jetzt stattfinden Datentransfer und der Vorbereitung des Mounting in der fstab keinen zwischenzeitlichen Zustand erreichen, wo Bereich des Systems nicht erreichbar sind, gehe ich Schritt für Schritt in folgender Reihenfolge vor:

  • Kopieren der Daten auf das USB-Speichermedium
  • Eintrag in der fstab anlegen
  • mount -a hängt nun den eben kopierten Inhalt, der sich aber nun auf dem externen Medium befindet, wieder in den Ordner, wo das System ihn erwartet.
  • Testen, ob noch alles funktioniert!
  • Wenn alles bis hier erfolgreich, Orginaldateien löschen. Eine Möglichkeit:
    • In fstab die Mountings der Ordner noch mal deaktivieren (auskommentieren)
    • reboot
    • Löschen der Daten im Ordner des Systems
    • In fstab die Mountings der Ordner wieder aktivieren
    • mount -a

Man kann die Dateien auch in den Originalverzeichnissen auf der SD-Karte stehen lassen. Wenn mount erfolgreich ist, wird der bisherige Inhalt ausgeblendet. Bootet man aber ohne USB-Speichermedium, tauchen die alten Ordner und Files wieder auf. Ohne, dass wir es merken arbeiten wir womöglich längere Zeit mit einem inkonsistenten System. Und schalten wir das USB-Speichermedium wieder zu, liegen dort dann ältere Daten.

Löschen wir jedoch die Inhalte der ursprünglichen Ordner auf der SD-Karte, ist zu erwarten, dass wir bei fehlendem USB-Speichermedium den Fehler sofort bemerken, wenn eine Applikationen auf den Bereich zugreift.

Los geht’s mit Kopieren. Zu beachten ist, dass wir die Originalen Rechteeinstellungen der Quellordner unbedingt mitkopieren! Option p kopiert dies mit.

cp -pR /home /volume1/
cp -pR /tmp /volume1/
cp -pR /var /volume1/
cp -pR /opt /volume1/

Eintrag in fstab:

nano /etc/fstab

Neue Zeilen:

/volume1/home  /home  none  bind,nofail  0  0
/volume1/tmp  /tmp  none  bind,nofail  0  0
/volume1/var  /var  none  bind,nofail  0  0
/volume1/opt  /opt  none  bind,nofail  0  0

Dass wir kein Geräte bzw. keine Partition, sondern einen Ordner einhängen, wird durch die Option bind deklariert.

Jetzt prüfen, ob es funktioniert hat:

mount -a

Mit

mount

müssen wir jetzt unsere eingehängten Ordner sehen:

/dev/sda1 on /home type ext4 (rw,relatime,data=ordered,_netdev)
/dev/sda1 on /tmp type ext4 (rw,relatime,data=ordered,_netdev)
/dev/sda1 on /var type ext4 (rw,relatime,data=ordered,_netdev)
/dev/sda1 on /opt type ext4 (rw,relatime,data=ordered,_netdev)

Ist das der Fall, können wir davon ausgehen, dass wir in den betreffenden Ordnern nicht mehr die Originalinhalte sehen, sondern die Inhalte, die sich auf dem USB-Speichermedium befinden.

Jetzt sollte man mal testen, ob eventuell installierte Software bzw. Dienste anstandslos funktionieren.

Wenn alles gut läuft, kann man nun die Orginalfiles von der SD-Karte entfernen.

Es gibt auch eine elegante Methode, diesen Vorgang ohne Reboot auszuführen (mittels umount). Siehe dazu ganz unten das Löschen des Inhaltes von /var.

Dazu vorerst die Einträge in fstab mit # auskommentieren:

nano /etc/fstab
#/volume1/home  /home  none  bind,nofail  0  0
#/volume1/tmp  /tmp  none  bind,nofail  0  0
#/volume1/var  /var  none  bind,nofail  0  0
#/volume1/opt  /opt  none  bind,nofail  0  0

Das USB-Speichermedium darf dabei eingehängt bleiben. Jetzt neu booten.

reboot

Mit

mount

wieder prüfen, dass die Ordner jetzt NICHT gemountet sind!

Bei dem Ordner /var liegt u.a. bei RasPi das in Verwendung befindliche Swapfile. Damit wir das entfernen dürfen, müssen wir das Swappen vorübergehend abschalten.

Wer unsicher ist, ob das Swap abgeschaltet werden muss: Einfach rm -R /var/* machen und wenn eine Fehlermeldung zu swap kommt, dann abschalten und nochmals rm… ausführen.

swapoff -a

Jetzt die Orgininalinhalte (nicht die Ordner selbst!) löschen:

rm -R /home/*
rm -R /tmp/*
rm -R /var/*
rm -R /opt/*

Bei /tmp/ kann eine Fehlermeldung kommen, weil da gewöhnlich nach dem Reboot keine Files enthalten sind.

Jetzt in fstab die Zeilen wieder aktivieren

nano /etc/fstab
/volume1/home  /home  none  bind,nofail  0  0
/volume1/tmp  /tmp  none  bind,nofail  0  0
/volume1/var  /var  none  bind,nofail  0  0
/volume1/opt  /opt  none  bind,nofail  0  0

Und wieder mounten:

mount -a

Ob das Mounting erfolgreich war, können wir nochmals mit dem Befehl

mount

prüfen. Was angezeigt werden muss: s. oben

Und wenn oben abgeschaltet: Das Swappen wieder einschalten:

swapon -a

Damit die Dienste, die sich im Hintergrund vielleicht durch das zwischenzeitliche Fehlen der Ordnerinhalte „festgeklemmt“ haben könnten (gut programmiert, tun sie das natürlich nicht), kann man zur Sicherheit an dieser Stelle noch einmal booten.

Abschluss

Zum Abschluss testen wir, ob das System (im Notfall) trotzdem, auch ohne USB-Speichermedium bootet.

Da alle Einträge in fstab die Option nofail bekommen haben, klappt das bei mir prima. In dem Fall wird übrigens in /var auf der SD-Karte wieder ein Swapfile angelegt. Stört nicht, verbraucht aber Platz.

Schließe ich das USB-Speichermedium im laufenden Betrieb wieder an, kann ich sie (mit root-Rechten) mittels

mount -a

wieder vollständig ins System einbinden.

Das zwischenzeitlich neu angelegte Swapfile lösche ich ohne Reboot auf diese Weise:

umount /var
swapoff -a
rm -R /var/*
mount -a
swapon -a

Dass ich das nicht so konfiguriere, dass in dem Fall das USB-Speichermedium sofort automatisch eingebunden wird, ist Absicht. Dadurch kann ich mit dieser Methode beim Booten ohne Medium klar definierte Wartungsbedingungen herstellen, die sich nicht ändern, wenn ich das USB-Speichermedium zuschalte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.