访问底层挂载点路径上的内容

访问底层挂载点路径上的内容

如果我有/dev/sda1安装在 root 上的分区,并且我有安装在 上的/分区,有没有办法可以访问on的原始内容而无需先卸载?/dev/sdb1/var/varsda1sdb1

答案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在其上安装某些东西和阴影后,可以访问下面的位置。

  1. sudo mount --bind我发现需要运行 mount something original_location,不是事先。
  2. 由于是在影子挂载之后,因此需要挂载高于一个影子的目录:sudo mount --bind parent_of_original_location backup_link

相关内容