目录
磁盘、服务器、机柜、机房
四者的关系是“包含与被包含的关系”:
最内层:磁盘属于服务器
第二层:磁盘安装在机柜中
第三层:机柜部署在机房中



磁盘物理结构

磁头相当于笔,而盘片(磁盘)相当于纸。这样就可以记录信息在磁盘上。
磁盘的存储结构




图片中各个结构的定义:
• 扇区:从磁盘读出和写入信息的最小单位,通常大小为 512 字节。
• 磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,即一个盘片共对应2个磁头
• 磁道(track)数:磁道是从盘片外圈往内圈编号0磁道,1磁道...,靠近主轴的同心圆用于停靠磁头,不存储数据
• 柱面(cylinder)数:磁道构成柱面,数量上等同于磁道个数
• 扇区(sector)数:每个磁道都被切分成很多扇形区域,每个道的扇区数量相同
• 圆盘(platter)数:就是盘片的数量
• 磁盘容量=磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
注:传动臂上的磁头是共进退的
那如何在那么多盘片和扇区中找到数据呢?
1.先定位磁头:就可以确定该数据所在的柱面(磁道)
2.再定位扇区
通过柱面(cylinder),磁头(head),扇区(sector)的方法寻找数据,这种方法就是CHS寻址法。
磁盘的逻辑结构
理解
磁盘存储数据的方式,就很像我们以前生活中常用的磁带的存储方式。当我们放歌的时候,我们会发现,磁带里面的两个圈就会开始传送磁带给对方,然后磁带里面的音磁头读取磁带上的磁信号,我们就可以听到我们传入进去的歌。

但当我们把磁带拉完出来,就会发现磁带是 “长条状磁介质”,逻辑空间是一维线性序列—— 数据按 “顺序” 排列在磁带的 “磁道” 上,如同 “在纸上按直线写文字”。

那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在一起的磁带,那么磁盘的逻辑存储结构我们也可以类似于:

一个盘片里面又有多个扇区,所以上图我们就可以划分为:

但是真实情况是:
柱面是一个逻辑上的概念,其实就是每一面上,相同半径的磁道在逻辑上构成柱面。 所以,磁盘物理上分为很多面,但在我们看来,从逻辑角度,磁盘整体是由“柱面”卷起来的形态。就像我们用的卷筒纸巾一样。

所以,磁盘的真实情况是:
磁道:
对于磁道的结构,就相当于把一筒卷纸直接剪开,那么卷纸就变成了一张张的纸了。


即:一维数组
但是硬盘里有很多个磁盘(盘片),怎么确定是哪个盘片上面的数据呢?
柱面:
把整个磁盘所有盘面的同一个磁道展开,即柱面展开:

即二维数组。
整盘:
那么整个磁盘就可以根据不同柱面来用二维数组来表示:

所以,磁盘可以用三维数组来表示,比如sector array[C][H][S],其中C就可以定位到磁盘的柱面,H可以定位到磁盘的磁道,S可以定位到磁盘的扇区,用这种方法来表示的是CHS寻址方式。除了这种方式我们还有一种方式也可以找到数据所在的位置,但是该方法是把磁盘当作一维数组来看,这种方法就是LBA寻址方式。
LBA=该数据的下标。

磁盘会自己把LBA地址转化为CHS地址。所以从此往后,在磁盘使用者看来,根本就不关心CHS地址,而是直接使用LBA地址。
引入文件系统
"块"
• 其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。
• 硬盘的每个分区是被划分为一个个的“块”。一个“块”的大小是由格式化的时候确定的,并且不可以更改,最常见的是4KB,即连续八个扇区组成一个“块”。
• “块”是文件存取的最小单位。

注意:
• 磁盘就是一个三维数组,我们把它看待成为一个"一维数组",数组下标就是LBA,每个元素都是扇区
• 每个扇区都有LBA,那么8个扇区一个块,每一个块的地址我们也能算出来。
•LBA=8*块+n(块内的第几个扇区)
•块=LBA/8
"分区"
• 其实磁盘是可以被分成多个分区(partition)的,以Windows观点来看,你可能会有一块磁盘并且将它分区成C、D、E盘。那个C、D、E就是分区。分区从实质上说就是对硬盘的一种格式化。格式化就比如说,你买了一个房子,你要对里面的区域进行规划,比如哪块地做卧室,哪块地做客厅等,就是你对这个房子进行了格式化操作,但是Linux的设备都是以文件形式存在,那是怎么分区的呢?
• 柱面是分区的最小单位,我们可以利用参考柱面号码的方式来进行分区,其本质就是设置每个区的起始柱面和结束柱面号码。此时我们可以将硬盘上的柱面(分区)进行平铺,将其想象成一个大的平面,如下图所示:


