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.块
①概念
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和数据块还有多少个等等。块组描述符在每个块组的开头都有⼀份拷⻉。
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
super Block一旦受影响,影响非常大,所以要存好几个
⑩inode和数据块可以跨组编号,不能跨分区编号,所以再同一个分区内部,inode编号和块号都是唯一的
4.目录
①文件名不会作为属性,保存在inode中,文件名保存在当前文件所属的数据内容当中
②磁盘上的文件系统只认inode,我们查找文件时没有使用过inode,而是用文件名,其实是路径+文件名,默认当前路径,因为文件名和inode有映射关系,所以文件名可以找到文件,文件名也是数据
③进程提供文件路径,找到任何Linux文件,都必须从根目录开始,进行路径解析,直到找到对应的路径,但是每次都从根目录找效率太低,所以OS会根据历史访问的路径在内存中自动生成一颗多叉树,,提高效率
④Linux中,在内核中维护树状路径结构的内核结构体叫做: struct dentry
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_PROFILINGstruct dcookie_struct *d_cookie; /* cookie, if any */#endifint 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的映射关系
③用途:进行备份
完