从零开始的linux 第二十章


hello~~又是一周来临惹~~,小编即使再忙,也要抽出时间给同学们讲课~而且...还没有工钱...

10b8ce7ab5b0d617.gif

你们再也找不到怎么敬业并且爱着你们的小编惹~~是不是呀~路人甲~~

50c0bee1e295c14b.jpg

(↑害羞的路人甲)

路人乙:“小编!!你又逗路人甲!!”

怎么?难道小编哪一周不再更新了,路人乙不想小编么??(可怜的表情)

(脸红的傲娇)路人乙:“我....才不可能会”

2333好啦~~开玩笑的,那么,为了节省同学们的时间以及小编的时间,小编就不再废话啦~开始这一章的主题~~


上一章,小编给同学们详细介绍了 mv 移动文件的命令,嗯....有同学说小编那并不是详解,小编很委屈的说~~小编有句话不知道要不要讲...不...小编有句话一定要讲,实际上,mv命令对我们来讲,其两个选项就已经够用了,并且小编在上一章中提到有些专业术语,在第...嗯..第十八章中详细介绍的cp复制文件的命令中都有解释的~~每个命令同学们不用过深的研究它的各个选项的用法,Linux中的命令辣么多,怎么可能全部记得住呢~~所以,在一些不知道命令如何使用的情况下,小编在很早的时候就给同学们讲过如何查看命令的使用帮助~同学们只需要查看帮助,就能很快的知道如何使用啦~~


小编在上一章结束的时候,有告诉过同学们这一章小编要给同学们介绍什么是inode以及block,不知道同学们在下面有没有复习呢~~嘛~无所谓啦~反正有小编在嘛~不过,也不能太依赖小编讲的课,同学们还是要靠自己理解的~~


什么是文件的Inode和Block呢?

Block:

Block就是存储数据的数据块,在计算机的物理设备中,磁盘也成为硬盘,用来存储数据。而这些数据又有元数据和数据两种,元数据就是文件的属性,小编之前给同学们讲过,这里就不多说啦,而Block存放的是真实的数据。


当我们向文件中写入内容时,系统会给我们分配Block块来存储这些数据,一个block的大小通常在格式化文件系统的时候就被指定,一般为1KB,2KB,4KB;额...格式化文件系统小编还没有讲到,同学们先有这个概念,以后小编讲磁盘管理时候会讲到的~~那么回归主题~显然,一个block对于一些数据量较大的话,一个block是无法存下的,此时系统会再给该文件分配block,直到能够存下该数据为止。


那么,系统中的block并不是无限的,(小编这里说"系统中的block"可能会不准确,但是也是没有太大问题的~)block的多少,取决于物理磁盘(硬盘)的大小,磁盘越大,能够被分配的block就越多;因为磁盘越大,分区能够分的空间就越多,格式化文件系统时的block就越多,它们是成正比的;但是,虽然block的多少由磁盘大小决定,但这是总个数,小编在第一章给同学们介绍了安装虚拟机,在此期间简单的说明了给磁盘分区,那么,为什么要给磁盘分区呢?


分区并不是把数据分开存放,在物理上,这些不同分区下的数据还是存放在了同一个地方,即都存放在物理硬盘上。我们对一个硬盘进行分区,并给该分区一个文件系统,只是在逻辑层把他们分开(注意哦~是逻辑层),这样若其中一个分区出了问题,并不会影响其他分区,在逻辑上把他们分开,但实际上,存在硬盘上的数据依然是无序存放的(没有顺序存放的)。

既然是在逻辑层的划分,那么block也应该会被划分开,所以,每个分区中的存储大小实际上就是划分的block的多少,分区的存储量大的,block自然就分的多。


小编上面也说过,虽然在逻辑层对磁盘进行了分区,每个分区都有一个文件系统,数据存在不同的分区下,但实际上,这些数据在磁盘上,依然是无序存放的,既然是无序存放,那我们是如何来找到相对应的数据的呢?


Inode:

为了找到磁盘上这些无序的数据,我们需要一个"指针",带着我们找到这个数据。就像宾馆中有那么多房间,要如何精确的表示一个房间呢?它们都会用一个 楼层号+房间号 来精确的表示单个房间,如:0405号表示四楼的第五号房间。嗯..小编觉得已经描述清楚了,所以,这里的"指针"也是相同的意思,而这个带着我们找到数据的"指针",我们称它为:文件的Inode号.但,仅因为这个称为文件的Inode或许不准确,因为他还包括其文件的其他信息。


既然是文件的Inode,说明每个文件,包括目录都有对应的Inode。block中存放的是数据,那么元数据呢?没错,Inode号就包含了文件的元数据:权限(mode)、文件的所属人和所属组信息、文件的大小、时间戳、指针。当我们在分区下创建一个文件或目录时,会给该文件分配一个Inode号,Inode中包含了文件的所有元数据,那么为什么没有文件名呢?实际上,文件的名称仅仅是用来给用户来看的,实际上,每个文件在文件系统中是以Inode号来标识该文件的,这个Inode号的指针负责指向其数据块(Block),所以,Inode号在相同分区下应该是一个唯一的值,在小编还没有给同学们讲硬链接的时候,同学们可以这么理解。