"inode"
当我们在终端执行ls -l命令后,我们会发现终端上就会显示该目录下所有文件的属性和文件名。而执行stat+文件名时,我们可以更清晰的知道文件的属性。
文件数据存储在“块”中,那么我们必须找一个地方存储文件的属性信息。这种存储文件属性信息的区域叫做inode。


可以通过ls -li命令知道该文件的inode号:

注:
1.Linux下文件的内容和属性分开存储
2.一个文件只有一个inode,inode内有唯一的一个inode号
3.文件名属性没有纳入inode数据结构内部
4.inode的大小一般是128字节或256字节,后面统一128字节
5.任何文件的内容大小可以是不同的,但是属性的大小是相同的
块中存储什么信息,怎么存储,都是由文件系统来管理文件数据的存储位置。这就决定了文件在磁盘上以何种结构存储,以及如何快速定位到文件数据。不同的文件系统有不同的存储方式,常见的是ext2文件系统。
ext2 文件系统
想要在硬盘上储存文件,就必须把硬盘格式化为某种格式的文件系统,才能存储文件。文件系统的目的是为了组织和管理硬盘的文件。
ext2文件系统将整个分区划分成若干个同样的块组(Block Group),每个分区前面都有一个启动块(Boot Block/Sector),如下图所示。

启动块的大小是1KB,用来存储磁盘分区信息和启动信息,任何文件系统都不能修改启动块。启动块之后才是ext2文件的开始。
而每个块组里面都有相同的结构组成。
块组组成

超级块(Super Block)
存放文件系统本身的结构信息,描述整个分区的文件系统信息。也就是说,超级块可以知道整个分区里所有块组里的信息。比如:block和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间等。如果一个文件系统中只有一个超级块且超级块里的信息被破坏,那么磁盘就不能知道这个分区的情况,整个文件系统结构就被破坏了。
所以超级块在每个块组的开头都有一份拷贝,后面块组可以没有。为了保证文件系统在磁盘部分扇区出现物理问题的情况下还能正常工作,就必须保证文件系统的超级块信息能被访问。
一个文件系统的超级块会在多个块组中进行备份,这些超级块的数据是一样的。
GDT(Group Descriptor Table)
块组文件描述符表,描述块组属性信息, 整个分区分成多少块组就对应多少个块组描述符。即一个GDT中只存储该块组的描述信息。如:这个块组中区域的划分,哪里开始是inode Table,哪里是Data Blocks,空闲的inode和数据块剩余数量等。块组描述符在每个块组的开头都有一份拷贝。
注:在块组中的顺序:超级块的备份之后才到GDT的备份。
Block Bitmap
通过位图的方式记录Data Blocks中哪个数据块被占用,哪个数据块没被占有。位图占据一个块的大小(4KB),一个比特位可以表示一个块的信息。
inode Bitmap
每个bit表示该inode是否被使用。
i节点表(Inode Table)
存放文件属性,如文件大小,所有者,最近修改时间等。inode号是以分区为单位,整体划分,不可划分区,也就是inode中存储的属性信息不能分在两个分区里面,一边一点是不行的。
Data Blocks
数据区:存放文件内容,也就是很多块组成的。
根据文件类型的不同,分为以下情况:
1.普通文件:文件的数据(内容)存放在数据块中
2.目录:该目录下所有的文件名和目录名存储在所在目录的数据块中,除了文件名,ls -l中的其他信息保存在该文件的inode中。
注:Block号按区域划分,不能跨分区。因为不同的分区的Block号有可能相同,如果Block号跨分区,那么操作系统就不能通过该块的地址找到完整的文件数据。
inode和datablock映射
inode内部存在可以映射block的指针。这样我们就可以通过inode找到block,操作系统也就可以很快找到文件的内容和属性了。
当我们知道inode号之后,在指定分区,请解释:对文件的增删查改是在做什么?
增:在inode位图中找到没被使用的inode号并标记,然后在inode Table中新建节点,并且让该节点和在块位图中还没有被使用的数据块形成映射关系,并在块位图中标记。
删:在inode位图把inode号标记为无效,并在块位图中标记无效.
查:根据inode号可以查找到文件的属性和内容。
改:根据inode号查找到文件的属性和内容,就可以对文件进行改写。

