一、文件系统的注意事项
①文件=内容+属性
②被打开的文件再内存中
③没有被打开的文件在磁盘中
④如何找到磁盘中的文件:目录
⑤文件系统的工作:帮助我们找到磁盘上的文件
二、磁盘
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的映射关系


③用途:进行备份
完