文件系统用户空间 - 覆盖软链接

Posted

技术标签:

【中文标题】文件系统用户空间 - 覆盖软链接【英文标题】:File system userspace - overwrite a soft link 【发布时间】:2022-01-05 16:43:16 【问题描述】:

我正在用户空间 (FUSE) 中编写文件系统并尝试覆盖软链接。

例如,这是熔断器结构:

/dir   --   file_a
       --   file_b
       --   link_a -> /points/to/some/file
       --   link_b -> /points/to/some/file

当我尝试使用 ln 命令更改链接时:

ln -fs /new/file/to/point /dir/link_a

我的符号链接实现得到一个随机文件名:

int my_symlink(const char * lnk, const char * pth)

  print("SYMLINK %s\n%s\n", pth, lnk);
  return 0;

SYMLINK /dir/CuOG78dJ
/new/file/to/point

“CuOG78dJ”部分总是不同的。

我认为为了删除/覆盖现有文件,fuse 在 symlink 之前调用了其他一些函数,所以我实现了 unlink、rename、ioctl、mknod、truncate、chmod、chown 和 open,但这些都没有被调用在符号链接之前。

更新

我在我的 readlink 和 getattr 实现中添加了一个打印功能,我正在使用调试选项安装文件系统,结果如下:

使用ln函数时的打印输出:

GETATTR /dir
GETATTR /dir/link_a
READLINK /dir/link_a, buf: /points/to/some/file
GETATTR /dir/link_a
GETATTR /dir/CuFSXC22
SYMLINK /dir/CuFSXC22 /new/file/to/point
GETATTR /dir/CuFSXC22

readlink函数返回当前路径,即/points/to/some/file,getattr函数做的是:

  st->st_uid = getuid();
  st->st_gid = getgid();
  st->st_atime = time( NULL );
  st->st_mtime = time( NULL );
  st->st_mode = S_IFLNK | 0777;
  st->st_nlink = 1;
  st->st_size = 1024;

这是我使用ln 命令时的文件系统调试输出:

unique: 5, opcode: LOOKUP (1), nodeid: 1, insize: 52, pid: 24832
LOOKUP /dir
getattr /dir
   NODEID: 2
   unique: 5, success, outsize: 144
unique: 6, opcode: LOOKUP (1), nodeid: 2, insize: 53, pid: 24832
LOOKUP /dir/link_a
getattr /dir/link_a
   NODEID: 3
   unique: 6, success, outsize: 144
unique: 7, opcode: READLINK (5), nodeid: 3, insize: 40, pid: 24832
readlink /dir/link_a 4097
   unique: 7, success, outsize: 25
unique: 8, opcode: GETATTR (3), nodeid: 3, insize: 56, pid: 24832
getattr /dir/link_a
   unique: 8, success, outsize: 120
unique: 9, opcode: LOOKUP (1), nodeid: 2, insize: 49, pid: 24832
LOOKUP /dir/Cuysnat0
getattr /dir/Cuysnat0
   unique: 9, error: -2 (No such file or directory), outsize: 16
unique: 10, opcode: SYMLINK (6), nodeid: 2, insize: 131, pid: 24832
symlink /new/file/to/point /dir/Cuysnat0
getattr /dir/Cuysnat0
   unique: 10, error: -2 (No such file or directory), outsize: 16

也许有人可以提供帮助? 谢谢

【问题讨论】:

你实现readlink了吗? @OrenKishon 感谢您的回复,我更新了帖子。 最后一行是怀疑。最后getattr 认为新的(临时)链接不存在。您是否配置了任何 mount.fuse *_timeout= 选项?直接嫌疑人:negative_timeout=T 我没有使用 mount.fuse 挂载文件系统,也没有使用超时选项。 【参考方案1】:

似乎当我尝试覆盖符号链接时,ln 创建了一个随机符号链接,指向所需文件,然后重命名符号链接。

为了让它发挥作用,我必须:

保存随机符号链接。 实现重命名 FUSE 操作。

【讨论】:

创建临时文件的不是fuse,而是ln。关注strace ln -fs ARGS...你会看到 好的,我会编辑我的答案,谢谢! 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于文件系统用户空间 - 覆盖软链接的主要内容,如果未能解决你的问题,请参考以下文章

Linux下创建和删除软硬链接 可临时处理空间不足

:文件管理 -- 文件存储空间管理操作系统应该向上提供哪些功能?(文件的基本操作)文件共享(软(快捷方式) / 硬链接)文件保护

ln -s 软链接应用-磁盘空间不够用的解决方案

Linux系统下磁盘配额软RAID及LVM的配置与管理

文件系统之磁盘配额

Linux文件系统命令 ln