gvfs
gvfs 介绍
gvfs 是 GNOME 用户空间虚拟文件系统的缩写,从 GLib 2.15.1 开始加入系统,主要是对 I/O 的一层抽象。gvfs 提供了一些模块,这些模块由使用 libgio 的 API 应用程序自动使用。也通过 fuse,允许不适用 gio 的应用程序可以访问 gvfs 文件系统。
访问虚拟文件系统的前提是挂载文件系统,gvfs 提供了一个守护进程——gvfsd
来协调处理模块,每个模块都与 gvfsd
通过 gio 进行通信信。gvfs带有一些后端,这些后端实现了回收站、sftp、ftp、webdav、以及本地数据相关支持,都是作为 gvfs 功能实现的一部分。
gvfs 还包括用于 gio 实现卷监视器。
gvfs守护进程说明
守护进程 | 功能 |
---|---|
gvfsd |
是gvfs主要守护程序。它通过org.gtk.vfs.Daemon 名连接到dbus会话总线上,当gvfsd没有启动时候,可以通过gio客户端自动拉起gvfsd守护进程。gvfsd主要任务是充当模块的安装器和跟踪器。 在需要的时候,它会产生新的后端,并跟踪它们的生命周期,维护已挂载的列表并创建与它们的直接连接。 gvfsd还将启动gvfsd-fuse 并向其提供应在其中安装 fuse 文件系统的安装点 |
gvfsd-fuse |
gvfsd-fuse 维护FUSE(用户空间的文件系统)挂载,以使gvfs后端可用于 POSIX 应用程序。fuse文件系统的挂载点由 [PATH] 参数提供。其主要由 gvfsd 启动 |
gvfsd-metadata |
gvfsd-metadata 是一个守护进程,充当内部 gvfs 元数据存储的写入序列化程序。它是在 gio 客户端更改元数据时候自动启动。读取操作直接由客户端 gio 完成,并不需要运行守护程序 |
gvfs-goa-volume-monitor |
支持 GNOME 在线账户 |
gvfs-gphoto2-volume-monitor |
支持图片传输协议,如:gPhoto |
gvfs-mtp-volume-monitor |
支持媒体传输协议 |
gvfs-udisks2-volume-monitor |
gvfs-udisks2-volume-monitor负责磁盘、介质、挂载和fstab桌面用户界面中显示的项目。特别的是gnome-shell以及使用 GLib API 的任何其它应用程序都在使用此过程中的信息。 请注意:不要把它与udisks软件包中的udisksd和udisksctl混淆 |
gvfs-afc-volume-monitor |
苹果文件系统 |
gvfsd-afc |
挂载IPhone/Ipod touch音量 |
gvfsd-afp |
苹果文件协议卷 |
gvfsd-afp-browse |
浏览apple归档协议卷 |
gvfsd-archive |
挂载各种格式的归档文件 |
gvfsd-burn |
提供刻录 CD 的位置 |
gvfsd-cdda |
挂载音频 CD |
gvfsd-computer |
提供计算机 computer:/// 支持 |
gvfsd-dav |
挂载 DAV 文件系统 |
gvfsd-dnssd |
浏览域名解析 |
gvfsd-ftp |
挂载 FTP 文件系统 |
gvfsd-gphoto2 |
通过PTP挂载,这意味着gvfs通过libgphoto2通过 VFS 将相机上的照片显示给GNOME程序 |
gvfsd-http |
通过 HTTP 挂载 |
gvfsd-localtest |
测试后端 |
gvfsd-mtp |
通过 mtp 挂载 |
gvfsd-network |
提供 network:/// 支持 |
gvfsd-nfs |
提供 nfs 协议支持 |
gvfsd-recent |
提供最近访问支持 |
gvfsd-sftp |
提供sftp支持 |
gvfsd-smb |
提供samba支持 |
gvfsd-smb-browse |
浏览windows共享文件系统的卷 |
gvfsd-trash |
提供回收站支持 |
gvfsd
gvfsd 代码模块功能梳理
gvfsd 依赖文件及库分析
|
|
gvfsd 代码梳理
- 解析命令行,是否使用 fuse、是否debug、是否仅仅打印版本信息 …
- 创建gvfs daemon
g_vfs_daemon_new (TRUE, <replace>)
gvfs_get_socket_dir()
创建文件夹- 监听
daemon
的shutdown
信号 - session dbus总线上注册,名字为:
org.gtk.vfs.Daemon
- 如果需要 fuse 支持则启动
gvfsd-fuse
进程 - session 上 dbus 注册成功就会调用
gboolean mount_init()
- gvfsd 结束执行
mount_finalize()
g_vfs_daemon_new (TRUE, <replace>)
g_vfs_daemon_new ()
声明与定义位于daemon/gvfsdaemon.[hc]
文件里
- 创建线程:
g_thread_pool_new()
- 初始化互斥锁:
g_mutex_init()
- 挂载数量初始化0、jobs初始化NULL、registered_paths(hash)、client_connections(hash)、session dbus的conn
g_dbus_auth_observer_new()
allow-mechanism
authorize-authenticated-peer
gvfs_dbus_daemon_skeleton_new()
handle-get-connection
handle-cancel
handle-list-monitor-implementations
gvfs_dbus_mountable_skeleton_new()
handle-mount
gboolean mount_init ()
gboolean mount_init ()
声明与定义在daemon/mount.[hc]
文件里
read_mountable_config ()
- 获取环境变量
GVFS_MOUNTABLE_EXTENSION
(默认是.mount
文件)、GVFS_MOUNTABLE_DIR
- 读取
GVFS_MOUNTABLE_DIR
文件名需要有.mount
后缀,文件夹是:/usr/share/gvfs/mounts/
/sys/fs/cgroup/解析xxx.mount
并保存到链表mountables
全局变量
- 获取环境变量
- 创建管道
pipe(reload_pipes)
(其中reload_pipes
是全局的static int reload_pipes[2];
)- 监控管道,当管道有数据读入就会重新执行第一步流程
read_mountable_config ()
- 监控管道,当管道有数据读入就会重新执行第一步流程
- 获取SESSION bus 的实例
conn = g_bus_get_sync(SESSION, NULL, NULL)
mount_tracker = gvfs_dbus_mount_tracker_skeleton_new ()
并分别监听信号(这些信号分别对应相应dbus功能)handle-register-fuse
handle-register-mount
handle-mount-location
handle-lookup-mount
handle-lookup-mount-by-fuse-path
handle-list-mounts
handle-list-mounts2
handle-list-mountable-info
handle-list-mount-types
handle-unregister-mount
g_dbus_interface_skeleton_export(mount_tracker,conn,G_VFS_DBUS_MOUNTTRACKER_PATH,NULL)
G_VFS_DBUS_MOUNTTRACKER_PATH
是/org/gtk/vfs/mounttracker
通过d-feet查看,此dbus提供了一系列接口,主要功能包括:支持的挂载类型、挂载信息、挂载点、通过 fuse 挂载的位置;同时也提供了挂载和卸载信号
gvfs_dbus_mount_tracker_skeleton_new()
一系列dbus对应的操作及一些接口声明
udisks2
gvfs-udisks2-monitor 进程负责磁盘、media、挂载点和fstab在桌面环境挂载、访问。尤其是 gnome-shell 和文件管理器程序 (nautilus)以及其它使用 GLib 的 API 程序。 通常,只会显示可挂载文件系统的测盘或媒体,这些媒体在下边统称为 “设备”。
如果设备挂载点在 /media/
、$HOME
、/run/media/$USER
之外的文件夹,那么设备可能不会显示在用户界面。或者如果设备挂载点在 /media/
、$HOME
、/run/media/$USER
这些目录之下,但是挂载点是以 .
开头的,那么也不会显示。这需要使用使用挂载选项 x-gvfs-show
来强制显示,当然 x-gvfs-hide
也可以使挂载点隐藏。
设备的名称、图标、符号图标是根据某些特征选择的,比如:设备的文件系统标签、x-gvfs-name=<value>
、x-gvfs-icon=<value>
和 x-gvfs-symbolic-icon=<value>
在 /etc/fstab
添加自动挂载点时候,建议用户使用 /dev/disk
层次结构中稳定的符号连接,而不是内核名称 sda
、sdb
等
热插拔
通过 eSATA
或 USB
连接的设备在物理机器上是可热插拔的。当物理设备连接到机器上或从机器上移除时候 linux内核
会把通知事件发送到用户空间,系统接受到此类事件并根据其配置对它们进行响应
- 设备驱动加载后会在 devfs (/dev) 下生成对应的设备节点,如果设备连接后 systemd-udevd 会根据配置对 /dev/ 下的设备节点进行增加
- 如果是块设备,systemd-udevd 通知 udisksd 和 gvfsd 以及 gvfs-udisks2-volume-monitor
一些 fstab 例子
强制在用户界面隐藏设备
|
|
强制在用户界面显示设备(显示名字为 ‘My Movies’)
|
|
自定义设备图标
|
|
强制在用户空间显示 NFS 挂载点
|
|
一些udev例子
不自动挂载金士顿U盘
|
|
自动挂载某设备但是不要求admin权限
|
|
给特殊设备特殊名字和图标
|
|
确保此特殊设备不出现在用户界面
|
|