目录
后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!
磁盘物理结构GIF:
1.文件系统
在Linux中,我们知道“Linux一切皆文件”,而不是所有的文件都会打开 。大量的文件,就在磁盘上,这些文件非常多、杂、乱。那么磁盘是如何进行管理的呢?那我们先了解一下磁盘:1.1 磁盘相关概念
磁盘的物理结构:(图片源于网络)磁盘是我们电脑上的一个机械设备(目前的笔记本电脑多采用SSD)。(图片源于网络)磁盘的存储结构:(图片源于网络)
磁盘上存储的基本单位是扇区。可以了解一下磁盘的寻址方式(例如:CHS寻址方式)。
磁盘的逻辑抽象结构:
将盘片想象成线性的结构,比如当做数组。那么对磁盘的管理转化成为了对数组空间的管理。这就转到了操作系统的LBA逻辑块地址。这就运用了之前的先描述、再组织的方式。
比如:逻辑地址快LBA:3234,假设有4面磁盘片面,数据总大小为4000,则每面1000,假设每面有20个磁道。
3234/1000=3 即在第3面
3234%1000=234
234/20=11
234%20=14
CHS寻址:
C:11
H:3
S:14
磁盘的基本单位是:扇区(常规是512字节)
文件系统访问磁盘的基本单位是:4KB
为什么会设置成这样?
1.提高I/O效率
2.不要让软件(OS)设计和硬件(磁盘)具有强相关性,换句话说,就是解耦合!
我们之前说过,文件=内容+属性。这两个都是数据,都要存储,而Linux采用的是将内容和属性数据分开存储的方案!
- 内容存储在block中,其大小为4KB,且会随着使用可能不断增多;
- 属性存储在inode中,inode就是磁盘上的另一份空间,其大小为128B,并且文件的属性是稳定的!即使后面会改动,也只是在数值上改动,其属性一般不会改动!
1.2 inode
为了能解释清楚inode我们先简单了解一下文件系统:Linux ext2 文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block 。一个 block 的大小是由格式化的时候确定的,并且不可以更改。例如 mke2fs 的 -b 选项可以设定block 大小为 1024 、 2048 或 4096 字节。而上图中启动块( Boot Block )的大小是确定的
- Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子。
- 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
- GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下
- 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
- inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
- i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等
- 数据区:存放文件内容
将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过 touch 一个新文件来看看如何工 作。[root@localhost linux]# touch abc [root@localhost linux]# ls -i abc 263466 abc
为了说明问题,我们将上图简化:创建一个新文件主要有一下 4 个操作:1. 存储属性内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。2. 存储数据该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。3. 记录分配情况文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。4. 添加文件名到目录新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文 件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来查看一个文件的inode:
1.那么一个inode(文件,属性)如何 和 属于自己的内容关联起来呢?
在inode 中有描述inode的struct inode{
//文件的所有属性
blocks[15]: //假设大小为15
}
[0,11]:直接保存的就是该文件对应的blocks编号!
[12,15]:指向一个Data block,但是这个Data block不保存有效数据,而保存该文件所使用的其他块的编号!2.其实在Data blocks中,也有4KB大小可以保存其他块的编号!
如果相当于二级索引,如果实在不够,那可以再开辟一块,三级索引!3.文件名是文件的属性吗?
是,但inode里面并不保存文件名!换句话说,Linux,底层实际上是通过inode编号标识文件的!4.要找到文件,必须找到文件的inode 编号!
关于目录权限问题的回顾:
进入目录:x权限
创建文件:w权限
查看文件:r权限1.当我们创建一个文件,OS做了什么?
通过文件名:inode编号—>找到自己所处的目录—>根据目录的inode,找到目录的Data blocks —>将文件名和inode编号的映射关系写入到目录的数据块中!2.当我们删除一个文件,OS做了什么?
找到自己写入时的标记,然后找到inode Bitmap和block Bitmap将其由1置为0.其实OS并没有真正的清楚数据!Linux通过日志的方式记录inode编号,如果想要恢复数据也是可以的,但麻烦!3.如果知道所处的目录,就能知道目录的inode吗?
不能,因为本级目录的inode存储在上级相应的空间中,而上级存储在上上级,因此最终追溯到根目录!
我们使用 ls -l 的时候看到的除了看到文件名,还看到了文件元数据。[root@localhost linux]# ls -l 总用量 12 -rwxr-xr-x. 1 root root 7438 "9月 13 14:56" a.out -rw-r--r--. 1 root root 654 "9月 13 14:56" test.c
每行包含 7 列:
- 模式
- 硬链接数
- 文件所有者
- 组
- 大小
- 最后修改时间
- 文件名
stat 命令能够看到更多信息[root@localhost linux]# stat test.c File: "test.c" Size: 654 Blocks: 8 IO Block: 4096 普通文件 Device: 802h/2050d Inode: 263715 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2017-09-13 14:56:57.059012947 +0800 Modify: 2017-09-13 14:56:40.067012944 +0800 Change: 2017-09-13 14:56:40.069012948 +0800
上面的执行结果有几个信息需要解释清楚1.3 理解硬链接
我们看到,真正找到磁盘上文件的并不是文件名,而是 inode 。 其实在 linux 中可以让多个文件名对应于同一个 inode。[root@localhost linux]# touch abc [root@localhost linux]# ln abc def [root@localhost linux]# ls -1i abc def 263466 abc 263466 def
abc 和 def 的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数, inode 263466 的硬连接数为 2 。我们在删除文件时干了两件事情: 1. 在目录中将对应的记录删除, 2. 将硬连接数 -1 ,如果为 0 ,则将对应 的磁盘释放。1.4 理解软链接
硬链接是通过 inode 引用另外一个文件,软链接是通过名字引用另外一个文件,在 shell 中的做法263563 -rw-r--r--. 2 root root 0 9月 15 17:45 abc 261678 lrwxrwxrwx. 1 root root 3 9月 15 17:53 abc.s -> abc 263563 -rw-r--r--. 2 root root 0 9月 15 17:45 def
1.5 软硬链接的区别:
软链接是一个独立文件,有自己的inode和inode编号。换句话说,是Linux下的快捷方式!硬链接和目标文件使用的是同一个inode,就是单纯的在Linux指定的目录下,给指定的文件新增文件名和inode编号的映射关系!1.6 写一段程序测试:
硬链接数:
硬链接用于路径切换!
为什么创建普通文件,硬链接数默认是1?
因为,普通文件的文件名,本身就和自己的inode具有映射关系,只有一个!
因此可以根据硬链接数估算文件里的目录个数!
1.7 acm
下面解释一下文件的三个时间:Access 最后访问时间Modify 文件内容最后修改时间Change 属性最后修改时间