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的映射关系

③用途:进行备份

相关推荐
LeenixP3 分钟前
RK3576-Debian12删除userdata分区
linux·运维·服务器·数据库·debian·开发板
qq_ceiling4 分钟前
H3C交换机配置M-LAG
运维·服务器·网络
warton8819 分钟前
ubuntu24 安装 proxsql 实现数据库代理
linux·运维·mysql·ubuntu
会跑的葫芦怪24 分钟前
cursor 打开wsl Ubuntu项目
linux·运维·ubuntu
土星云SaturnCloud29 分钟前
液冷技术的未来:相变冷却、喷淋冷却等前沿技术探索
服务器·人工智能·ai
用户467244544991 小时前
linux的网络配置
linux
Lueeee.1 小时前
字符设备驱动---自己实现点LED
linux
Full Stack Developme1 小时前
linux sudo su su - 三者区别
linux·运维·服务器
Byron Loong1 小时前
【系统】Linux内核和发行版的关系
linux·运维·服务器
weixin_399380692 小时前
OA 系统假死问题分析与优化
java·运维