在 Linux 中,有没有办法访问已挂载文件系统上的文件,而这些文件在子目录上挂载了另一个文件系统后就被“遮蔽”了?
例如
cd /
mkdir /foo
touch /foo/bar
mount /dev/sda1 /foo
# now, can I still get to /foo/bar on the / filesystem?
我梦想的解决方案不需要提升权限或特定于某个文件系统,但我会采取任何我能得到的残羹剩饭,而不会冒损坏文件系统的风险。
答案1
您可以使用 mount 命令来访问底层文件系统。
$ mkdir /mnt/root
$ sudo mount --bind / /mnt/root
$ cat /mnt/root/foo/bar
这样做不会造成损坏问题,但需要挂载文件系统的权限。
答案2
如果您有 root 权限,您可以mount --move
在临时目录上挂载文件系统,然后将其移回。
mkdir /bar
mount --move /foo /bar
拥有 root 权限还允许直接访问底层块设备(如果有)。对于 ext4,您可以使用它debugfs
来导出文件。
只读可以访问绝不破坏文件系统。
目录可以拥有句柄或文件描述符。“当前目录”也是一个句柄,而不是路径。如果您拥有目录的句柄,即使该位置已被挂载,您也可以访问其中的文件。这不需要特殊权限,只需要特殊准备。
答案3
我知道这个问题已经过时了,但这是 Google 上第一个出现的问题。还有另一种方法可以访问“隐藏”文件系统,即使用单独的取消共享它会创建一个具有不同挂载点的单独命名空间,并运行某物在那里。(也可以使它持久化 - 请参阅手册页。)
mkdir /tmp/above /tmp/below
touch /tmp/above/a /tmp/below/b
mount -o bind /tmp/above /tmp/below
ls below
unshare --mount sh -c 'umount /tmp/below ; ls /tmp/below'
第一个ls
将看到“a”,第二个将看到“b”。
它确实需要提升的权限,但应该可以在任何类型的文件系统上运行。