根据上述图片,总结创建一个新文件的操作:
1.找到空闲节点,内核记录文件信息
2.找到空闲数据块并把文件内容存储在数据块上
3.inode和数据块做映射
4.内核把inode号和文件名添加到目录文件中
目录与普通文件
目录与文件名
我们知道目录是文件,在上面数据区中我们提到,在数据区中,对于目录文件我们存储目录的所有文件名和目录名。
系统要找目录内文件的映射时,需先通过 “目录的 inode” 找到 “目录的数据块”,再从数据块中读取 “文件名与 inode 的映射”。
所以,访问文件,必须打开目录,根据文件名,获得对应的inode号,然后进行文件访问。
路径解析
比如:/home/whb/code/test/test/test.c,从根目录开始,依次打开每一个目录,根据目录名,依次访问每个目录下指定的目录,直到访问到test.c。这个过程叫做Linux路径解析。
注:根目录固定文件名(“/”)、inode号,无需查找,系统开机之后就必须知道。
路径缓存
在Linux中有一个tree命令,可以从当前目录开始分析,该目录下文件的分布。
当我们第一次运用该命令的时候,发现它出现的很慢,但是用第二次的时候,就变快了。
这是因为Linux中,在内核中有维护树状路径结构的内核结构体叫做:struct dentry
该结构体中包含inode节点,父节点,子节点等。
注:树状结构整体构成了Linux的路径缓存结构,打开访问任何文件,都会在这棵树里面根据路径进行查找,找到后就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry结构,缓存新路径。
挂载分区
我们知道了inode号,但是Linux下有很多个分区,而且不同分区里面有相同的inode号,那我们怎么知道该inode号是哪个分区下的呢?
我们可以把分区挂载到指定目录,这样该目录中的文件就只在这个分区中,该文件的inode号也只在这个分区中。
结论:
1.一个磁盘只有分区格式化,才能被使用。
2.一个分区只有挂载到指定目录,才能被使用。
软硬链接
硬链接
从上面的内容中,我们都是通过inode查找文件,所以真正找到磁盘上文件的并不是文件名,而是inode号。实际上,Linux中多个文件名可以对应同一个inode号。

def文件是指向abc文件的硬链接,因为def文件没有独立的inode号,所以表明def文件(硬链接)不是一个独立的文件。硬链接的本质是在指定目录下,建立新的文件名和目标inode的映射关系,但并没有在系统层面创建新文件。也可以认为def文件名是abc文件名的别名。
当删除其中一个文件后,我们就会发现原本硬链接数为2的变成了1。

//新建目录
[root@localhost d2]# mkdir dir
[root@localhost d2]# ll
总用量 0
drwxr-xr-x. 3 root root 16 10月 11 15:50 d3
drwxr-xr-x. 2 root root 6 10月 11 16:24 dir
为什么ls -l命令后我们发现上面dir目录显示有2个硬链接数?目录dir其他硬链接名又是什么呢?
对于新建普通文件,该文件的硬链接数是1。对于新建的目录文件,该文件的硬链接数为2。因为在该目录文件下有两个隐含文件 "."和"..",我们知道“..”表示的是该目录的上一级目录,“.”表示当前目录,“.”文件其实是dir目录文件的别名,“.”文件就是dir目录文件的硬链接。dir目录文件的硬链接数因此为2.
[root@localhost d2]# ls -i -d dir
67423079 dir
[root@localhost d2]# ls -i -a dir
67423079 . 67423108 .. //inode号相同
应用:对文件进行备份。
软链接
当我们在桌面上打开一个软件的属性的时候,我们发现该软件还有一个目标文件,根据目标文件的路径我们发现该路径下有该软件。其实桌面文件上的”软件“只是软件的快捷方式,点击它可以让我们快速找到目标文件下该软件的内容。桌面上的“软件”就是通过软链接找到目标文件中的软件内容。
软连接是通过名字引用另一个文件。实际上,新文件和被引用的文件的inode不同,所以软链接是一个独立的文件,应用常见上可以想象成一个快捷方式。
[root@localhost d2]# ln -s test_wait test //两个文件的位置不能错
[root@localhost d2]# ll -i
总用量 28
103582179 drwxr-xr-x. 3 root root 16 10月 11 15:50 d3
67423074 lrwxrwxrwx. 1 root root 9 10月 11 16:07 test -> test_wait
33600273 -rwxr-xr-x. 1 root root 24664 9月 27 14:44 test_wait

我们从上面发现,执行文件的大小远远大于软链接,这是因为软链接也有自己的inode号,inode中存放的是执行文件的路径。
当删除执行文件的时候,执行文件和软链接的连接就不会存在,虽然留有文件名,但是不能再查找到源文件的内容了。

软硬链接的区别
1.硬链接和原文件有相同的inode号,不是一个独立文件,不能给目录进行硬链接。硬链接实际上是给原文件名起别名。
2.软链接和执行文件没有相同的inode号,是一个独立文件,目录也可以进行软链接。软链接实际上就是一个快捷方式。
文件的时间属性
通过stat+文件可以知道该文件的属性,属性里面包含有对文件操作的最新时间。

最近访问(Assess):最后的访问时间
最近更改(Modify):最后文件内容的修改时间
最近改动(Change):属性最后修改的时间
注:文件内容的修改时间一般会影响文件属性的修改时间,因为文件内容的更改,就会影响文件大小的变化,文件属性就会更改,而文件属性的修改时间一般不能影响文件内容的修改时间。
1536

被折叠的 条评论
为什么被折叠?



