gvfsd Demasiados ficheros abiertos

GVFS1​ es el reemplazo​ de GNOME VFS, el sistema virtual de archivos de GNOME. GVFS soporta, opcionalmente, sistemas de archivos virtuales montados a través de sistemas de archivos en espacio de usuario. Si se listan los puntos de montaje del sistema activos se puede ver gvfs configurado para el usuario.

gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

GVFS consta de dos partes: una biblioteca compartida que cargan las aplicaciones que soportan GIO y GVFS en sí, y una colección de demonios que se comunican entre ellos y con el módulo de GIO sobre D-Bus. Esto mueve los sistemas de archivos virtuales fuera de los procesos cliente.

Directorios y archivos relacionados.

El usuario root no tiene permisos para leer los directorios virtuales del usuario o incluso consultar el estado del servicio. Pero es una simple cuestión técnica, desde root se puede saltar al usuario dueño de esos directorios.

root# systemctl --user status gvfs-daemon
Failed to connect to bus: Operación no permitida

Ejemplo de procesos gvfsd del usuario en escritorios GTK.

/usr/lib/gvfs-udisks2-volume-monitor
/usr/lib/gvfsd-metadata
/usr/lib/gvfsd
/usr/lib/gvfsd-fuse /run/user/1000/gvfs -f
/usr/lib/gvfsd-trash --spawner :1.96 /org/gtk/gvfs/exec_spaw/0
/usr/lib/gvfsd-network --spawner :1.96 /org/gtk/gvfs/exec_spaw/1
/usr/lib/gvfsd-dnssd --spawner :1.96 /org/gtk/gvfs/exec_spaw/2

Los procesos gvfs que se muestran con ps son administrados por D-Bus, por lo que si los matamos, volverán a aparecer en cuanto Gnome lo requiera. Si por ejemplo ejecutamos el cliente de torrent Deluge, aparecerá un proceso gvfsd-network activo.

Al ser un servicio de usuario, este debe ser administrado desde el usuario, por lo tanto la opción “--user” es necesaria.

systemctl --user status gvfs-daemon
● gvfs-daemon.service - Virtual filesystem service
     Loaded: loaded (/usr/lib/systemd/user/gvfs-daemon.service; static)
     Active: active (running) since Sat 2020-12-12 22:18:31 CET; 2h 49min ago
   Main PID: 14160 (gvfsd)
     CGroup: /user.slice/user-1000.slice/user@1000.service/gvfs-daemon.service
             ├─14160 /usr/lib/gvfsd
             ├─14165 /usr/lib/gvfsd-fuse /run/user/1000/gvfs -f
             ├─14247 /usr/lib/gvfsd-trash --spawner :1.118 /org/gtk/gvfs/exec_spaw/0
             ├─14256 /usr/lib/gvfsd-network --spawner :1.118 /org/gtk/gvfs/exec_spaw/1
             └─14261 /usr/lib/gvfsd-dnssd --spawner :1.118 /org/gtk/gvfs/exec_spaw/2

gvfsd y aviso de limites de ficheros abiertos superados en journalctl

Eliminar logs del journal relacionados con limites de ficheros archivos abiertos por parte de gvfsd puede ser una tarea casi obligatoria si se quieren tener unos registros journal limpios. Este sería un ejemplo de logs cuando alguna aplicación GTK está haciendo un uso algo intensivo de la red. En otros entornos diferentes procesos relacionado con gvfsd podrían también generar este tipo de logs.

Dec 12 21:58:43 archlinux gvfsd[13267]: daemon: Error creating server at address unix:abstract=/dbus-vfs-daemon/socket-XobUEwA2: No se pudo crear el socket: Demasiados ficheros abiertos

Si analizamos los límites de dichos procesos vemos que son 1024 (soft) y 1048576 (hard).

systemctl --user show gvfs-daemon.service | grep NOFILE
LimitNOFILE=1048576
LimitNOFILESoft=1024
# Otro metodo usando /proc/
cat /proc/{14160,14165,14247,14256,14261}/limits | grep -i open                                
Max open files            1024                 1048576              files
Max open files            1024                 1048576              files
Max open files            1024                 1048576              files
Max open files            1024                 1048576              files
Max open files            1024                 1048576              files

Aumentar el limite de ficheros abiertos para un demonio en systemd requiere la directiva LimitNOFILE en el fichero /usr/lib/systemd/user/gvfs-daemon.service.

[Unit]
Description=Virtual filesystem service
 
[Service]
ExecStart=/usr/lib/gvfsd
Type=dbus
BusName=org.gtk.vfs.Daemon
# Agregado para evitar que Deluge muestre errores en journal.
LimitNOFILE=65536:1048576
systemctl --user daemon-reload
systemctl--user restart gvfs-daemon
systemctl --user show gvfs-daemon.service | grep NOFILE
LimitNOFILE=1048576
LimitNOFILESoft=65536

Enlace de interés: configurar_limite_de_ficheros_abiertos