Root-Filesystem auf USB-Datenträger umstellen
http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_Laufwerke.html
Überblick
Angesichts der heutigen Größen von USB-Stick oder externen Festplatten ist es sinnvoll, das Root-Filesystem auf einen USB-Datenträger auszulagern. Die SD-Karte wird dann nur noch zum Booten lesend angesprochen. Da reicht dann auch die kleinste Größe, weil nur noch die Boot-Partition (Typ vfat) benötigt wird.
ACHTUNG: falls man einen bereits in Betrieb befindlichen Datenträger umbaut, ist es wichtig, diesen zuvor in der Datei /etc/fstab mit "#" auszukommentieren, da sonst der Raspberry Pi nicht mehr fehlerlos bootet. Man kann dann nur mehr im Konsolmodus reparieren. Weiters ist es wahrscheinlich sinnvoll, eventuelle cronjobs vorübergehend stillzulegen.
sudo service mysql stop sudo /etc/init.d/apache2 stop
Im konkreten Fall wird ein Intenso 32GB USB-Stick verwendet, der besonders klein ist.
Folgende Schritte sind dabei auszuführen:
- Sicherung der SD-Karte (SD-Karte formatieren und sichern)
- Sicherung der bisherigen Daten auf dem USB-Stick (falls bereits verwendet -> Copy unter Windows)
- Vorbereitung des USB-Sticks (partitionieren und formatieren)
- Einbinden der Partitionen ins System (/etc/fstab)
- Kopieren der Systempartition
- Änderung der Konfigurationsdateien (MySQL, Samba) - Samba installieren
Vorbereitung des USB-Sticks
Falls der Stick nicht unter Windows angesprochen werden soll, ist es sinnvoll diesen als ext4 zu formatieren. Die Daten sind dann über Samba, in einer Virtuellen Linux-Maschine oder über Filetransfer (scp) erreichbar.
Hier werden zwei Partitionen verwendet. Eine 4 GB-Partition für das System (das ist bei weitem ausreichend) und der Rest für Daten. Die Partitionierung und Formatierung kann man am Einfachsten mit GParted in der Virtuellen Maschine vornehmen.
Die Systempartition muss zwingend mit ext4 formatiert werden und das Label rootfs erhalten. Die Datenpartition heißt data.
Einbinden der Partitionen ins System
Um die neuen Partitionen dauerhaft ins System einzubinden, werden sie in /etc/fstab eingetragen. Mit sudo blkid werden die dazu notwendigen Informationen angezeigt. Es empfiehlt sich, ein weiteres Terminalfenster zu öffnen. Die Systempartition wird zuerst temporär gemountet mit
$ sudo mount /dev/sda1 /mnt
Die Datenpartition kann bereits in die fstab als /media/usbhdd eingetragen werden. Das Ergebnis sieht dann so aus:
proc /proc proc defaults 0 0 PARTUUID=1fc1d6b9-01 /boot vfat defaults 0 2 PARTUUID=1fc1d6b9-02 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that UUID=408a8c1c-0e37-46de-8914-3b093e7cca0c /media/usbhdd ext4 defaults,user,rw,noatime 0 0
"noatime": Linux speichert standardmäßig die letzte Zugriffszeit einer Datei (atime). Wenn diese Information nicht gebraucht oder nicht gewünscht wird, können Partitionen mit der o. g. Option gemountet werden. Die Speichermedien werden dadurch weniger belastet (weniger Schreiboperationen), was sich zudem in einem kleinen Performance-Schub bemerkbar macht.
Hinweis: In der Regel ist der Zugriff auf die neue Platte nur für den Superuser möglich. Sollen alle User in den Genuss der USB-Disk kommen, könnte man es auch so machen wie beim Verzeichnis /tmp. Hier dürfen alle lesen und schreiben. Damit aber nicht ein User die Dateien eines anderen löschen kann, wird noch das "sticky"-Bit gesetzt (das gilt, wie gesagt, nur für eine zusätzliche Datenpartition!):
chmod 1777 /media/ubshdd
Für den vollständigen Zugriff unter Windows (Samba) muss man für einzelne Verzeichnisse die Berechtigung allerdings öffnen.
chmod 777 /media/usbhdd/2017
Kopieren der Systempartition
Für das Kopieren der root-Partition gibt es mehrere Möglichkeiten (dd, tar). Hier wird rsync verwendet. Das funktioniert relativ schnell und kopiert das laufende System. Es sollten während dieser Zeit natürlich keine verarbeitenden Prozesse laufen. Die Dateien werden dabei in die temporär gemountete Systempartition kopiert.
$ sudo rsync -axv / /mnt
Ist rsync nicht installiert:
sudo apt-get update sudo apt-get install rsync
Das war's. Es ist naheliegend, diese Methode später auch zum Sichern der root-Partition zu verwenden.
Änderung Konfigurationsdateien
Als letzten Schritt muss der Raspberry Pi so konfiguriert werden, dass er nicht mehr von der SD-Karte sondern vom USB-Datenträger bootet. Dazu wird zuerst die Datei /boot/cmdline.txt bearbeitet. Da es sich um eine doch recht wichtige und kritische Systemdatei handelt, ist zuerst ein Backup eine gute Idee.
sudo cp /boot/cmdline.txt /boot/cmdline.orig
In dieser Datei wird die bisherige Bootpartition /dev/mmcblk0p2 durch die neue Partition /dev/sda1 ersetzt. Zur Sicherheit wird noch ein weiterer Befehl angehängt, falls der Datenträger nicht sofort bereit ist. Die geänderte Datei sieht dann wie folgt aus (eine Zeile!):
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 ↵ console=tty1 root=/dev/sda1 rootfstype=ext4 ↵ elevator=deadline rootwait rootdelay=3
Schussendlich muss der USB-Datenträger auch noch in der Datei /etc/fstab als Root-Filesystem eingebunden werden (der alte Eintrag wurde mit "#" auskommentiert). Achtung: NICHT die Datei /etc/fstab auf der SD-Karte, sondern die auf dem USB-Datenträger!
proc /proc proc defaults 0 0 PARTUUID=1fc1d6b9-01 /boot vfat defaults 0 2 /dev/sda1 / ext4 defaults,noatime 0 1 #PARTUUID=1fc1d6b9-02 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that UUID=408a8c1c-0e37-46de-8914-3b093e7cca0c /media/usbhdd ext4 defaults,user,rw,noatime 0 0
Ein Reboot sollte nun funktionieren. Damit auch die Applikationen laufen, sind allenfalls auch dort Änderungen erforderlich (Webserver, MySQL, Samba, ...). Das bezieht sich allerdings nur für den Fall, dass root- und Datenpartition getrennt werden!
Schlussbemerkung
Mit der Root-Partition auf einen USB-Datenträger ergeben sich etliche Vorteile:
- Ein USB-Stick verträgt wesentlich mehr Schreib-/Lesezyklen als eine SD-Karte und eine USB-Platte sowieso.
- Schreiben und Lesen geht bei USB auch flotter, denn die SD-Karte wird über ein relativ einfaches serielles Protokoll angesprochen.
- Die SD-Karte benötigt nur noch die Boot-Partition, die vom Typ vfat ist und daher auch unter Windows angesprochen werden kann. Um wieder komplett von SD-Karte zu booten, muss man nur die Datei /boot/cmdline.txt auf der SD-Karte wieder in den Originalzustand versetzen.
- Von der Root-Partition auf dem USB-Datenträger kann recht einfach ein Backup gezogen werden, indem man den USB-Datenträger mit dem Linux-PC verbindet. Dann kann mittels dd, rsync, tar, etc. auf die gleiche Weise wie oben geschildert der Inhalt des USB-Datenträgers gesichert werden.
Kopieren einer Systempartition
Mit rsync kann auch eine Systempartition kopiert werden (Sicherung, Erzeugen einer Testpartition etc.) Angenommen wird, dass der Vorgang auf einer Linux-Maschine (Virtuelle Maschine) durchgefüht wird. Die Einhängepunkte können variieren. Formatierung und Label siehe oben.
sudo rsync -axv /media/gl/rootfs/ /media/gl/rootfs1/
Entscheidend sind die "/" am Ende der Quell- und Zielangabe!