Linux FUSE 文件系统的相关一些管理操作
书接上文(Linux 用户态文件系统 FUSE 简介),大家学习完 FUSE 文件系统后,实操中可能会遇到一些问题,笔者(博主)整理了与 FUSE 文件系统相关的一些管理操作,供大家参考。
FAQ
问题一:为什么我通过 lsmod 看不到 fuse 内核模块?
lsmod | grep -i fuse
# 输出为空如果系统中 FUSE 文件系统正常工作,但 lsmod | grep -i fuse 输出为空,说明 FUSE 模块未作为可加载内核模块,而是直接编译进了内核。
FUSE 支持两种方式加载到内核中:
1. 可加载内核模块 (
lsmod可见):FUSE作为一个独立的内核模块,可以按需加载和卸载(modprobe fuse/rmmod fuse);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=yy 表示 FUSE 已经被编译进内核,因此不会出现在 lsmod 列表中。
2. 模块支持
CONFIG_FUSE_FS=mm 表示 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