原力注入

Linux FUSE 文件系统的相关一些管理操作

书接上文(Linux 用户态文件系统 FUSE 简介),大家学习完 FUSE 文件系统后,实操中可能会遇到一些问题,笔者(博主)整理了与 FUSE 文件系统相关的一些管理操作,供大家参考。

FAQ

问题一:为什么我通过 lsmod 看不到 fuse 内核模块?

lsmod | grep -i fuse
# 输出为空

如果系统中 FUSE 文件系统正常工作,但 lsmod | grep -i fuse 输出为空,说明 FUSE 模块未作为可加载内核模块,而是直接编译进了内核。

FUSE 支持两种方式加载到内核中:

  1. 1. 可加载内核模块 (lsmod 可见):FUSE 作为一个独立的内核模块,可以按需加载和卸载(modprobe fuse / rmmod fuse);

  2. 2. 内核内置支持 (lsmod 不可见):FUSE 直接内置到内核镜像中,在系统启动时自动加载,lsmod 无法显示。

可以通过以下方法验证:

方法 1:检查 ``/proc/kallsyms` 中的符号

cat /proc/kallsyms | grep fuse
ffffffffa5efcf10 T fuse_len_args
ffffffffa5efcf50 T fuse_get_unique
ffffffffa5efd0b0 T fuse_dequeue_forget
ffffffffa5efd150 t fuse_dev_open
ffffffffa5efd1d0 t fuse_retrieve_end
ffffffffa5efd200 t fuse_dev_fasync
ffffffffa5efd240 t fuse_dev_ioctl
...

如果输出中有 fuse_init、fuse_conn_init 等符号,说明 FUSE 已经被内置到内核中。

方法 2:检查内核配置

可以查看当前内核的配置来验证 FUSE 是作为模块还是内置功能:

zgrep CONFIG_FUSE_FS /boot/config-$(uname -r)
CONFIG_FUSE_FS=y

可能的输出:1. 内置支持

CONFIG_FUSE_FS=y

y 表示 FUSE 已经被编译进内核,因此不会出现在 lsmod 列表中。

2. 模块支持

CONFIG_FUSE_FS=m

m 表示 FUSE 是作为模块编译的,应出现在 lsmod 中。

问题二:/dev/fuse 是什么设备?

/dev/fuse 是 FUSE(Filesystem in Userspace) 的 字符设备文件,为用户态文件系统提供了与内核态交互的接口。

/dev/fuse 的属性:

ls -l /dev/fuse
crw-rw-rw- 1 root root 10, 229 Nov 28 15:24 /dev/fuse
属性说明
c字符设备文件(Character Device),支持按字节流操作。
rw-rw-rw-设备文件的权限:读写权限(rw)对所有用户开放。
1硬链接数量为 1。
root root文件的拥有者和所属组均为 root。
10, 229设备的 主设备号(Major Number)为 10,次设备号(Minor Number)为 229。

/dev/fuse 的作用:

1. 用户态进程与内核的通信接口:用户态进程通过 /dev/fuse 与 FUSE 内核模块通信。用户态进程使用 read() 和 write() 操作访问 /dev/fuse,实现文件系统请求的传递和响应。

2. 挂载用户态文件系统:在挂载 FUSE 文件系统(如 SSHFS)时,需要使用 /dev/fuse 进行通信。

常见运维操作 - 监控与管理

查看 fusectl 挂载

FUSE 控制文件系统(FUSE Control File System) 已挂载到 /sys/fs/fuse/connections,用于管理和监控 FUSE 的用户态文件系统连接。

mount | grep fusectl
fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime)

挂载选项含义

  • • rw:以 读写 模式挂载。用户和系统可以读写 /sys/fs/fuse/connections 目录中的文件。

  • • nosuid:禁止在此挂载点下执行 SUID/SGID 程序,防止提升权限。

  • • nodev:禁止在此挂载点下创建或访问 设备文件,增强安全性。

  • • noexec:禁止在此挂载点下 执行二进制文件,进一步提升安全性。

  • • relatime:仅在文件内容被访问时更新访问时间(atime),比 strictatime 提高性能,同时比 noatime 保留更多访问时间信息。

查看 FUSE 连接

FUSE 控制文件系统提供了当前所有活动 FUSE 连接的状态,可以通过 /sys/fs/fuse/connections/ 目录查看。

ls /sys/fs/fuse/connections/

每个连接 ID 代表一个活动的 FUSE 文件系统连接。

查看特定 FUSE 连接的详细信息

查看链接 60 的详细信息

ls -l /sys/fs/fuse/connections/60/
total 0
--w------- 1 root root 0 Nov 28 15:27 abort
-rw------- 1 root root 0 Nov 28 15:27 congestion_threshold
-rw------- 1 root root 0 Nov 28 15:27 max_background
-r-------- 1 root root 0 Nov 28 15:27 waiting

 cat /sys/fs/fuse/connections/60/max_background    # 最大后台请求数
cat /sys/fs/fuse/connections/60/waiting           # 当前挂起请求数
cat /sys/fs/fuse/connections/60/congestion_threshold # 拥塞阈值

终止 FUSE 连接

如果某个 FUSE 文件系统卡死或无法正常响应,可以通过以下命令中止连接:

echo 1 | sudo tee /sys/fs/fuse/connections/60/abort

调试与排查故障

检查文件系统状态

如果出现挂载失败或文件系统无法访问的情况,可以检查以下信息:• dmesg 输出:查看内核日志中的 FUSE 相关信息。

dmesg | grep -i fuse
[   18.494597] fuse: init (API version 7.34)
[   24.977929] systemd[1]: Starting Load Kernel Module fuse...
[   25.005489] systemd[1]: [email protected]: Deactivated successfully.
[   25.006519] systemd[1]: Finished Load Kernel Module fuse.
[   25.021635] systemd[1]: Mounting FUSE Control File System...
[   25.040742] systemd[1]: Mounted FUSE Control File System.

排查挂载卡死

如果 FUSE 文件系统挂载后无法访问,可能是用户态进程未能及时响应,可以:

  • • 检查 waiting 文件中是否有大量等待的请求:

cat /sys/fs/fuse/connections/60/waiting
  • • 如果挂载点卡死,可以尝试强制卸载:

sudo umount -l ~/remote_mount

性能调优

调整最大后台请求数

提高 FUSE 文件系统的并发能力,减少请求等待时间。

echo 100 | sudo tee /sys/fs/fuse/connections/60/max_background

调整拥塞阈值

如果系统频繁报拥塞警告,可以增大拥塞阈值:

echo 200 | sudo tee /sys/fs/fuse/connections/60/congestion_threshold