现在/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
(或任何核心操作系统目录)上安装确实不是一个好主意。许多应用程序都会在这些目录中保留状态,如果您在它们周围玩安装游戏,可能会感到严重困惑。