blog.nerdingham.de

OneDrive auf Linux Server als Speicherplatz einbinden

Die letzten Tage war ich mit dem Thema beschäftigt, wie ich möglichst viel Speicherplatz für einen vernünftigen Preis bekomme und diesen unter Linux als Ablage für Backups usw. nutzen kann. Ich nutze schon seit einiger Zeit HiDrive von Strato, dennoch habe ich mal weiter geforscht und bin dabei auf Office365 gestoßen.

Office 365 hat man wohl eher auf dem Schirm, wenn es darum geht, stets aktuell mit dem heimischen Office zu bleiben. Es hat aber auch Speicherplatz inbegriffen und nicht gerade wenig: Pro Benutzer werden einem jeweils 1 TB an Speicherplatz angeboten.

Was sich in der Theorie ganz gut anhört, und in der Praxis unter Windows auch ganz gut ist, stellt eine Herausforderung unter Linux dar, zumindest wenn man von der Konsole aus arbeitet. Nach etwas Tüfteln und Ausprobieren bin ich aber auf eine Lösung gekommen, auch wenn mir noch Erfahrungswerte fehlen bei der Zuverlässigkeit.

Ich beschreibe mal die Wege, die Herausforderungen und meine Lösung:

Zugriff via davfs2

Kennt man sich etwas unter Linux aus und beschäftigt man sich mit Office365 OneDrive, liest man schnell, dass es die Möglichkeit gibt, über das WebDAV Protokoll auf die Dateien zuzugreifen. In der Regel funktioniert der Zugriff auf WebDAV unter Linux, wenn auch nicht immer performant oder ohne Komplikationen. Im Fall OneDrive haben wir es mit Komplikationen zu tun: Nutzt man das verbreitete FUSE Modul davfs2, erhält man beim Versuch die Freigabe einzuhängen, eine Fehlermeldung:

root@vmm-h01:/# mount -tdavfs,rw,_netdev -vv https://d.docs.live.net/xxxxxxxxx /media/cdrom
/sbin/mount.davfs: das Einhängen schlug fehl;
302 Found

Um es kurz zu machen: Auf diversen Seiten wird beschrieben, wie man den „persönlichen“ Pfad ermittelt um via WebDAV zugreifen zu können. Verwendet man den mit dem Modul, gibt es einen Redirect (HTTP Status Code 302), mit dem das Modul nicht umgehen kann.

Es gibt einige Bug Reports zu dem Thema auf der Internet-Seite von davfs2, aber keine wirklich einfachen Lösungen oder solche, die bereits eingeflossen wären in davfs2. Da das alles für mich nach zu viel Gefriemel ausgesehen hat, keine Lösung die ich weiterverfolgt habe.

Man liest, dass wohl das Einbinden unter Gnome oder KDE mit deren eigenen WebDAV Modulen wohl funktioniert, da ich aber den Zugriff „headless“ auf einem Server einrichten möchte, keine Option für mich.

Zugriff via RClone

Auf einer Internet-Seite bin ich auf eine Beschreibung gestoßen, wie sich OneDrive alternativ einrichten lässt, und zwar mit der Software RClone.

Die Einrichtung mit der Software ist tatsächlich auch recht einfach. Es empfiehlt sich, von der RClone die aktuellste Version herunterzuladen. Bei meinen Tests mit der bei mir in Debian 9 vorhandenen Version hatte ich Probleme, die mit der aktuellen Version nicht auftraten.

Dazu habe ich in meinem Fall die aktuelle Version 1.46 auf dem Server heruntergeladen und anschließend installiert mit

apt install /tmp/rclone-v1.46-linux-amd64.deb

und mit

rclone config

die Konfiguration gestartet. Es wird dann ein Menü angezeigt:

root@vmm-h01:/# rclone config
Current remotes:

Name Type
==== ====

n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q>

Ruf dann den Punkt „New remote“ auf durch drücken der Taste n + ENTER. Anschließend werden ein paar Fragen gestellt, die man wie nachfolgend zu sehen beantwortet (in dem Beiespiel benenne ich die Verbindung „onedrive-laufwerk“):

