从零开始的linux 第二十一章


在紧张的学习中,又迎来了新的一周~~-17c23f93a77fdd80.jpg小编也在同学们的迫切要求下继续来更新博客咯~~

同学们:“我们才没要求你!”

唉??同学们一点都不配合呢~~别不好意思嘛~~


好啦~不逗你们了,小编就节省大家的时间,赶快开始这章的课程吧~~


在上一章中,小编给同学们讲了 Inode号Block,不过还没有给同学们讲完哦~所以上一章的题目是 其一 ,那么毫无疑问这一章就是其二的内容咯~从上一章同学们已经了解了什么是Inode和Block,以及Inode中包含哪些东西,忘记的同学可以再翻看上一章内容~~并且,当一个分区下的Inode号被用尽之后,即使空间剩余再多也将无法创建新的文件,在上一章最后,同学们也了解到了linux中一个目录中的Bolck真正存放的数据是什么,并留下了一些问题,这一章,小编就来带着同学们解决这个问题吧~~


我们知道,每个分区的文件系统上都有Inode号,以及Block,并且这个Inode在相同分区下是唯一的,用来标识一个文件,不同分区下,Inode号会有可能相同,但因为是在不同分区,所以不会发生冲突,那么我们在复制和移动,删除文件的时候,操作系统究竟在做什么呢?

实际上,在复制和移动文件的时候,分为两种情况:第一种是在同一个分区下;第二种是在不同的分区下。在这两种情况下,又有两种情况:目标存在目标不存在

小编就来介绍一下这几种情况情况:

在相同分区下cp复制一个文件:(目标不存在的情况下)

当我们用cp复制一个文件时,目标若是与源在同一个目录,同一个Inode号只能指向同一个Block,因为若同一个Inode号指向了不同的Block,当系统用这个Inode号来获取其指向的数据时,就会发生混乱。注意哦,这里所说的同一个Block是同一个数据,比如说,小编现在要向一个文件写入内容,一个Block存放的数据有限,而当写入文件的内容过多,会用到多个Block,但是这多个Block都属于同一种数据,属于同一个文件的内容。所以,若一个Inode号指向了不同的Block,就说明一个Inode号指向了不同的文件,那么当要用这个Inode查询数据时,结果就可想而知了...所以,不难想象,当复制一个文件到同一个分区下,系统会给这个复制出来的目标文件分配一个Inode号,同样会复制源文件的Block。


在相同分区下cp复制一个文件:(目标存在的情况下)

在cp复制文件的时,若目标存在,会提示我们是否覆盖该文件,若我们选择了覆盖,就会覆盖这个目标的原有的数据,但是,这个文件的Inode号会保留下来,但是会将这个文件的元数据给覆盖掉


在不同分区下cp复制一个文件:(目标不存在的情况下)

既然在不同分区下,每个分区下都有各自Inode号,所以这点小编就不做过多解释了,其会将源文件的数据(block)以及元数据一起复制,并在目标所在的目录创建一个新文件分配一个新的Inode号。


在不同分区下cp复制一个文件:(目标存在的情况下)

与在同一个分区下的情况一样,这里小编也不做过多的介绍了~~



以上是cp复制文件的情况,下面,小编就来介绍一下移动文件:

在相同分区下mv移动一个文件:(目标不存在的情况下)

从上一章也了解到,目录中存放的是该目录下面所有文件的Inode号与文件名称的对应关系,并且在同一分区下Inode号是唯一的,那么移动文件时候,既然是移动,并且在同一个分区下,是否这个Inode号可以保持不变呢?同学们可以试想一下,小编在相同分区下移动文件,先假设这个文件的Inode号会发生变化,那么也就意味着会先把这个文件移除再创建,并把这个目录中的记录的Inode号与文件名的对应关系也删除,再分配一个新的Inode给目标。实际上,这个步骤是繁琐的,其中间有些步骤完全可以省略,也就是说,在同一个分区下,既然要使用同一个分区的Inode,不如索性就直接保留原来文件的Inode号以及元数据,仅仅是删除这个文件所在的目录中记录的该文件的Inode号与文件名的对应关系,并在移动的目标的目录中添加这条记录即可。因为文件本身没有发送迁移,所以即使要移动非常大的数据也能瞬间完成。


