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