![访问底层挂载点路径上的内容](https://linux22.com/image/120856/%E8%AE%BF%E9%97%AE%E5%BA%95%E5%B1%82%E6%8C%82%E8%BD%BD%E7%82%B9%E8%B7%AF%E5%BE%84%E4%B8%8A%E7%9A%84%E5%86%85%E5%AE%B9.png)
如果我有/dev/sda1
安装在 root 上的分区,并且我有安装在 上的/
分区,有没有办法可以访问on的原始内容而无需先卸载?/dev/sdb1
/var
/var
sda1
sdb1
答案1
在 Linux 中,您可以使用绑定挂载将文件层次结构的一部分重新挂载到其他位置。因此,例如,您可以这样做:
# mkdir /mnt/bindroot
# mount --bind / /mnt/bindroot
此时,/mnt/bindroot
包含根文件系统的内容,但没有安装在各个目录上的其他文件系统。
# ls /home
user1 lost+found
# ls /mnt/bindroot/home
<whatever was in /home before a filesystem was mounted over it>
对于 FreeBSD,您可以对nullfs
挂载执行类似的操作 —— 请参阅mount_nullfs
。
答案2
在 Linux 上,您可以在没有绑定挂载和 root 权限的情况下做到这一点,只需拥有一个进程,该进程要么 chdir 要么打开底层目录(在被挂载隐藏之前),然后只是徘徊;然后其他进程可以通过/proc/<pid>/cwd
或访问该目录/proc/<pid>/fd/<dir_fd>
。
chdir 示例:
# mkdir dir; touch dir/file # create a sample dir and file
# (cd dir; while sleep 3600; do :; done) & # start a bg process with its pwd being dir
[1] 3734
# mount -t tmpfs tmpfs dir # mount a tmpfs over dir which will hide its previous content
# ls dir
# ls /proc/3734/cwd # you can still access the old dir via /proc/<pid>/cwd
file
打开目录的示例:
# mkdir -p dir1; touch dir1/file
# exec 9<dir1
# mount -t tmpfs tmpfs dir1
# ls dir1
# ls /proc/self/fd/9
file
如果您想在事后使用已挂载的目录执行此操作,则可以创建一个私有命名空间并在命名空间内卸载该目录。
在这种情况下,您还可以通过外部访问它/proc/<pid>/root/<path_to_dir>
,而无需打开它或对其进行 chdir:
mkdir -p dir; touch dir/file
mount -t tmpfs tmpfs dir
unshare -m sh -c 'umount dir; while sleep 1000; do :; done' &
sleep .1
ls "/proc/$!/root/$PWD/dir" # will show 'file'
/proc/<pid>/root
您可以在联机帮助页中阅读有关 的额外魔力的更多信息proc(5)
。请注意,即使在进程终止后,您也可以通过将其绑定挂载到/proc/<pid>/ns/mnt
其他位置来使进程的命名空间保持活动状态;然后您可以使用 重新输入nsenter(1)
。
答案3
注意:对于那些可能错过评论的人。
sudo mount --bind original_location backup_link
有效,oldlocation
在其上安装某些东西和阴影后,可以访问下面的位置。
但
sudo mount --bind
我发现需要运行后mount something original_location
,不是事先。- 由于是在影子挂载之后,因此需要挂载高于一个影子的目录:
sudo mount --bind parent_of_original_location backup_link