Freitag, 4. August 2023

Remote Cloud - die Cloud direkt in Linux mounten

Wenn man die Suche bemüht findet man primär jede Menge Tools, meist speziell ein Tool für eine Cloud. Die Technologien sind bei jedem Anbieter ein wenig anders. Die Technologie ändert sich von Zeit zu Zeit, so sind viele Tools nach kurzer Zeit veraltet.

Es gibt aber ein gut gepflegtes Tool, das erledigt diesen Job für so ziemlich alle Cloud Anbieter: rclone 

Setup

Ich habe die Scriptinstallation von hier gewählt, damit erhält man die aktuellste Version.

sudo -v ; curl https://rclone.org/install.sh | sudo bash

Für den mount Befehl musste ich noch fuse3 nachinstallieren.

sudo apt install fuse3


Konfiguration

Die config datei wird mit rclone in einem interaktiven setup erzeugt. Die Konfiguration kann man immer wieder durchlaufen und die Datei damit ergänzen. Bei Google Drive und Onedrive sind dabei weitere Schritte in einem Browser notwendig. 

Man ist gut beraten, die Konfiguration auf einem Linux Desktop System vorzunehmen und diese später auf das Zielsystem zu übertragen. Mit einigen Tricks kann man auch einen Remote Browser nutzen siehe z.B: hier.

rclone config

Dabei entsteht eine Datei .config/rclone/rclone.conf im aktuellen user Verzeichnis. Man kann den Zugriff testen (config Beispiel Google Photos):

rclone ls gphoto:media
rclone lsd gphoto:

rclone ist ein umfangreiches Tool und kann ähnlich wie rsync auch zum kopieren / synchronisieren von Strukturen verwendet werden. 

rclone cp Test/test.txt onedrive:Test
rclone sync Test onedrive:Test
Einen mount braucht man dafür nicht! Vorsicht mit dem sync Befehl, er löscht auch und bei falscher Pfadangabe löscht er irgendwelche Dateien und Pfade. Onedrive verfügt über einen Papierkorb, im Browser kann man innerhalb von 30 Tagen alles wieder herstellen. 

Cloud mounten

Man kann die Cloud als Pfad einbinden und ansonsten rclone nicht weiter verwenden. 

Das Verzeichnis für den mount muss existieren und leer sein! Da ich faul bin habe ich den Namen in eine Variable geschrieben. Dieser Code setzt voraus, dass der config Abschnitt und der Pfad gleich heißen. Beispiel für onedrive:

cloud=onedrive
mkdir /mnt/${cloud}
rclone mount ${cloud}: /mnt/${cloud}

Dieser mount diente eher zum Test, das Programm bleibt im Vordergrund, beim Beenden ist der mount verschwunden.

Um die Cloud beim Systemstart einzubinden, kann man einen "Parameter" Service erzeugen. 

Vorbereitung 

Dazu kopiert man die kompletter Konfiguration an einen allgemeinen Ort.  

sudo cp .config/rclone/rclone.conf /etc/

Achtung: in dieser Datei befinden sich sensible Zugangsdaten für die Cloud! Bitte auf Sicherheit achten!

Will man das mounten mit der option --allow-other zulassen, muss man das vorbereiten. Durch den sed Befehl wird das Kommentarzeichen entfernt.

sudo sed -i 's/^#user_allow_other/user_allow_other/' /etc/fuse.conf

Dienst erzeugen

Ich mache das gerne als Heredoc und bemühe den systemd editor. Der erledigt am Ende nämlich daemon-reload. Diesen Block kann man also komplett kopieren und in das Terminal fallen lassen. Er erzeugt die notwendige unit Datei am richtigen Ort.

cat <<EOISERV |sudo SYSTEMD_EDITOR=tee systemctl edit --full --force rclone-mount@.service
[Unit]
# Idee von hier https://gist.github.com/gmag11
Description=rclone FUSE mount for %i
Documentation=http://rclone.org/docs/
After=network-online.target
# externo.mount # This is only needed if you use an external USB hard drive in order to wait for it to be mounted
# Mount point in my system is on a USB drive, don't ask why :))), that's why I have to wait for it to get mounted
# Requires=externo.mount

[Service]
Type=notify
# --vfs-cache-mode full activates cache for writting and reading. Check RClone documentation
ExecStart=/usr/bin/rclone mount %i: /mnt/%i --config=/etc/rclone.conf --vfs-cache-mode full -v --allow-other
ExecStop=/bin/fusermount -uz /mnt/%i
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOISERV

Jetzt kann man die Dienste ausprobieren und aktivieren. Hat man mehrere geht das in einer kurzen Schleife:

array=( onedrive gdrive gphoto )
cmd=start # start, enable, disable usw.
for drive in ${array[*]} ; do
    sudo systemctl ${cmd} rclone-mount@${drive}.service
done


ToDo ?


Code Block


Keine Kommentare:

Kommentar veröffentlichen