Zum Hauptinhalt springen

S3 Bucket als Dateisystem mounten

In diesem Artikel beschreiben wir die Einrichtung und Anbindung eines S3 Buckets im User Space mit Rclone ab Ubuntu 16.04. Somit kann der Nine S3 Storage als lokales Dateisystem zur Verfügung gestellt werden.

Rclone bietet einen breiten Funktionsumfang und konnte sich in unserem Vergleich gegen s3fs und Goofys als die beste Option hinsichtlich Leistung und Kompatibilität durchsetzen.

Voraussetzungen

  • Access Key und Secret für Zugriff auf S3 Bucket (kann im Nine Cockpit aufgerufen werden).

  • Damit ein unpriviligierter Benutzer im User Space ein eigenes Filesystem anlegen kann muss das Kernel-Modul FUSE (Filesystem in Userspace)installiert werden. Auf unseren Managed Servern ist das Modul bereits installiert.

  • Root Server: Fuse steht im Ubuntu Repository zur Verfügung und kann per apt installiert werden: apt-get install fuse

Installation

Neustes Linux Binary (Intel/AMD - 64 Bit) herunterladen (https://rclone.org/downloads/) und im User Space ablegen:

:~ $ wget https://downloads.rclone.org/rclone-current-linux-amd64.zip

:~ $ unzip rclone-current-linux-amd64.zip ; rm rclone-current-linux-amd64.zip

:~ $ mkdir ~/bin && mv rclone-v*-linux-amd64/rclone ~/bin/rclone && chmod u+x ~/bin/rclone

:~ $ ~/bin/rclone version
rclone v1.56.1
- os/version: ubuntu 20.04 (64 bit)
- os/kernel: 5.4.0-80-generic (x86_64)
- os/type: linux
- os/arch: amd64
- go/version: go1.16.8
- go/linking: static
- go/tags: none

Konfiguration

Um von Rclone automatisch erkannt zu werden muss die Konfiguration in der Datei ~/.config/rclone/rclone.conf abgelegt werden. Passen Sie die Werte entsprechend den Informationen für Ihren Benutzer und Bucket an.

Es können mehrere Endpunkte und Benutzer getrennt durch [section] konfiguriert werden.

:~ $ mkdir -p ~/.config/rclone/
[s3-nine]
type = s3
provider = Other
access_key_id = 6aaf50b18357446ab1a25a6c93361569
secret_access_key = fcf2c9c6bc5c4384a4e1dbff99d2cc52
region = nine-cz42
endpoint = https://cz42.objectstorage.nineapis.ch

Anschliessend kann das Bucket als Mountpunkt eingerichtet werden. Der Mountpunkt kann ein bestehendes Verzeichnis innerhalb Ihres Benutzers oder ein neues Verzeichnis sein.

Ein neues Verzeichnis kann mittels mkdir ~/path erstellt werden.

Mit folgenden Befehl wird das S3 Bucket gemountet:

Hinweis: Ältere rclone versionen nutzen --vfs-cache-mode write (ohne "s").

:~ $ ~/bin/rclone mount s3-nine:<Bucketname> ~/<Mountpoint> --vfs-cache-mode writes --use-server-modtime

Hinweis: Der Rclone Prozess läuft im im Vordergrund in Ihrer aktuellen Shell. Sie können nun eine zweite Shell öffnen und den Zustand prüfen. Sollte alles wunschgemäss funktionieren, können Sie mit dem nächsten Schritt weiterfahren und einen Systemd-Service erstellen, der im Hintergrund läuft.

In unseren Tests hat sich --vfs-cache-mode writes als die sinnvollste Option zwischen Kompatibilität und Festplattennutzung erwiesen.

Um die Performance zu verbessern, können auch Leseoperationen gecached werden, was gewisse Einschränkungen zur Folge haben kann. Bei den Caching-Modi minimal und full kann die Plattennutzung höher sein oder bestimmte Operationen auf dem Dateisystem funktionieren nicht. Bei diesen Modi kann es auch sinnvoll sein, die Puffer- und Cache-Grösse mit den Parametern --buffer-size und --vfs-cache-max-size anzupassen. Wir empfehlen, in der offiziellen rclone-Dokumentation nachzuschlagen, wenn Sie die Verwendung dieser Optionen in Betracht ziehen: https://rclone.org/commands/rclone_mount/#vfs-file-caching

Autostart / Überwachung

Damit Rclone bspw. nach einem Neustart des Systems automatisch startet und das Bucket gemountet wird, nutzen wir eine Systemd Service Unit.

Dafür wird folgende Service Unit Konfiguration in ~/.config/systemd/user/rclone.service angelegt.

Passen Sie die mit < > markierten Werte entsprechend den Informationen für Ihren Bucket und Mountpunkt an:

[Unit]
Description=rclone mount
Documentation=http://rclone.org/docs/
Wants=network-online.target
After=network-online.target
StartLimitInterval=500
StartLimitBurst=5

[Service]
Type=notify
Environment=MOUNTPOINT=<MOUNTPOINT>
Environment=REMOTE_NAME=s3-nine
Environment=BUCKETNAME=<BUCKETNAME>
Restart=on-failure
RestartSec=5
ExecStartPre=/bin/bash -c "/usr/bin/fusermount -uzq ${MOUNTPOINT} || true"
ExecStart=/usr/bin/env "${HOME}/bin/rclone" mount \
--vfs-cache-mode writes \
--use-server-modtime \
${REMOTE_NAME}:${BUCKETNAME} ${MOUNTPOINT}
ExecStop=/bin/fusermount -uzq ${MOUNTPOINT}

[Install]
WantedBy=multi-user.target

Die neue Systemd-Konfiguration muss anschliessend mit dem Befehl systemctl --user daemon-reload eingelesen werden.

Damit der Service nach einem Neustart des Systems automatisch gestartet wird, muss der folgende Befehl ausgeführt werden:

systemctl --user enable rclone.service

Die neu angelegte Service Unit kann nun mit den folgenden Befehlen gestartet bzw. der Status der Unit abgerufen werden:

:~ $ systemctl --user start rclone.service
:~ $ systemctl --user status rclone.service
● rclone.service - rclone mount
Loaded: loaded (/home/www-data/.config/systemd/user/rclone.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2021-09-30 15:45:56 CEST; 1min 2s ago
Docs: http://rclone.org/docs/
Main PID: 12582 (rclone)
Status: "[15:46] vfs cache: objects 0 (was 0) in use 0, to upload 0, uploading 0, total size 0 (was 0)"
CGroup: /user.slice/user-33.slice/user@33.service/rclone.service
└─12582 /home/www-data/bin/rclone mount --vfs-cache-mode writes --use-server-modtime s3-nine:bucket1 /home/www-data/testmountpoint

Sep 30 15:45:56 server systemd[805]: rclone.service: Service hold-off time over, scheduling restart.
Sep 30 15:45:56 server systemd[805]: Stopped rclone mount.
Sep 30 15:45:56 server systemd[805]: Starting rclone mount...
Sep 30 15:45:56 server systemd[805]: Started rclone mount.

Aktualisierung

Aktualisierungen von Rclone können über die eingebaute "selfupdate"-Funktion durchgeführt werden. Dabei wird die neuste als "stabil" markierte Version heruntergeladen und das Eingangs heruntergeladene Binary ersetzt: ~/bin/rclone selfupdate

Fehlerbehebung

Fehlerbild:

:~/s3mount $ ls
ls: cannot open directory '.': Transport endpoint is not connected

Sollten Sie sich bereits im Mountpunkt befunden haben und hat Rclone die Verbindung erst im Anschluss hergestellt, so müssen Sie erneut in das Verzeichnis wechseln (cd; cd -).

Fehlerbild:

:~ $ ~/bin/rclone mount s3-nine:test-bucket ~/s3mount --vfs-cache-mode writes --use-server-modtime
2021/09/23 14:27:56 Fatal error: Can not open: /home/www-data/s3mount: open /home/www-data/s3mount: transport endpoint is not connected

Sollte der Rclone Prozess einmal ungeplant beendet werden muss der Mountpunkt ggf. mit dem Befehl fusermount -u </mountpoint> entfernt werden. Nach einem Neustart der Systemd Unit sollte der Mountpunkt wieder zur Verfügung stehen: systemctl --user restart rclone.service