联合文件系统学术解释是把不同的目录挂载到同一个虚拟文件系统中去。这种概念比较抽象,其实是可以简单理解为把不同的目录合并成一个目录,原来目录下的内容路径都不会改变。我们举个例子来理解一下。
现在有两个目录,目录一包含两个文件夹A,B,A文件夹下面有a.txt文件,B文件夹下面有b.txt两个文件,也就是a.txt的b.txt的路径为
/A/a.txt
/B/b.txt
目录二同样也包含两个文件夹A,C,A文件夹下面同样也有a.txt文件,同时还有一个a1.txt文件,C文件夹下面有c.txt文件,同样列一下这些文件的路径
/A/a.txt
/A/a1.txt
/C/c.txt
现在,我们用联合文件系统技术来“合并”一下这两个目录。
如开头提到的,合并后的目录对于原来的目录里文件的路径是不会改变的,那最终期望的结果应该是:
/A/a.txt
/A/a1.txt
/B/b.txt
/C/c.txt
没错,联合文件系统最终让我们看到的就是这样的结果。
但是,大家应该会有个疑问,就是a.txt到底是原先哪个目录下的。答案是谁先被挂载就显示成谁的,如果目录一先被挂载,那优先显示目录一里的a.txt,那另外一个目录里的a.txt怎么样了呢?会被a.txt覆盖还是被删除呢?下文见分晓。
那要修改虚拟文件系统里看到的文件又会有什么样的结果呢。比如我现在想改a.txt里的内容,修改之后原本目录里的a.txt会不会跟着被改掉了呢?答案是并不会,这里涉及联合文件系统一个很关键的知识点,就是被挂载的内容默认都是只读的,无法修改的,那如何体现改动呢,其实这个文件系统会产生一个a.txt的副本,修改只会应用在当前的a.txt副本上,这个副本相比原来的a.txt具有优先显示权,这和一开始两个目录挂载的时候只显示先被挂载的目录里的a.txt结果是一样的,那没显示文件怎么样了呢?由于之前说挂载过来的内容都是只读的,所以很显然,这些文件在原来的目录里的内容并不会改变。
改一个文件,我去复制一个副本出来进行修改还好理解,那我要是想把这个a.txt删除会怎么样呢?会不会失败?当然不会,如果你想删除a.txt,这个文件系统也会生成一个文件,这个文件的类型是whiteout,相当于一个删除的标记(这步可以理解为逻辑删除),这个文件会告诉文件系统标记的是哪个真实的文件,文件系统读到这个whiteout文件就知道要把哪个文件藏起来不显示了。
其实,有没有发现联合文件系统特别像拍一部电影,挂载就像选角色,对于应聘同一个角色的演员采取的是先到先得,修改文件内容就像电影里常常见到的“十年后”,角色从小孩长成了大人,这个改变会体现在原来的演员身上吗?并不会,只是在电影里换了个演员而已。那删除文件就像电影里角色的死亡,如果某个角色在电影里突然要找已经去世的妈妈,这时候欧阳娜娜就会告诉你:蚂蚁竞走十年啦(妈已经走十年了),这同样不会对这个角色在真实世界的妈妈有任何影响。
看到这里,Are you OK?