装入硬盘驱动器后,/ 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
原始文件仍然存在,创建的新文件没有问题。
??这是怎么回事?
第一个会话通过根目录在其上挂载另一个文件系统之前进入了目录。挂载操作完全不影响原始文件系统。Shell进程对原始文件系统中的目录具有完全有效的句柄,并且可以继续与其进行交互。有点像在地毯安装点下面跑来跑去。
放置挂载后,第二个会话进入目录。因此,它将看到新的空文件系统。并且sysadmin取消了权限,因此它无法使用请求的空间...让我们对其进行修复。
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
因此,他们确实在那里,准备采取行动。只是因为它们在其原始位置不可见/无法访问,所以挂载会将它们从常规目录遍历中隐藏起来。
我鼓励您尝试一下,一旦您了解了所玩的“技巧”,它实际上并不复杂。一旦您获得了Got It™,就可以查看并集文件系统以获取更多的地毯信息:-)
不过要注意一点:一旦启动过程完成,在/tmp
或/var
(或任何核心OS目录)上挂载实际上不是一个好主意。许多应用程序在这些目录中保留状态,如果您在它们周围玩坐骑游戏,可能会感到非常困惑。