您可以跨文件系统传输/重新创建Unix域套接字文件吗?

i5desfxk  于 2022-11-04  发布在  Unix
关注(0)|答案(1)|浏览(173)

据我所知,unix域套接字是一个文件(有自己的FS inode),它在内部指向一个套接字inode(由内核内部命名)。这一点可以通过检查绑定过程的文件描述符来证明,返回一个值,如socket:[345678]
通常,Unix域套接字可以是同一文件系统中的mv/rm等,因为它们自己的文件索引节点在这种情况下不会改变(因为mv在概念上只是一个硬链接+取消链接)。
但是,如果我想将套接字文件移动到一个新的文件系统中,这样就必须为套接字文件分配一个新的 filesystem inode,我需要用内核中的底层套接字描述符注册这个新的套接字文件。
是否有一种方法可以透明地执行此操作,并且不影响正在运行的绑定服务器进程?
我对用C语言做这个特别感兴趣,但是从概念上理解它也是有帮助的。可能值得一提的是,我假设会涉及到mknod(),在这个例子中这是可以的。我只是不知道如何正确地调用它。

6ju8rftf

6ju8rftf1#

至少在Linux下是这样的。
Unix域套接字端点在内部通过由其st_dev值和st_ino值组成的唯一元组进行标识,如本libfuse票证中所述。
即使在FUSE文件系统下,内核也会强制st_dev始终准确地反映底层文件系统条目的内容。因此,除非内核被打补丁以允许伪造st_dev,或者编辑套接字设备/inode编号,否则这是不可能的--即使是像FUSE这样的文件系统。
此外,从Linux kernel 5.3开始,理论上可以使用SYS_pidfd_getfd将文件描述符从目标进程克隆到当前进程(假设您设置了PTRACE caps),但您会陷入困境,因为在创建了原始绑定后,您无法将套接字重新-bind()到新位置。
很简单,这是不可能的。

相关问题