在相同分区下mv移动一个文件:(目标存在的情况下)

若目标存在,同样会提示我们是否覆盖该文件,这里与cp命令不同,虽然是覆盖文件,但是源文件同样有一个Inode号,而源文件的Inode号会将目标的Inode号给覆盖掉,完全使用源文件的Inode,同样会在源文件所在的目录中删除其Inode号与文件名的记录,并在目录的目录下删除目标的记录,将源文件的Inode与文件名记录添加进去。


在不同分区下mv移动一个文件:(目标不存在的情况下)

若不在同一个分区,移动文件就相当于两个命令的集合:cp复制和rm删除。会将源文件的数据与元数据全部复制到目标,并将源文件删除,在新的分区下给其分配一个新的Inode号


在不同分区下mv移动一个文件:(目标存在的情况下)

若在不同分区下,目标存在,同样会提示我们是否覆盖,但是这是在不同的分区下,既然要给这个源文件分配一个Inode,不如索性就是用目标的Inode,所以若不在同一个分区且目标存在,那么会使用目标的Inode号,并覆盖其元数据以及数据。



以上的mv移动文件时,Inode号与Block的变化情况,那么,小编在讲rm删除文件时,先给同学们介绍一下,什么是软链接,什么是硬链接:

软链接/符号链接:

软链接,又称为符号链接,相当于我们Windows中的"快捷方式",对一个文件创建软链接,就相当于创建一个快捷方式,而这个快捷方式会很小,所以软链接亦是如此。这个软链接存储的内容是源文件的路径,所以其会很小,那么创建一个快捷方式会生成一个文件,创建软链接也会新生成一个文件,所以会给这个软链接分配一个Inode号,对一个文件创建软链接后,可以通过访问软链接来访问源文件。无论在不在同一个分区,都会创建一个新的文件分配一个Inode,所以,软链接是可以跨分区的。

ln -s:创建软链接

QQ截图20171209162556.png

小编给/app/目录下的zzz/目录在/tmp目录下创建了一个软链接,可以清楚的看到该链接指向的目录时/app/zzz,现在,小编在/app/zzz目录下创建一个文件,当小编访问的时候访问/tmp/zzz

QQ截图20171209162952.png

可以看到,访问的就是/app/zzz/目录下的内容。软链接不仅可以对目录创建,对文件依然可以创建软链接

QQ截图20171209163413.png

此时访问这个软链接,访问的就是指向的这个文件,通过这两个文件,发现软链接的大小各不相同,这是因为软链接文件的大小取决于源文件的路径的长度,而这个路径可以是相对路径,也可以是绝对路径,绝对路径较简单,只是用源文件的绝对路径即可,那么相对路径的话,这个相对路径,是相对于这个链接文件而言,而非当前所在的目录而言,比如说,小编现在在/app/目录下,要对zzz目录在/tmp目录下创建一个软链接,小编使用一下相对路径

QQ截图20171209163935.png

小编现在在当前目录下,使用相对路径创建了一个软链接,那么,小编进入/tmp目录看一下

QQ截图20171209164102.png

唉??软链接显示红色,而且指向的路径不对呀~~那是因为,站在这个软链接的角度来考虑,它找不到相对于它所在路径的相对路径下的zzz目录,小编用同样的方法将软链接创建到/app/目录下

QQ截图20171209164529.png

此时这个软链接是可用的,因为它可以找到它所指向的源文件。

将软链接所链接到的源文件删除后,软链接将不可用,这个小编就不演示啦~~


所以,通过软链接,我们又变相的引出了一个事实,一个文件的Inode中的指针,不仅仅指向的是Block,还有可能指向另一个指针,而另一个指针还可以再指向另一个指针,由其他指针来指向Blck


啊~~小编好累~~嗯...不如先就到这里吧~~关于硬链接,以及删除文件时候进行的操作,等下一章小编就给同学们补上~~

QQ截图20170720162736.png