想要卸载内核模块fuse,发现其引用计数为3,无法卸载:
$ lsmod | grep fuse
fuse 233472 3
查看使用fuse的挂载点:
$ mount | grep fuse
fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime)
portal on /run/user/42/doc type fuse.portal (rw,nosuid,nodev,relatime,user_id=42,group_id=42)
有两个,将其卸载:
$ sudo umount /run/user/42/doc
$ sudo umount /sys/fs/fuse/connections
发现其应用计数还有1。怀疑是其它namespace仍然有mount。
果然有:
$ grep "fuse" /proc/*/mounts
/proc/890/mounts:fusectl /sys/fs/fuse/connections fusectl rw,nosuid,nodev,noexec,relatime 0 0
/proc/892/mounts:fusectl /sys/fs/fuse/connections fusectl ro,nosuid,nodev,noexec,relatime 0 0
/proc/894/mounts:fusectl /sys/fs/fuse/connections fusectl ro,nosuid,nodev,noexec,relatime 0 0
这个时候可以用nsenter进入到对应pid的进namespace,执行卸载:
$ sudo nsenter -a -t 890 umount /sys/fs/fuse/connections
nsenter [options] [program [arguments]]
-a,Enter all namespaces of the target process by the default /proc/[pid]/ns/* namespace paths
-t PID, Specify a target process to get contexts from.
$ sudo grep "fuse" /proc/*/mounts
/proc/892/mounts:fusectl /sys/fs/fuse/connections fusectl ro,nosuid,nodev,noexec,relatime 0 0
/proc/894/mounts:fusectl /sys/fs/fuse/connections fusectl ro,nosuid,nodev,noexec,relatime 0 0
可以看到卸载了一个