前一段时间,我希望能够访问一个目录中的文件,该目录被后来的mount
点所掩盖。我记得在 SE 上发现了几个 QA 给出了答案,但我记得我尝试过的没有一个有效。也许他们在早期的 Linux 内核上工作,我不知道。我现在尝试使用具有最新内核之一的发行版(现在是 5.x)。
如果确实有一种方法使用“标准”工具来访问被挂载遮盖的目录树部分,请写为答案。
我想到了一些解决方法。
- 也许有一个工具可以使软链接到目录的硬链接(inode)? AFAIK 标准
ln
不能做到这一点,ln -s
(AFAIK 并通过尝试和错误)创建到文件树中某个位置的链接,而不是 inode。如果该位置指向的位置发生更改(通过顶部挂载),则该符号链接将指向一个新位置,而不是前一个位置。
添加是为了回应 @terdon 的评论:
从用户的角度(至少是我的阅读者man ln
等)来看,符号链接是操作系统(包括系统实用程序)与索引节点(硬链接)区别的一种链接类型。这是一个find
不会循环遍历的链接。
通过半手动读取物理 inode 数据
dd
(在挂载之前),然后将其应用于稍后的另一个(基本上是硬链接)。怎么做?启用到内核中文件夹的硬链接(我计划很少将它用于特殊任务,我知道针对它的循环推理,但据我所知,许多 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/