是否可以对目录的硬链接(inode)进行符号链接? (挂载到该目录顶部后会指向相同的物理位置?)

是否可以对目录的硬链接(inode)进行符号链接? (挂载到该目录顶部后会指向相同的物理位置?)

前一段时间,我希望能够访问一个目录中的文件,该目录被后来的mount点所掩盖。我记得在 SE 上发现了几个 QA 给出了答案,但我记得我尝试过的没有一个有效。也许他们在早期的 Linux 内核上工作,我不知道。我现在尝试使用具有最新内核之一的发行版(现在是 5.x)。

如果确实有一种方法使用“标准”工具来访问被挂载遮盖的目录树部分,请写为答案。

我想到了一些解决方法。

  1. 也许有一个工具可以使软链接到目录的硬链接(inode)? AFAIK 标准ln不能做到这一点,ln -s(AFAIK 并通过尝试和错误)创建到文件树中某个位置的链接,而不是 inode。如果该位置指向的位置发生更改(通过顶部挂载),则该符号链接将指向一个新位置,而不是前一个位置。

添加是为了回应 @terdon 的评论:
从用户的角度(至少是我的阅读者man ln等)来看,符号链接是操作系统(包括系统实用程序)与索引节点(硬链接)区别的一种链接类型。这是一个find不会循环遍历的链接。

  1. 通过半手动读取物理 inode 数据dd(在挂载之前),然后将其应用于稍后的另一个(基本上是硬链接)。怎么做?

  2. 启用到内核中文件夹的硬链接(我计划很少将它用于特殊任务,我知道针对它的循环推理,但据我所知,许多 Unix 都有它并起作用)。怎么做?

PS可能更好地将问题分成几个......

补充2、ln -s测试:

$ echo 123 > 1/1/te.xt
$ ln -s 1/1 2
$ ls 2
te.xt
$ sudo mount -o loop /path/ubuntu-20.04.3-desktop-amd64.iso 1
$ ls 2 # 2 is displayed as broken link in GUI
2

添加了 3 个,尝试mount --bind访问底层挂载点路径上的内容- 失败的

$ mount --bind 1 2
$ ls 2
1
$ sudo mount -o loop /path/ubuntu-20.04.3-desktop-amd64.iso 1
$ ls 2
boot  casper  dists  EFI  install  isolinux  md5sum.txt  pool  preseed  ubuntu

添加 4:绑定挂载到上一级 - 以同样的方式失败(顺便说一句,它是 tmpfs 系统,也许它可以在 ext4 上工作?尚未找到有关您建议--bind在 中阅读的内容的解释man mount)。

补充5:
发现mount --bind需要在overshadowingmount命令后执行。

答案1

您不能对目录建立硬链接,因为这可能会导致目录树中的循环,而且无论如何,..目录中的条目不会是唯一的。由于您无法创建到目录的硬链接,因此您也无法创建到目录硬链接的软链接。

除非你文件系统本身的二进制补丁,在这种情况下,您可以像这样或以其他方式打破它。至少fsck会对你发出嘎嘎声,而且不知道文件系统驱动程序是否也会呕吐。

如果您在 中有一些数据/foo,并且需要保持该数据可用,同时在 上挂载其他内容/foo,最简单的方法是重命名/foo/bar,创建一个新的空目录/foo,然后在该新目录上挂载其他文件系统/foo

在Linux 上,您可以使用绑定挂载执行一些操作,例如在 上挂载某些内容后/foo,您可以将整个原始文件绑定挂载//bar,以便原始文件/foo显示在 中/bar/foo。但其余的/也将在那里可见,因此您将拥有/bar/bin/bar/etc、等等。

# mkdir /foo /bar
# touch /foo/file-in-root-fs.txt
# mount -t tmpfs tmpfs /foo
# mount --bind / /bar
# ls -l /bar/foo
total 0
-rw-r--r-- 1 root root 0 Dec  1 14:36 file-in-root-fs.txt

我尝试看看是否可以仅将一个目录绑定安装在新安装下,但没有找到一种方法来做到这一点。

/foo首先绑定安装/bar,然后安装的直接尝试/foo似乎也将新安装复制到这两个位置。 (尽管这是在旧内核上。)

# mount --bind /foo /bar
# mount -t tmpfs tmpfs /foo
# ls -ldi /foo /bar
46378188 drwxrwxrwt 2 root root 40 Dec  1 14:37 /bar/
46378188 drwxrwxrwt 2 root root 40 Dec  1 14:37 /foo/

相关内容