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

③用途:进行备份

相关推荐
十八旬6 小时前
苍穹外卖项目实战(day11-1)-记录实战教程、问题的解决方法以及完整代码
服务器·数据库·windows·redis
花开富贵贼富贵6 小时前
Nginx核心配置
运维·nginx
浅拾光º6 小时前
mysql重启,服务器计划重启,如何优雅地停止MySQL?
服务器·mysql·adb
许怀楠6 小时前
【Linux】环境变量
linux
CC.GG6 小时前
【Linux】Linux编辑器--vim
linux·编辑器·vim
满天点点星辰6 小时前
Linux命令大全-usermod命令
linux·运维
欲掩6 小时前
Shell脚本
linux
Lynnxiaowen6 小时前
今天继续学习nginx服务部署与配置
linux·运维·服务器·学习·nginx
程序员大辉6 小时前
请卸载xshell,一款国产的终端工具,界面漂亮,功能强大,支持win,mac,linux平台,安全免费
linux·运维·macos