e/n/d/s/q> n
name> onedrive-laufwerk
Type of storage to configure.
Choose a number from below, or type in your own value
1 / Amazon Drive
\ "amazon cloud drive"
2 / Amazon S3 (also Dreamhost, Ceph, Minio)
\ "s3"
3 / Backblaze B2
\ "b2"
4 / Dropbox
\ "dropbox"
5 / Encrypt/Decrypt a remote
\ "crypt"
6 / Google Cloud Storage (this is not Google Drive)
\ "google cloud storage"
7 / Google Drive
\ "drive"
8 / Hubic
\ "hubic"
9 / Local Disk
\ "local"
10 / Microsoft OneDrive
\ "onedrive"
11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
\ "swift"
12 / Yandex Disk
\ "yandex"
Storage> onedrive
Microsoft App Client Id - leave blank normally.
client_id>
Microsoft App Client Secret - leave blank normally.
client_secret>
Remote config
Use auto config?
* Say Y if not sure
* Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> y
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code…

An dem Block folgt eine kleine aber keine wirklich große Herausforderung: RClone möchte, dass du eine URL aufrufst, die aber nur lokal auf dem Server (=127.0.0.1) erreichbar ist. Hierfür greifen wir auf Trick 17 zurück, wir tunneln via SSH einfach den Port auf den heimischen Rechner mit Internet-Browser und rufen dort die Adresse auf. Hierfür nutze ich im Beispiel PuTTY, das geht aber prinzipiell auch mit jedem anderen SSH Client, der das Tunneln von Ports erlaubt.

Auf folgendem Screenshot sieht man, wie in der SSH Verbindung noch ein Tunnel für die URL eingerichtet wird, die von RClone angezeigt wird. Wichtig ist hierbei der Port sowie die Adresse 127.0.0.1.

PuTTY Einstellungen

Hat man sich erfolgreich via SSH verbunden, kann man im lokalen Browser von dem Rechner von dem man sich aus verbunden hat, identisch die Adresse aufrufen, die RClone anzeigt. Hat man dort dann bestätigt dass man den Zugriff erlaubt, geht es auch schon weiter auf der Konsole:

Got code
2019/03/10 14:49:26 Failed to save new token in config file: section 'onedrive-laufwerk' not found
--------------------
[onedrive-laufwerk]
client_id =
client_secret =
token = {"access_token":".............","token_type":"bearer","refresh_token":".............","expiry":"2019-03-10T15:49:26.85383504+01:00"}

y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:

Name Type
==== ====
onedrive-laufwerk onedrive

e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q>

Das war es an der Stelle mit der Konfiguration, mit q kann man dann RClone verlassen. Jetzt kann man auch schon testen, ob alles wie gewünscht funktioniert. Dafür ruft man auf:

rclone mount onedrive-laufwerk: /mnt

Das bedeutet in dem Fall, dass die auf den Namen onedrive-laufwerk eingerichtete Verbindung auf das Verzeichnis /mnt eingehängt wird. In einem zweiten Shell-Fenster kann man dann auch mal auf /mnt zugreifen und sollte die Inhalte von OneDrive sehen können.

Mit CTRL+C kann man dann dann den Test abbrechen.

Jetzt fehlt eigentlich nur noch eine Sache: Automatisches Einbinden der Freigabe beim Systemstart.

Hierfür rufst du die Seite https://github.com/rclone/rclone/wiki/rclone-mount-helper-script auf und speicherst das Skript am Seitenanfang auf dem Zielrechner ab. Ich habe es bei mir mit dem Namen rclonefs unter /usr/local/bin abgelegt und anschließend natürlich noch die Datei mit chmod 755 ausführbar gemacht.

Jetzt kannst du in der Datei /etc/fstab einen Eintrag wie folgt hinzufügen:

rclonefs#onedrive-laufwerk:/  /mnt/onedrive-laufwerk  fuse config=/root/.rclone.conf,allow-other,default-permissions,max-read-ahead=16M 0 0

Zu beachten ist, dass unter /mnt das Verzeichnis onedrive-laufwerk angelegt wurde, in welches dann die OneDrive-Freigabe rein gemountet wird und der Pfad zur Konfigurationsdatei, hier /root/.rclone.conf angegeben wird.

Das war es dann auch soweit: Bei mir wird jetzt alles eingebunden und ich kann den Speicherplatz nutzen 🙂

Die mobile Version verlassen