当您“装载”包含内容的现有文件夹时会发生什么?

当您“装载”包含内容的现有文件夹时会发生什么?

现在/tmp里面有一些临时文件。当我将硬盘 ( /dev/sdc1) 安装在 之上时/tmp,我可以看到硬盘上的文件。/tmp当我的硬盘安装后,实际内容会发生什么变化?是否可以/tmp在挂载硬盘时对实际内容进行读/写操作?

python@lanix / $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       286G   43G  229G  16% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            3.8G  4.0K  3.8G   1% /dev
tmpfs           766M  1.4M  765M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.8G   38M  3.8G   1% /run/shm
none            100M   24K  100M   1% /run/user
/dev/sdb1       7.5G  2.7G  4.9G  35% /mnt
/dev/sdc1       932G  242G  691G  26% /tmp

答案1

当我的硬盘安装后 /tmp 的实际内容会发生什么?

几乎什么都没有。它们只是隐藏在视图之外,无法通过正常的文件系统遍历访问。

硬盘挂载时是否可以对/tmp的实际内容进行读写操作?

是的。在“原始”内部打开文件句柄的进程/tmp将继续能够使用它们。您还可以通过在其他地方绑定安装来使“重新出现”在/其他地方。

# mount -o bind / /somewhere/else
# ls /somewhere/else/tmp  

您可以运行以下一个小实验来更好地(我希望)了解正在发生的事情。

笔记:这并不是试图完全正确,也不是对实际发生的情况进行详尽的描述。不过应该足够准确,可以让您了解全局。

我在我的机器上创建了一个名为的用户me,并在他的家中创建了一个随机目录,其中包含一个文件:

me@home $ pwd
/home/me/tmp
me@home $ echo hello > some_file
me@home $ ls  
some_file
me@home $ cat some_file 
hello

此时,没有什么不寻常的 - 它只是一个带有普通文件的普通目录。我让该会话保持原样打开,并将其cwd放在测试目录中。

作为 root,我创建了一个小型文件系统并将其挂载到/home/me/tmp.

root@home # dd if=/dev/zero of=./fs bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00467318 s, 2.2 GB/s

root@home # mkfs -t ext2 ./fs 
mke2fs 1.42.12 (29-Aug-2014)
[... snip ...]
Writing superblocks and filesystem accounting information: done

root@home # mount ./fs /home/me/tmp

然后我打开一个新终端me,然后环顾四周:

me@home #2 $ cd tmp
me@home #2 $ ls
lost+found
me@home #2 $ cat some_file
cat: some_file: No such file or directory
me@home #2 $ echo bye bye > some_file
-su: some_file: Permission denied

所以,我们创建的那个文件显然不存在。该lost+found目录表示 ext 文件系统的根。而且我失去了写权限,所以它显然不是原始目录。

回到第一me场,我们来看看它是如何看待世界的:

me@home $ echo something else > other_file

写起来没问题。

me@home $ cat some_file other_file 
hello
something else

原始文件仍然存在,创建的新文件没有问题。

啊?这是怎么回事?

第一个会话在被 root 在其上安装另一个文件系统覆盖之前进入该目录。该挂载操作根本不会影响原始文件系统。 shell 进程对原始文件系统中的目录具有完全有效的句柄,并且可以继续与其交互。有点像到处乱跑下面地毯安装点。

第二个会话进入挂载后的目录。所以它会看到新的空文件系统。并且系统管理员取消了权限,因此它无法使用请求的空间...让我们解决这个问题。

root@home # chown me:users /home/me/tmp
me@home #2 $ echo bye bye > some_file
me@home #2 $ ls 
lost+found  some_file
me@home #2 $ cat some_file 
bye bye

会话 1 能从地毯下逃脱吗? (已经发霉了。)

当然!如果会话 1 将文件系统树向上移出挂载,它将丢失内部句柄,并将像其他人一样跟随挂载。

me@home $ cd
me@home $ pwd
/home/me
me@home $ cd tmp
me@home $ cat some_file other_file
bye bye
cat: other_file: No such file or directory

与会话 #2 的视图相同,我们恢复正常。

但你怎么知道文件没有消失呢?没人再找了!

这是绑定安装变得方便的时刻之一。它们允许您在其他地方安装已经安装的文件系统。

me@home $ mkdir ~/bind
root@home # mount -o bind /home/me /home/me/bind

(是的,您可以在“自身内部”绑定安装文件系统。很酷的技巧,嗯?)

me@home $ ls bind/tmp
other_file  some_file
me@home $ cat bind/tmp/*
something else
hello

所以他们确实在那里,准备采取行动。只是它们在原始位置不可见/不可访问,安装将它们隐藏在正常的目录遍历中。


我鼓励您尝试一下,一旦您了解了正在玩的“技巧”,它实际上并不复杂。一旦您掌握了它™,请研究联合文件系统以获得更多的地毯拉动:-)

但需要注意的是:一旦启动过程完成,在/tmp/var(或任何核心操作系统目录)上安装确实不是一个好主意。许多应用程序都会在这些目录中保留状态,如果您在它们周围玩安装游戏,可能会感到严重困惑。

相关内容