文件系统用户空间 - 覆盖软 link
File system userspace - overwrite a soft link
我正在用户空间 (FUSE) 中编写文件系统并尝试覆盖软文件系统 link。
例如,这是保险丝结构:
/dir -- file_a
-- file_b
-- link_a -> /points/to/some/file
-- link_b -> /points/to/some/file
当我尝试使用 ln 命令更改 link 时:
ln -fs /new/file/to/point /dir/link_a
我的 symlink 实现得到一个随机文件名:
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”部分总是不同的。
我认为为了delete/overwrite现有文件,fuse在symlink之前调用了一些其他函数,所以我实现了unlink, rename, ioctl, mknod, truncate、chmod、chown 和 open,但其中 none 在 symlink.
之前被调用
更新
我在我的 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
读取link函数returns当前路径,即/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
也许有人可以帮忙?
谢谢
似乎当我尝试覆盖符号链接时,ln
创建了一个随机符号链接,它指向想要的文件,然后重命名该符号链接。
为了让它发挥作用,我必须:
- 保存随机符号链接。
- 实施重命名 FUSE 操作。
我正在用户空间 (FUSE) 中编写文件系统并尝试覆盖软文件系统 link。
例如,这是保险丝结构:
/dir -- file_a
-- file_b
-- link_a -> /points/to/some/file
-- link_b -> /points/to/some/file
当我尝试使用 ln 命令更改 link 时:
ln -fs /new/file/to/point /dir/link_a
我的 symlink 实现得到一个随机文件名:
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”部分总是不同的。
我认为为了delete/overwrite现有文件,fuse在symlink之前调用了一些其他函数,所以我实现了unlink, rename, ioctl, mknod, truncate、chmod、chown 和 open,但其中 none 在 symlink.
之前被调用更新
我在我的 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
读取link函数returns当前路径,即/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
也许有人可以帮忙? 谢谢
似乎当我尝试覆盖符号链接时,ln
创建了一个随机符号链接,它指向想要的文件,然后重命名该符号链接。
为了让它发挥作用,我必须:
- 保存随机符号链接。
- 实施重命名 FUSE 操作。