• <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 一个新文件来看看如何工 作。
    1. [root@localhost linux]# touch abc
    2. [root@localhost linux]# ls -i abc
    3. 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 的时候看到的除了看到文件名,还看到了文件元数据。
    1. [root@localhost linux]# ls -l
    2. 总用量 12
    3. -rwxr-xr-x. 1 root root 7438 "9月 13 14:56" a.out
    4. -rw-r--r--. 1 root root 654 "9月 13 14:56" test.c
    每行包含 7 列:
    • 模式
    • 硬链接数
    • 文件所有者
    • 大小
    • 最后修改时间
    • 文件名
    stat 命令能够看到更多信息
    1. [root@localhost linux]# stat test.c
    2. File: "test.c"
    3. Size: 654       Blocks: 8         IO Block: 4096   普通文件
    4. Device: 802h/2050d Inode: 263715     Links: 1
    5. Access: (0644/-rw-r--r--) Uid: (   0/   root)   Gid: (   0/   root)
    6. Access: 2017-09-13 14:56:57.059012947 +0800
    7. Modify: 2017-09-13 14:56:40.067012944 +0800
    8. Change: 2017-09-13 14:56:40.069012948 +0800
    上面的执行结果有几个信息需要解释清楚

    1.3 理解硬链接

    我们看到,真正找到磁盘上文件的并不是文件名,而是 inode 。 其实在 linux 中可以让多个文件名对应于同一个 inode。
    1. [root@localhost linux]# touch abc
    2. [root@localhost linux]# ln abc def
    3. [root@localhost linux]# ls -1i abc def 263466 abc 263466 def
    abc def 的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数, inode 263466 的硬连接数为 2
    我们在删除文件时干了两件事情: 1. 在目录中将对应的记录删除, 2. 将硬连接数 -1 ,如果为 0 ,则将对应 的磁盘释放。

    1.4 理解软链接

    硬链接是通过 inode 引用另外一个文件,软链接是通过名字引用另外一个文件,在 shell 中的做法
    1. 263563 -rw-r--r--. 2 root root 0 915 17:45 abc
    2. 261678 lrwxrwxrwx. 1 root root 3 915 17:53 abc.s -> abc
    3. 263563 -rw-r--r--. 2 root root 0 915 17:45 def

    1.5 软硬链接的区别:

    软链接是一个独立文件,有自己的inode和inode编号。换句话说,是Linux下的快捷方式!
    硬链接和目标文件使用的是同一个inode,就是单纯的在Linux指定的目录下,给指定的文件新增文件名和inode编号的映射关系!

    1.6 写一段程序测试:

      

    硬链接数: 

     硬链接用于路径切换!

    为什么创建普通文件,硬链接数默认是1?

    因为,普通文件的文件名,本身就和自己的inode具有映射关系,只有一个! 

    因此可以根据硬链接数估算文件里的目录个数! 

    1.7 acm

    下面解释一下文件的三个时间:

    Access 最后访问时间
    Modify 文件内容最后修改时间
    Change 属性最后修改时间

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

                                                                               ——By 作者:新晓·故知

  • 相关阅读:
    10 大数据科学Python库,你用过几个?
    Python解题 - CSDN周赛第11期 - 圆桌请客(脑筋急转弯)
    sklearn模型整理
    【ijkplayer】解码流程梳理(三)
    Java 复习笔记 - 面向对象进阶篇
    社交媒体搜索引擎优化及其重要性
    Autosar CAN硬件配置-Tc27x基于Davinci Cfg
    Golang常量iota
    拯救pandas计划(20)——统计零售商店的每月订单量
    【C++】用命名空间避免命名冲突
  • 原文地址:https://blog.csdn.net/m0_57859086/article/details/127530314