在FreeBSD中,man mount_nullfs指出:
文件系统的虚拟副本与符号链接之间的主要区别是,getcwd(3)函数在虚拟副本中正确工作,其他文件系统可以安装在虚拟副本上,而不影响原始副本。
stat(2)返回虚拟副本的不同设备号,但在其他方面,它与原始副本无法区分。
这一段的全部含义/含义是什么?
发布于 2018-02-26 08:23:34
文件系统的虚拟副本与符号链接之间的主要区别是,
getcwd(3)函数在虚拟副本中正确工作,
getcwd的带有符号链接目录的S行为是一个众所周知的问题,例如在高级Unix编程中有记录(参见这个问题 ):当涉及到符号链接时,chdir和getcwd并不对称。人们可能会认为,使用chdir将目录更改为给定目录,然后使用getcwd检索当前目录将返回相同的值;但当进程使用包含符号链接的路径更改目录时,情况并非如此-- getcwd返回在取消引用所有符号链接(S)后获得的路径。当将目录更改为父目录时,当包含符号链接的路径(S)和非引用路径有不同数量的组件时,这可能会产生意想不到的后果。
并且其他文件系统可以在不影响原始文件的情况下安装在虚拟副本上。
继续Stéphane的示例,您可以在/tmp/b的子目录上安装另一个文件系统,而不会影响/some/dir,而在/tmp/a的子目录上安装一个文件系统也会使它出现在/some/dir下。
stat(2)返回虚拟副本的不同设备号,但在其他方面,它与原始副本无法区分。
这意味着在副本上或其中任何文件上运行stat将返回与原始文件不同的设备编号,但这是唯一的区别;除此之外,stat("/tmp/b/c", &buf)和stat("/some/dir/c", &buf)将返回相同的信息。
发布于 2018-02-26 08:11:42
我认为它们的意思是,如果/tmp/a是/some/dir的符号链接,而/tmp/b是/some/dir的nullfs装载,
chdir("/tmp/a")之后,getcwd()返回/some/dir。chdir("/tmp/b")之后,getcwd()返回/tmp/b。前者并不是不正确的。只是符号链接和nullfs挂载有两个不同的语义。
符号链接是指向大多数系统调用(包括chdir())遵循的另一个文件的指针,而nullfs挂载使整个目录树在不同的路径下可用(与Linux类似的绑定安装特性或其他系统中的目录硬链接相反,那里的文件看起来是不同的文件)。
符号链接处理可以打破一些人的期望(比如这里的getcwd() ),但是nullfs挂载(或者Linux上的bindfs融合文件系统或一些联合文件系统)可以打破其他人的期望,比如[ /tmp/b/x -ef /some/dir/x ]会返回假的事实,即使它们在下面是同一个文件,或者即使有通过/some/dir/x路径打开的进程,fuser /tmp/b/x也不能返回任何东西。
Linux绑定挂载(它不会使文件看起来不同)可能会打破其他一些人的期望,比如遍历挂载点的find -xdev/du -x,指向同一个文件的两个链接,链接计数为1(它还允许在文件系统中创建循环;FreeBSD的nullfs防止这种情况)。
硬链接(使文件出现在不同路径下的最古老的技术)也会打破一些用户的期望(比如当您从目录中断开文件链接时,您希望它不再可用)。
所以我不会说一个比这里的更正确。
https://unix.stackexchange.com/questions/426616
复制相似问题