为什么说它在相同分区下是唯一的呢?同学们可以试想一下,小编还用宾馆的房间号为例,其中一家宾馆中有0201这个房间号,难道别的宾馆就不能有0201这个房间号呢么?答案肯定是否定的。这不同的宾馆就相当于不同的分区。同学们可以再试想一下,两个宾馆都有0201这个房间,但房间里面的设施以及装修的样式都不会相同对不对~这里依然是一样的,不同的分区下会有相同的Inode号,但其指向的数据是不相同的,因此,Inode号也不能跨分区,因为在别的分区中也有与之相同的Inode


同学们可以再试想一下,其宾馆中的房间是有限的,所以每个房间的房间号也是有限的,宾馆的规模越大,建的房间就越多,房间号也就越多。这里亦是如此,一个分区下,文件的Inode号是有限的,分区的大小越大,Inode号就越多。这也就意味着,分区下文件的数量就也就有限的,即使存储的空间大小还有很多,一旦没有了Inode号,是否就无法再创建文件了呢?


那么,小编就带大家来实验一下~~(注意哦,小编会用到一些没有讲到的命令,先给同学们简单提一下~)

在Linux中,我们可以先用 df 命令来查看分区的挂载及空间使用情况,注意,以/dev/开头的才是磁盘的分区:

QQ截图20171202212259.png

其中,blocks总空间大小单位是KUsed是已经使用的空间大小Use%已经使用的空间大小占总大小的百分比

我们可以通过 df -i 来查看分区Inode号使用情况:

QQ截图20171202212623.png

↑其中,Inodes是该分区下的Inode号的数量IUsed是已经使用的Inode号的数量IFree是空闲的Inode号数量IUse%是已经使用的Inode数量占总数量的百分比

那么,我们测试还在/app/目录下测试,小编刚才说过,每创建一个文件就会分配一个Inode号

QQ截图20171202213046.png

而小编创建一个空文件,用 ls -l命令查看文件的详细信息,被小编高亮显示的部分表示的是普通文件的大小,可以看到,空文件大小是0,也就是说,无论小编创建多少个空文件,它的大小也不会把/app/分区的空间用满,小编就在这个目录下创建出24413689个文件:

QQ截图20171202213343.png

嗯...这个操作小编还没有跟同学们讲,下一章就讲咯~~因为文件过多,所以创建时候会很慢,这里小编故意多创建一个文件

....五分钟后...

哇~~太慢了,不实验啦不实验啦~~

QQ截图20171202214142.png

现在Inode到了10万,还需要好多,嘛~~小编就不演示啦~~同学们只需要知道,当分区下的Inode用完之后,无论空间还有多少的剩余,都将无法再创建文件。


路人甲:“小编大人~我有个问题想问~”

等等,小编知道你想问什么,你是想问,文件的文件名称是给用户看的,linux中是用Inode来区分文件的,你是想问为什么文件名相同的时候会发生冲突的对不对??

路人甲:“是的,没错”

嗯...路人甲这个问题问的好~

Linux中确实用Inode号来标识一个文件的,而当我们呢创建一个文件并对文件命名时,会分配给该文件一个Inode号,而block是写入数据的时候才会分配的。

小编此前给同学们讲 ls 命令的时候讲到过,用 ls -i 来查看一个文件的Inode号

QQ截图20171202215653.png

可以看到,该文件的Inode号是67,小编再在该目录下创建一个目录,并查看其Inode号

QQ截图20171202215836.png

这个目录的Inode号是68,那么,小编用 ls -l 来查看他们两个的文件大小

QQ截图20171202215938.png

可以看到,该普通文件的大小是 0,而目录中没有任何文件,但其大小是6,小编现在从别的目录中找一个有数据的文件并将其复制到/app/zxc/目录下

QQ截图20171202220104.png

QQ截图20171202220624.png

可以看到,原本的passwd文件的大小是2321字节,但复制到/app/zxc/目录下之后,原本6字节的目录,现在却只有20字节,但是passwd这个文件本身的大小复制到该目录下后并没有发生改变,这究竟是为什么呢?


实际上,当我们用 ls -l 来查看目录的详细信息时,显示目录大小的地方仅仅显示的是目录本身的大小,而不是目录以及该目录下面所有文件的总大小,这一点与我们平时用的windows是不相同的。


所以,原本目录自身的大小是6字节,为什么复制进去一个2321字节的文件后,目录自身的大小却变成了20字节呢?而这多出来的14字节究竟存放的是什么?


在linux中,目录存放的不是文件的数据,小编上面讲过,数据在磁盘中无序存放,文件上的Inode中的指针帮我们指向了其数据块(block)的位置,而目录中所存放的,不是一个一个的文件,而是该目录下文件的名称以及文件名称对应的Inode号,所以在文件的父目录上有文件名对应的Inode的记录,因此我们在相同目录下创建两个相同名称的文件为什么会冲突,这个问题也就解开了~~



那么我们平时在复制文件、移动文件以及删除文件的时候,底层都是做了哪些操作呢?Inode中的指针除了指向数据库(Block)还可以指向什么呢??



小编就带给同学们这么一个问题,抱着好奇的心理来期待小编的下一章吧~~~


唉??不知不觉就已经这么晚惹~~同学们早点休息哦~~