Vorbereitung der Speicherkarte¶
Wie bei den meisten Linux Distributionen ist es sinnvoll, den Speicher in Partitionen aufzuteilen. So ist es in jedem Fall sinnvoll, eine spezielle Boot-Partition anzulegen und wenn man persönliche Daten über eine komplette Neuinstallation hinweg mitnehmen möchte, lagert man das Home-Verzeichnis aus dem Root Dateisystem aus.
Mount-Point |
Type |
Dateisystem |
bei 2GB SD |
bei 16GB SD |
---|---|---|---|---|
/boot |
Bios boot |
fat32 (vfat) |
100 MB |
100 MB |
/ |
Linux Filesystem |
ext4 |
700 MB |
3GB |
/home |
Linux Filesystem |
ext4 |
all the rest |
all the rest |
Zuerst gilt es also die Speicherkarte einzustecken und herauszufinden, welchen Gerätenamen sie hat, z.B. sdc
# List block devices
lsblk
In der Ausgabe von lsblk kann zugleich überprüft werden, ob das Device bereits gemountet ist. Ist bei einer Partition ein Mountpoint angegeben, muss dieser Mountpoint ausgebunden werden. Häufige Ursache dafür sind die komfortablen automatischen Mount Funktionen der jeweiligen Distribution.
Ubuntu verwendet hierfür das Gnome Virtual File System und mountet das Gerät mit Benutzerrechten mit Hilfe von gvfs-mount
. Der richtige weg um es wieder auszubinden wäre deshalb
# unmount on distros using gvfs
gvfs-mount -u [mountpoint]
Grundsätzlich gilt, eine Partition kann immer mit den selben Rechten entfernt werden, mit der sie eingebunden wurde. Bei manchen Distributionen mag es auch ausreichen, den normalen umount Befehl mit Benuterrechten auszuführen.
umount [mountpoint]
Theoretisch kann eine Partition auch mehrfach gemountet sein und evtl. wird nur ein Mountpoint angezeigt. Funktioniert keiner der beiden oben genannten Möglichkeiten, kann man mit Root-Rechten die Partition an jedem Mountpoint ausbinden, indem man stattdessen direkt die Partition angibt.
sudo umount /dev/sdxX
Häufig ist der Dateimanager auch so konfiguriert, dass er beim einstecken eines Massenspeichers jedes Mal direkt nach dem automatischen mounten den Inhalt im Dateimanger öffnet. Für nautilus
kann man dieses Verhalten wie folgt abstellen.
$ gsettings set org.gnome.desktop.media-handling automount-open false
Partitionierung¶
Wir empfehlen eine SD-Karte mit mindestens 2GB zu verwenden. Für die Partitionierung kann man z.B. fdisk
, cfdisk
oder cgdisk
verwenden.
sudo cfdisk -z /dev/sdX
-z: create a new partition table, choose gpt
Ansonsten sollte die graphische Ausgabe im Terminal selbsterklärend sein. Die Partitionsgröße angeben und danach den Typ anpassen. Wichtig ist vielleicht noch der Hinweis, dass auf der Speicherkarte nichts verändert wird, bis explizit der Write Vorgang angestoßen wird. Dann jedoch sind die alle Daten auf der Speicherkarte gelöscht und das neue Partitionslayout wurde geschrieben.
Man kann nur wieder lsblk
verwendenn oder mit fdisk
das genaue Partitionslayout mit Sektorangaben ausgeben.
# using lsblk
lsblk
# or fdisk
fdisk -l /dev/sdx
# example output
Gerät Anfang Ende Sektoren Größe Typ
/dev/sdx1 2048 206847 204800 100M BIOS boot
/dev/sdx2 206848 4401151 4194304 2G Linux-Dateisystem
/dev/sdx3 4401152 15974366 11573215 5,5G Linux-Dateisystem
Formatierung¶
Nachdem die Partitionen angelegt wurden, müssen diese mit dem passendenn Dateisystem formatiert werden. Unter manchen Distributionen kann es notwendig sein, die Werkzeuge für ein Dateisystem vorher nachzuinstallieren.
# arch-linux
sudo pacman -S dosfstools
# ubuntu
# seems to be already preinstalled
dpkg -s dosfstools
Danach kann das FAT-Dateisystem bequem mit wie jedes anndere andere Dateisystem mit mkfs
angewandt werden. mkfs.vfat
wählt zwar selbstständig die scheinbar geeignetete Größe, auf der sicherenn Seite is man aber wenn man mit dem Parameter -F 32
diese explizit angibt.
sudo mkfs.vfat -F 32 /dev/sdxX
Den selben Vorgang wiederholt man nun für die restlichen Partitionen. Meist wird hier das Linux typische ext
-Dateisystem verwendet. Version 2 kann aufgrundvon fehlendem Journaling evtl. zu Datenverlust führen, wenn während Schreibvorgängen das Gerät stromlos gemacht wird. Kein Problem stellt das für Read-only Partitionen.
mkfs.ext4 /dev/sdxX # /
mkfs.ext4 /dev/sdxX # /home
Fernzugriff auf gemountete Partitionen¶
Gemountete Partitionen sind nicht direkt über das Netzwerk erreichbar, aber man kann entweder das Gerät selbst oder ihren Speicher als virtuelles Dateisystem durchreichen. Zwischen UNIX-basierten Rechnern, erziehlt Network File System (NFS) die beste Netzwerk Performance und ist nicht besonders schwer einzurichten. Ist es gewünscht, Dateien mit Windows auszutauschen, sollte man einen Blick auf Samba werfen.
Massenspeicher wie z.B. USB-Sticks und SD-Karten werden in der Regel automatisch gemountet. Probleme ergeben sich aber, wenn man den gemounteten Ordner dann teilen möchte. Eine etwas sauberere Lösung kann man mit autofs
realisieren.
Autofs¶
Dieser Punkt kann überschritten werden, wennn der Fernzugriff auf ein Verzeichnis gehen soll, dass auf dem Server immer eingebunden ist. Befindet sich das Verzeichnis auf einem externen Massenspeicher, lohnt sich ein Blick auf autofs
$ sudo apt install autofs
Nach der Installation gibt es eine Master Konfigurationsdatei /etc/auto.master
in der man seine Unterkonfigurationen bekannt mancht. Beispielhaft habe ich hier /automnt /etc/auto.automnt --timeout=5 --ghost
hinzugefügt um mein Gerät nach /automnt
zu mounten. Die Option ghost`
verhindert, dass automatische generierte Mountpoints nach dem Timeout oder dem entfernen des Geräts nicht wieder verschwinden, sondern schlicht leer sind. Autofs löst (unbind) sich nach jedem abgeschlossenen Schreibvorgang (sync) vom eigentlichen Medium und verbindet sich für jeden Zugriff erneut. Es ist empfohlen diesen Ordner direkt im Wurzelverzeichnis und nicht in einem Unterverzeichnis zu erstellen.
$ sudo sh -c 'echo "/automnt /etc/auto.automnt --timeout=5 --ghost" >> /etc/auto.master'
$ sudo mkdir /automnt
$ sudo chmod 777 /automnt
Der Grund warum man das Verzeichnis im Wurzelverzeichnis anlegen sollte ist, dass autofs alle Überordner blockiert. Man sollte also /media
oder mnt
verwenden, wenn diese von einem anderen Tool oder für andere Zwecke bereits verwendet werden.
https://wiki.ubuntuusers.de/Autofs#Die-Master-Map-Datei
Nun können wir die Sub Konfigurationsdateien dort anlegen, wo sie oben angegeben wurden und die spezifischen Mount Optionen mitgeben.
$ sudo sh -c 'echo \
"BOOT -fstype=vfat,sync,uid=0,gid=46,umask=007 :/dev/disk/by-label/BOOT" \
>> /etc/auto.master'
BOOT
ist in diesem Fall die Partitionsbezeichnung (Label) und diese wird auch als Name des Mountpoints verwendet, was auf unserer SD-Karte ein FAT32 Dateisystem ist. Außerdem werden die Berechtigungen gesetzt. Beim Mountvorgang wird hier root
wird als Besitzer und plugdev
als Gruppe verwendet, was jedem registrierten Nutzer den Zugriff auf den gemounteten Ordner ermöglicht. Es wird viel darüber diskutiert, dass sync
option langsam und schädlich für Flash-Speicher sein könnte, aber es wird damit sichergestellt, dass jeder Schreibvorgang auch sofort umgesetzt wird.
In den meisten Fällen is es besser /dev/disk/by-uuid/...
zu verwenden, aber da wir vllt mehrere SD-Karten verwenden, die beim selben Label auch das gleiche Verhalten zeigen sollen macht diese Konfiguration so durchaus Sinn. Man sollte sich dieser Situation aber bewusst sein, da es zu Fehlern führen könnte, wenn mehrere Massenspeicher mit dem selben Label gleichzeitig verwendet werden.
Dieser Vorganng kann natürlich für weitere Partitionen verwendet werden.
Nachdem alle Konfigurationen abgeschlossen sind, wird der Dienst neu gestartet.
$ sudo service autofs restart
Man kann jetzt überprüfen ob das Gerät ordungsgemäß nach /automnt/BOOT
gemountet wurde.
Kleine Randnotiz: Man kann autofs auch mit FTP nutzen, aber das Asprechverhalten könnte dadurch stark verzögert werden und ich habe noch keine Möglichkeit gefunden den filetype auf binary zu setzen, damit keine Probleme mit größeren Dateien auftreten. Mehr Informationen dazu finden sich auch https://wiki.archlinux.org/index.php/Autofs#Remote_FTP.
NFS-Server¶
Ein nettes How-To ist hier zu finden https://help.ubuntu.com/community/SettingUpNFSHowTo
$ sudo apt install nfs-kernel-server
Lokales Verzeichnis¶
Will man z.B. das Root-Filesystem für den RaspberryPi bereitstellen, ist die Konfiguration besonders einfach.
Nach der Installation legt man lediglich die Datei /etc/exports an und trägt dort das Verzeichnis und den berechtigten Client ein.
$ sudo vim /etc/exports
# Freigabe gilt für alle IPs von 192.168.1.1 bis 192.168.1.255, mit Lese-/Schreibrechten:
/pfad/zum/ROOTFS 192.168.1.0/255.255.255.0(rw,async)
Verzeichnis liegt auf einem externen Massenspeicher¶
Unser Ziel ist es den Ordner so schnell wie möglich bereitzustellen, sobald der Massenspeicher mit dem NFS-Server verbunden wird. Um dies zu ermöglichen ohne dabei Einfluss auf bisherige Einstellungenn zu nehmen, macht gerade für NFS die Kombination mit autofs Sinn.
$ sudo vim /etc/exports
...
/automnt U64(rw,no_subtree_check,async,fsid=0,crossmnt) \
localhost(rw,no_subtree_check,async,fsid=0,crossmnt) \
172.29.170.0/24(rw,no_subtree_check,async,fsid=0,crossmnt) \
172.29.173.0/24(rw,no_subtree_check,async,fsid=0,crossmnt)
/automnt/BOOT U64(rw,no_subtree_check,async) \
localhost(rw,no_subtree_check,async) \
172.29.170.0/24(rw,no_subtree_check,async) \
172.29.173.0/24(rw,no_subtree_check,async)
In der exports wird der Zugriff auf die bereitgestellten NFS-Shares geregelt. Hier kann sowohl der Hostname des Rechners als auch desssen IP verwendet werden. Außerdem kann ein ganzer IP-Range freigegeben werden.
Die Option fsid=0
erlaubt ein Hauptverzeichnis in dem sich unterschiedliche Shares finden, dies is jedoch für den Zugriff nicht notwendig. crossmnt
erweitert diese Einstellung so, dass es möglich ist in diesem Hauptverzeichnis Shares zu haben die selbst wiederum auf unterschiedlichen Dateisystemen liegen.
Nach einen Neustart des NFS-Server Dienstes sind die Shares verfügbar.
$ sudo service nfs-kernel-server restart
In Verbindung mit dem zuvor beschriebenen autofs
ist das Verzeichnis jetzt erreichbar aber leer, solange der Massenspeicher nicht verbunden wurde.
Wird der Massenspeicher häufig getrennt und wieder neu verbunden, erweist sich der timeout teilweise als zu lang und unzuverlässig. Das Gerät wird nach einen Schreibvorgang nicht vollständig getrennt und so kann es teilweise lange dauern bis autofs einen remount erkennt. Um hier Abhilfe zu schaffen kann man eine zusätzliche udev
Regel verwenden, die einen richtigen unmount auslöst, wenn der Massennspeicher entfernt wird.
$ sudo vim /etc/udev/rules.d/80-BOOT-unmount.rules
# Auto-unmount USB storage (on remove):
ACTION=="remove", SUBSYSTEM=="block", ENV{ID_FS_LABEL}=="BOOT", RUN+="/usr/bin/logger auto umounting %k"
ACTION=="remove", SUBSYSTEM=="block", ENV{ID_FS_LABEL}=="BOOT", RUN+="/bin/umount /automnt/BOOT"
ACTION=="remove", SUBSYSTEM=="block", ENV{ID_FS_LABEL}=="BOOT", RUN+="/bin/umount -lf /automnt/BOOT"
NFS-Client¶
Auf der Client Seite ist das mounten eines NFS Share genauso einfach wie für eine lokale Partition.
$ sudo apt install nfs-common
$ sudo mkdir /mnt/BOOT
$ sudo mount [NFS-SERVER]:/automnt/BOOT /mnt/BOOT
Es kann vorkommen, dass ein Share nicht mehr erreichbar ist, z.B. wenn der Server zwischendurch nicht erreichbar war.
Möchte man ein bereitgestelltes Root-Filesystem booten, muss man dies im Bootloader konfigurieren und dort als Bootargument übergeben.
$ sudo umount /mnt/BOOT