<Linux基础I/O(2)>——《Linux》

目录

1.文件系统 

1.1 磁盘相关概念

1.2 inode

1.3 理解硬链接

1.4 理解软链接

1.5 软硬链接的区别:

1.6 写一段程序测试:​

1.7 acm

后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                           ——By 作者:新晓·故知


磁盘物理结构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 Groupext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子。
  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck inode的总量,未使用的blockinode的数量,一个blockinode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
  • GDTGroup 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 属性最后修改时间

后记:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                           ——By 作者:新晓·故知

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值