Linux---文件系统

一、文件系统的注意事项

①文件=内容+属性

②被打开的文件再内存中

③没有被打开的文件在磁盘中

④如何找到磁盘中的文件:目录

⑤文件系统的工作:帮助我们找到磁盘上的文件

二、磁盘

1.基础

①机械磁盘是计算机中唯一的一个机械设备

②磁盘是一种外设,和键盘显示器没区别

③离CPU远,运行速度曼

④容量大,价格便宜

2.物理结构

3.存储结构

扇区:磁盘存储数据的基本单位,一片扇区能存储512字节

一个盘片

多个盘片

磁道是二维的,柱面是三维的,二者是一个东西

过程:先选择柱面,然后等扇区,最后选磁头下落

三、CHS和LBA

1.CHS

①CHS是Cylind Head Sector 柱面 磁头 扇区,也就是磁盘寻址的过程

②对文件的存储就是将文件存储在一个或者多个扇区里

2.逻辑抽象

逻辑结构:将磁盘以扇区为单位拉直,就是一个数组,根据数组下标就可以找到每一个扇区

这种结构叫做LBA,也就是数组下标

注意:LBA数组下标从1开始,CHS从0开始(0号柱面,0号磁头...)

3.CHS和LBA地址的转化

①CHS转成LBA

Ⅰ磁头数*每磁道扇区数=单个柱面的扇区总数

Ⅱ LBA=柱面号C*单个柱面的扇区总数+磁头号H*每磁道扇区数+扇区号S+1

②LBA转成CHS

Ⅰ柱面号C=LBA/(磁头数*每磁道扇区数) 就是单个柱面的扇区总数

Ⅱ磁头号H=(LBA%(磁头数*每磁道扇区数))

Ⅲ扇区号S=(LBA%每磁道扇区数)+1

四、引入文件系统

1.块

①概念
其实硬盘是典型的"块"设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样
效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个"块"(block)。
硬盘的每个分区是被划分为⼀个个的"块"。⼀个"块"的⼤⼩是由格式化的时候确定的,并且不可
以更改,最常⻅的是4KB,即连续⼋个扇区组成⼀个 "块"。"块"是⽂件存取的最⼩单位

2.分区

将磁盘的空间分成几份,管好一份其他就可以使用相同的手段

3.分组(Block Group1)

①文件=内容+属性,内容和属性是分开存储的

②Linux中任何文件都要有自己的属性集合

③Data Blocks

存储内容,group中的大部分空间被其占据,以4kb为单位

④inode Table

属性集合,存储属性,底层是一个struct结构体,里边存储文件的属性

Ⅰ 文件属性的大小是一样的,在EXT2文件系统中是128字节

Ⅱ 文件名不会作为属性,保存在文件inode当中,原因是,文件名是字符串,大小会浮动

Ⅲ 每一个inode结构体,都会有一个inode编号inode_number,用来查找是输入哪一个文件的属性

Ⅳ 在Linux显示inode_number的指令是ls -li

⑤Block Bitmap:块位图,记录Data Blocks中哪个数据块已经被占用,哪个数据块没有被占用

⑥inode Bitmap:每个bit表示inode是否空闲可用

⑦下载东西时慢是因为要将数据存入Data Blocks和inode Table,同时将两个位图对应部分制1,而删除东西时,只需要将位图中的bit位置0,不清空数据,下次再下载其他东西时,DataBlocks和inode Table中被删除的位置数据可以被替代

⑧GDT

块组描述符表,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符。每个块组描 述符存储⼀个块组 的描述信息,如在这个块组中从哪⾥开始是inode Table,从哪⾥开始是Data Blocks,空闲的inode和数据块还有多少个等等。块组描述符在每个块组的开头都有⼀份拷⻉。

cpp 复制代码
struct ext2_group_desc
{
__le32 bg_block_bitmap; /* Blocks bitmap block */
__le32 bg_inode_bitmap; /* Inodes bitmap */
__le32 bg_inode_table; /* Inodes table block*/
__le16 bg_free_blocks_count; /* Free blocks count */
__le16 bg_free_inodes_count; /* Free inodes count */
__le16 bg_used_dirs_count; /* Directories count */
__le16 bg_pad;
__le32 bg_reserved[3];
};

⑨super Block
放⽂件系统本⾝的结构信息,描述整个分区的⽂件系统信息。记录的信息主要有:bolck 和 inode的总量,未使⽤的block和inode的数量,⼀个block和inode的⼤⼩,最近⼀次挂载的时间,最近⼀次写⼊数据的时间,最近⼀次检验磁盘的时间等其他⽂件系统的相关信息。Super Block的信息被破坏,可 以说整个⽂件系统结构就被破坏了
不是每一个组里边都有super Block,一个分区里边的每一个组里边的super Block完全相同

super Block一旦受影响,影响非常大,所以要存好几个

⑩inode和数据块可以跨组编号,不能跨分区编号,所以再同一个分区内部,inode编号和块号都是唯一的

4.目录

①文件名不会作为属性,保存在inode中,文件名保存在当前文件所属的数据内容当中

②磁盘上的文件系统只认inode,我们查找文件时没有使用过inode,而是用文件名,其实是路径+文件名,默认当前路径,因为文件名和inode有映射关系,所以文件名可以找到文件,文件名也是数据

③进程提供文件路径,找到任何Linux文件,都必须从根目录开始,进行路径解析,直到找到对应的路径,但是每次都从根目录找效率太低,所以OS会根据历史访问的路径在内存中自动生成一颗多叉树,,提高效率

④Linux中,在内核中维护树状路径结构的内核结构体叫做: struct dentry

cpp 复制代码
truct dentry {
    atomic_t d_count;
    unsigned int d_flags; /* protected by d_lock */
    spinlock_t d_lock; /* per dentry lock */
    struct inode *d_inode; /* Where the name belongs to - NULL is
    * negative */
    /*
    * The next three fields are touched by __d_lookup. Place them here
    * so they all fit in a cache line.
    */
    struct hlist_node d_hash; /* lookup hash list */
    struct dentry *d_parent; /* parent directory */
    struct qstr d_name;
    struct list_head d_lru; /* LRU list */
    /*
    * d_child and d_rcu can share memory
    */
    union {
    struct list_head d_child; /* child of parent list */
    struct rcu_head d_rcu;
    } d_u;
    struct list_head d_subdirs; /* our children */
    struct list_head d_alias; /* inode alias list */
    unsigned long d_time; /* used by d_revalidate */
    struct dentry_operations *d_op;
    struct super_block *d_sb; /* The root of the dentry tree */
    void *d_fsdata; /* fs-specific data */
    #ifdef CONFIG_PROFILING
    struct dcookie_struct *d_cookie; /* cookie, if any */

    #endif
    int d_mounted;
    unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */
};

⑤inode映射

五、软硬连接

1.软连接

①指令:ln -s 要链接的文件 链接后的名字

②软连接是一个独立文件,因为他有独立的inode

改变file.c中的内容file-soft的内容也会改变

③软连接本质上相当于windows中的快捷方式

④删除软连接

Ⅰ 直接rm

Ⅱ unlink

2.硬连接

①指令:ln 要连接文件 名称

②硬连接本质不是一个独立的文件,因为它没有独立的inode!

本质是一组新的文件名和inode_number的映射关系

③用途:进行备份

相关推荐
猪脚踏浪5 小时前
linux 拷贝文件或目录到指定的位置
linux
大树8821 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠21 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质21 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush421 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52021 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz1 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩1 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言