[[Vorlage(Getestet, focal)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis()]] [https://developer.gnome.org/gio/stable/ GIO] {en} steht für '''G'''nome '''I'''nput '''O'''utput und ist die Schnittstelle zum [wikipedia:Gnome_Virtual_File_System:], kurz GVfs, der [wikipedia:GLib:] von [:GTK:]. Mit Hilfe des GVfs lassen sich in GTK-basierte Applikationen, wie z.B. den Dateimananger Nautilus, z.B. auch Ressourcen, die über Netzwerkschnittstellen wie z.B. SFTP, DAV, MTP erreichbar sind, wie Dateien im lokalen Dateisystem einbinden. Außerdem ist gio der Name des Kommandozeilenprogramms, mit der Nutzer von der Kommandozeile aus mit der gio-Schnittstelle interagieren kann. gio ist der Nachfolger von einer Reihe von älteren Kommandozeilenprogrammen wie [:Archiv/gvfs-mount:gvfs-mount], mit denen man ebenfalls auf das GVfs zugreifen konnte. Dieser Artikel beschäftigt sich mit dem Kommandozeilenprogramm gio, nicht mit der Programmierschnittstelle GIO. = Installation = Für das GVfs werden die Pakete '''gvfs-backends''' und '''gvfs-fuse''' benötigt. Das Kommandozeilenprogramm gio ist im Paket '''libglib2.0-bin''' enthalten. Alle drei Pakete sind elementare Bestandteile von Ubuntu und dessen Derivaten, soweit diese GTK einsetzen (z.B. [:Xubuntu:], [:Ubuntu MATE:]). Das Paket '''gvfs-bin''' wird normalerweise nicht mehr gebraucht. Es enthält die Weiterleitung der veralteten Befehle wie z.B `gvfs-mount` auf den Befehl gio. = Benutzung = == GVfs – Dienste und Orte == Die Argumente gewöhnlicher Datei-Operationen sind Dateien und Ordner, die durch Namen und Zugriffspfad charakterisiert sind. Die Argumente der gio-Kommandos umfassen diese zwar, sind aber von allgemeinerer Art. So kann hier z.B. eine über USB angeschlossen Digitalkamera als ganze Argument sein. Die im englischen Sprachgebrauch übliche Verallgemeinerung des Zugriffspfades ist ''location'', auf deutsch "''Ort''". === Daemonen === Die für das Funktionieren des GVFS und damit für die gio-Kommandos nötigen [wikipedia:Daemon:Daemonen] befinden sich im Verzeichnis '''/usr/lib/gvfs'''. Hauptdaemonen sind unabhängig von den jeweiligen Orten immer aktiv. Neben dem Grund-Daemon '''gvfsd''', der beim Systemstart gestartet wird und über den alle übrigen Daemonen gestartet und angesprochen werden, sind dies die Daemonen '''gvfsd-fuse''' und '''gvfsd-metadata'''. Diese verwalten den alternativen Mountpunkt für [wikipedia:POSIX:]-Anwendungen und das Serialisieren und Zwischenspeichern von Metadaten zur Sicherung von deren Persistenz. Sie sind für das Funktionieren der gio-Kommandos nicht unbedingt erforderlich (s.u.). Wie man an den Namen der anderen Daemonen erkennt, sind diese für das Ansprechen spezieller Orte nötig. So können z.B. Server in SMB-Netzwerken ("Windows-Netzwerken") nur angesprochen werden, wenn der Daemon ''gvfsd-smb'' aktiv ist, und browsen kann man in ihnen nur mittels ''gvfsd-smb-browse''. === Lokale Dateisysteme === Auf alle Dateisysteme, für die ein Eintrag in der Systemdatei '''/dev''' besteht ("devices"), kann über das GVfs zugegriffen werden. Sofern diese nicht bereits über einen [:systemd:]-Service, einen Eitrag in [:fstab:] über den Standard-Befehl [:mount:] ins Dateisystem eingebunden sind, muss dies zuerst ohne [:sudo:Root-Rechte] mittels {{{#!vorlage Befehl gio mount -d DEVICE }}} geschehen. Siehe hierzu auch [:gio mount:]. === Netzwerk-Dienste === {{{#!vorlage Tabelle <-3 tableclass="zebra_start3" rowclass="titel" :>Vom GVfs unterstützte Netzwerk-Dienste +++ Dienst Ort Erklärung +++ Samba smb://… Netzwerk-Verbindungen mittels SMB/cifs ("Windows-Netzwerke") +++ FTP ftp://… File Transfer Protocol, Netzwerkprotokoll zur Übertragung von Dateien über IP-Netzwerke +++ SSH ssh://… Secure Shell, Netzwerkprotokoll für verschlüsselte Verbindungen +++ SFTP sftp://… Für die Secure Shell (SSH) entworfene Alternative zum File Transfer Protocol (FTP) +++ WebDav dav://…, davs://… Netzwerkprotokoll zur Bereitstellung von Dateien über das Internet (wahlweise verschlüsselt) +++ MTP mtp://… Protokoll für über USB angeschlossene Smartphones +++ OBEX-FTP obex://… Protokoll zum Browsen und Datenaustausch über [:Bluetooth:]) }}} Vom Netzwerk-Dienst [:NFS:] unterstützt das GVfs lediglich die (veralteten) Versionen NFSv2 und NFSv3. Das dafür notwendige Backend ist in Ubuntu standardmäßig nicht verfügbar. Die Unterstützung von [:Samba:] wurde zwar für das inzwischen veraltete Protokoll SMBv1 (cifs, NT1) konzipiert, funktioniert aber weitgehend auch mit den modernen Protokollen SMBv2 und SMBv3. === Sonstige Dienste === Ähnlich wie Netzwerk-Dienste behandelt das GVfs auch folgende Orte: {{{#!vorlage Tabelle <-3 tableclass="zebra_start3" rowclass="titel" :>Sonstige vom GVfs unterstützte Dienste und Orte +++ Dienst Ort Erklärung +++ Datenträger computer:// Alle auf diesem Computer verfügbaren Dateisysteme +++ Netzwerkumgebung network:// Alle verfügbaren Netzwerk-Verbindungen (u.U. verschiedene Protokolle) +++ Papierkorb trash:// Der gesamte, u.U. auf mehrere Datenträger verteilte Papierkorb +++ Brennprogramme burn:// +++ Digitalkamera gphoto2:// Eine über USB angeschlossene Kamera +++ Root-Rechte admin://… Lokaler Dateizugriff mit Root-Rechten (ab Ubuntu 17.04) }}} Die Tabelle zeigt nur Beispiele und erhebt keinen Anspruch auf Vollständigkeit == gio – Befehle und Optionen == Die allgemeine Syntax von `gio` lautet: {{{#!vorlage Befehl gio BEFEHL [OPTIONEN] [ARGUMENTE] }}} Die Optionen und ggf. notwendigen Argumente variieren je nach `BEFEHL`. Ein Übersicht über alle verfügbaren Befehle erhält man mit {{{#!vorlage Befehl gio help # alternativ: gio -h }}} Eine detailliertere Hilfe zu einem Befehl und dessen Optionen erhält man mit {{{#!vorlage Befehl gio help BEFEHL # alternativ: gio BEFEHL --help }}} Beispiel: {{{#!vorlage Befehl gio help tree }}}liefert: {{{ Aufruf: gio tree [OPTION …] [ORT...] Den Inhalt von Ordnern in einer Baumstruktur auflisten. Optionen: -h, --hidden Verborgene Dateien zeigen -l, --follow-symlinks Symbolischen Verknüpfungen, Einhängepunkten und Schnellzugriffen folgen }}} === Ein- und Aushängen === Die gio-Befehle können nur dann ausgeführt werden, wenn die angesprochenen Objekte (Dateisysteme usw.) eingehängt sind. Sofern dies nicht vorher schon anderweitig geschehen ist (z.B. durch Eintrag in [:fstab:/etc/fstab]), muss das Einhängen zuerst mit dem Befehl `gio mount [OPTIONEN] ORT` erfolgen. Dem Befehl `gio mount` kommt daher eine besondere Bedeutung zu. Deshalb wird auf diesen in dem Artikel [:gio mount:] ausführlich eingegangen. === Übersicht der gio-Kommandos === Folgende Tabelle dient zur Übersicht über die gio-Kommandos. Dem jeweiligen Befehl muss noch `gio` vorangestellt werden. {{{#!vorlage Tabelle <-3 tableclass="zebra_start3" rowclass="titel" :>gio Befehle (Übersicht) +++ Befehl u. Syntax Vergleich Erklärung +++ help [BEFEHL] - Befehle auflisten bzw. detaillierte Hilfe zu BEFEHL und OPTIONEN {de} +++ version - Versionsinformationen ausgeben und beenden. +++ cat ORT... cat Dateien aneinander hängen und auf der Standardausgabe ausgeben. +++ copy [OPTION …] QUELLE... ZIEL cp Eine oder mehrere Dateien von QUELLE nach ZIEL kopieren. +++ info [OPTION …] ORT... ls Informationen zu Orten zeigen. +++ list [OPTION …] [ORT...] ls Den Inhalt der Orte auflisten +++ mime MIME-TYP [HANDLER] - Anwendung für MIME-Typ ermitteln oder festlegen +++ mkdir [OPTION …] ORT... mkdir Ordner erstellen. +++ monitor [OPTION …] [ORT...] - Dateien und Ordner auf Änderungen überwachen. +++ mount [OPTION …] [ORT...] mount Die Orte ein- oder aushängen bzw. eingehängte Orte anzeigen. Siehe auch Artikel [:gio_mount:gio mount]. +++ move [OPTION …] QUELLE... ZIEL mv Eine oder mehrere Dateien von QUELLE nach ZIEL verschieben. +++ open ORT... - Dateien mit der Vorgabeanwendung ("Handler") öffnen, welche als Programm für diesen Dateityp eingestellt ist. +++ rename ORT NAME (mv) Eine Datei umbenennen. +++ remove [OPTION …] ORT... rm Die gegebenen Dateien löschen. +++ save [OPTION …] ZIEL - Aus der Standardeingabe lesen und in ZIEL speichern. +++ set [OPTION …] ORT ATTRIBUT WERT... - Ein Dateiattribut von ORT festlegen. +++ trash [OPTION …] [ORT...] - Dateien oder Ordner in den Papierkorb verschieben. +++ tree [OPTION …] [ORT...] (tree) Den Inhalt von Ordnern in einer Baumstruktur auflisten. }}} ==Hinweise== === Shell-Skripte === Die gio-Kommandos können grundsätzlich in Shell-Skripten verwendet werden. Ausgeschlossen sind allerdings Skripte, die beim Systemstart bzw. Einloggen des Benutzers vor dem Start des GVfs-Hauptdaemons ''gvfsd'' ausgeführt werden sollen. Dies ist beim Erstellen von [:systemd:]-Services zu beachten. Der Eintrag von Start-Skripten in '''/etc/rc.local''' ist deprecated und kann auch mit Skripten, die gio-Kommandos enthalten, nicht funktionieren. Außerdem funktionieren solche Skripte nicht in [:Cron:Cronjobs]. Dagegen ist ein Eintrag in ''"Startprogramme"''(Xfce: ''"Sitzung und Startverhalten > Automatisch gestartete Anwendungen"'') problemlos möglich. === Alternativer Zugriff === Für Anwendungen, die einen POSIX-konformen Zugriffspfad brauchen, richtet das GVfs über [:FUSE:] einen alternativen Mountpunkt ein. Standardmäßig befindet sich dieser im Ordner '''/run/user/gvfs/BENUTZER-IP/'''. Für das Funktionieren der Dateimanager und der gio-Kommandos wird dieser nicht gebraucht. Der alternative Mountpunkt wird nur noch selten gebraucht. Er wird vom Daemon ''gvfsd-fuse'' erstellt und verwaltet. Möchte man von ihm zur Erhöhung der Performance und zur Schonung der Ressourcen keinen Gebrauch machen, so kann der Daemon ''gvfsd'' mit der Option `--no-fuse` laufen. Weil aber der Daemon ''gvfsd'' beim Systemstart automatisch ohne diese Option gestartet wird, muss man ihn hierfür über die Zeile {{{#!vorlage Befehl `gvfsd -r --no-fuse` }}} Dauerhaft lässt sich der Daemon ''gvfsd-fuse'' über die Systemvariable GVFS_DISABLE_FUSE deaktivieren. Hierzu trägt man in der Datei in der Datei '''~/.profile''' folgende Zeile ein: {{{ export GVFS_DISABLE_FUSE=1 }}} === Metadaten === Beachtung verdient auch der Dienst `gvfsd-metadata`. Über diesen werden zur Sicherheit bei allen gio-Operationen (auch den lokalen), die Metadaten verändern (also z.B. Speichern oder Verschieben), diese zur Sicherheit im Ordner '''~/.local/share/gvfs-metadata''' zwischengespeichert und nach erfolgreicher Operation wieder gelöscht, sodass sie bei einem ungewollten Abbruch noch verfügbar bleiben. Unter Umständen kann dies jedoch zu einer erheblichen Verzögerung von Dateioperationen und zu einer großen Belastung von Prozessor, Netzwerk und Festplatte (wichtig z.B. bei SSD) führen. Manchmal kann es deshalb sinnvoll sein, den Daemon `gvfsd-metadata` zu deaktivieren. Dies kann durch folgende Kommandos geschehen bzw. rückgängig gemacht werden: {{{#!vorlage Befehl systemctl --user mask gvfs-metadata.service systemctl --user unmask gvfs-metadata.service }}} Die Maskierung ist für die betreffende Sitzung wirksam und muss nötigenfalls bei jedem Einloggen wiederholt werden. Möchte man den Daemon mitten in einer Sitzung deaktivieren, so kann zusätzlich noch folgende Zeile nötig sein: {{{#!vorlage Befehl systemctl --user stop gvfs-metadata.service }}} Ob der Daemon aktiv ist, überprüft man mit folgendem Befehl: {{{#!vorlage Befehl systemctl --user status gvfs-metadata.service }}} === gio und GVfs mit Root-Rechten === gio ist für die Verwendung im Userspace ohne Root-Rechte konzipiert. Wie auch die Dateimanager (z.B. Nautilus, Thunar), so sollte auch gio möglichst nicht mit Root-Rechten[2] ausgeführt werden. Ist dies jedoch nicht vermeidbar, so muss der Befehl [:sudo:] mit dem Parameter `-H` verwendet werden. Früher stand für die Ausführung graphischer Anwendungen mit Root-Rechten der Befehl `gksudo` aus dem Paket '''gksu''' zur Verfügung. Seit [:Bionic:Ubuntu 18.04 LTS] ist dies aus Gründen der Sicherheit nicht mehr der Fall. Mit dem Ort `admin://...` bietet das GVfs seit [:Artful:Ubuntu 17.10] nun einen Ersatz. Beispiele: {{{#!vorlage Befehl nautilus admin:/// }}} startet den Dateimanager Nautilus mit Root-Rechten, und mittels {{{#!vorlage Befehl gedit admin:///etc/fstab }}} kann man die Systemdatei '''/etc/fstab''' mit Root-Rechten bearbeiten. Die Kommandos können im Gegensatz zu `sudo -H` auch ohne Terminal[1] verwendet werden; die Abfrage des Passworts erfolgt in einem besonderen Fenster. {{{#!vorlage Warnung Graphische Anwendungen mit Root-Rechten auszuführen ist immer ein Sicherheitsrisiko, das man möglichst vermeiden sollte! }}} === Alternativen === Die gio-Kommandos für den Ort `smb://` sowie dessen Server und Freigaben funktionieren auch mit dem neueren Protokollen SMBv2 und SMBv3. Allerdings werden bei diesen nicht alle Features unterstützt. Eine Alternative bietet das Tool [:smbclient:] aus dem gleichnamigen Paket {{{#!vorlage Paketinstallation smbclient }}} Mittels {{{#!vorlage Befehl smbclient -L SERVER }}} kann man die Freigaben auf dem Server anzeigen (ähnlich `gio list smb://SERVER`), und mit {{{#!vorlage Befehl smbclient //SERVER/FREIGABE }}} öffnet man dort eine Shell für viele Kommandos, die dort zum Teil ähnliche Funktionen ausführen wie gio-Kommandos, ohne dass dafür der Server bzw. die Freigabe eingehängt (gemounted) werden müsste. == Beispiele == Viele der gio-Kommandos stimmen weitgehend mit den entsprechenden Kernel-Kommandos überein, allerdings mit auf GVfs-Orte erweitertem Argument-Bereich (z.B. `gio copy [OPTION …] QUELLE... ZIEL` mit `cp [OPTION …] QUELLE... ZIEL`). Außerdem können bei vielen gio-Kommandos entsprechende Operationen über den Dateimanager mit Mausklick ausgeführt werden, wenn auch mit einer wesentlich geringeren Auswahl an Optionen. Deshalb finden gio-Kommandos vor allem in Skripten und weniger im Terminal[1] Verwendung. === gio mount und gio open === Die Kommandozeile {{{#!vorlage Befehl gio mount smb://diskstation/public; gio open $_ }}} hängt die Freigabe `public` auf dem Server `diskstation` ein und öffnet zu ihr ein Fenster. Gleiches lässt sich auch für das Windows-Netzwerk als Ganzes durchführen: {{{#!vorlage Befehl gio mount smb://; gio open $_ }}} === gio tree === Das Kommando `gio tree [OPTION] ORT` ersetzt das Kommando `tree`, ohne dass dafür das Paket '''tree''' zusätzlich installiert werden müsste. Verbunden mit [:grep:] eignet es sich als Suchfunktion: {{{#!vorlage Befehl gio tree smb://Heimserver/Bilder | grep Aachen }}} sucht in dem auf `Heimserver` freigegebenen und mittels `gio mount` auf dem Client eingehängten Ordner `Bilder` und dessen Unterordnern alle Dateien, in deren Namen "Aachen" enthalten ist. Vorsicht: Bei extrem vielen Dateien kann dies zum Abbruch mit der Fehlermeldung ''"zu viele offene Dateien"'' führen! === gio info und gio set === Dateiattribute auslesen: Das Kommando `gio info [OPTION] ORT` liefert wesentlich mehr Informationen als ein Klick mit der rechten Maßtaste [[Vorlage(Tasten,rmt )]] und dann ''"Eigenschaften"'' im Dateimanager. Die sehr umfangreiche Ausgabe kann man mit Optionen einschränken. So erhält man z.B. mit {{{#!vorlage Befehl gio info -a time ORT gio info -a metadata ORT }}} den Zeitstempel und die metadata-Informationen. Attribut "trusted" setzen: Ein Benutzer hat nun z.B. einige Skripte erstellt, für diese im Ordner '''~/.Desktop''' Programmstarter erstellt und diese ausführbar gemacht. Doch beim Aufruf bekommt er die Meldung, diese seien nicht vertrauenswürdig. Nötig ist noch das Dateiattribut `metadata::trustet true`. Mit folgendenm kleinen Skript `trust-desktop.sh` kann er dieses für alle Programmstarter in '''~/.Desktop''' setzen: {{{ #!/bin/bash # trust-desktop.sh # alle Programmstarter in .Desktop auf "vertrauenswürdig" setzen: # for i in ~/.Desktop/*.desktop; do [ -f "${i}" ] || continue gio set "${i}" "metadata::trusted" true done }}} Dieses muss nur noch mit {{{#!vorlage Befehl sudo chmod +x trust-desktop.sh }}} ausführbar gemacht werden Ikon für Ordnersymbol: Der Benutzer Tim möchte den Ordner '''/home/Tim/Photos/Eva''', der Bilder von seiner Freundin enthält, mit einem netten Icon verzieren. Ein solches ist z.B. '''/home/Tim/Icons/Eva.png'''. Dies geschieht nun so: {{{#!vorlage Befehl gio set -t 'string' /home/Tim/Photos/Eva 'metadata::custom-icon' 'file:///home/Tim/Icons/Eva.png' }}} == Probleme und Lösungen == === gio list \smb://SERVER funktioniert nicht === Mittels `gio list smb://SERVER` erhält man eine Liste aller auf dem mittels `gio mount smb://SERVER` eingehängten Server vorhandenen Freigaben. Dies funktioniert allerdings nur dann, wenn auf dem Server das Protokoll SMBv1 verfügbar ist. Bei neueren Servern (Windows 10, Ubuntu ab Version 20.04 LTS) ist aber SMBv1 standardmäßig deaktiviert. Man kann dies auf dem Server wieder aktivieren – in Ubuntu z.B. durch den Eintrag der Zeile {{{server min protocol = NT1}}} im Abschnitt `[global]` der Datei [:smb.conf:/etc/samba/smb.conf], muss sich aber dabei bewusst sein, dass dies die Sicherheit des Netzwerks beeinträchtigen kann. Kann oder möchte man den Eintrag auf dem Server nicht vornehmen, so kann man auf dem Client statt `gio list` auch das Kommandozeilen-Tool [:smbclient:] verwenden (s.o.). Mit diesem erhält man auch ohne SMBv1 eine Freigaben-Liste des Servers. Hierzu braucht dieser nicht einmal eingehängt zu sein. === gvfs-metadata braucht zu viel Ressourcen === In seltenen Fällen kommt es vor, dass der Service ''gvfs-metadata'' ungewöhnlich viel Prozessorleistung und Speicherplatz beansprucht. Dann kann es sein, dass sich ein fehlerhafter Prozess in einer Dauerschleife verfangen hat und dass sich dabei bis zum Timeout (oder Absturz) erhebliche Mengen von Datenschrott im Ordner '''~/.local/share/gvfs-metadata''' angesammelt haben, die diesen unbrauchbar machen und so die weitere Ausführung von GVfs/GIO behindern. Da der Inhalt dieses Ordners nur sehr selten wirklich gebraucht wird, kann man in einem solchen Fall den Ordner – nötigenfalls von der Konsole aus – mit folgender Befehlszeile einfach löschen: {{{#!vorlage Befehl rm -rf ~/.local/share/gvfs-metadata }}} Bei Bedarf wird dann automatisch ein neuer, leerer Ordner angelegt. = Links = == Intern == * [:mount:]: Systemweites Einbinden von Dateisystemen * [:gio mount:]: Einbinden mittels gio/GVfs im Benutzerbereich ("Userspace") * [:Dateimanager:]: Eine Übersicht über die wichtigsten Dateimanager und ihre Funktionen == Extern == * [https://developer.gnome.org/gio/stable/gio.html Dokumentation] {en} zum gio Kommandozeilenprogramm bei gnome.org * [https://wiki.gnome.org/Projects/gvfs/schemes Liste der unterstützen Protokolle] {en} von GFV #tag: System, Shell, Netzwerk, GVfs