Linux文件系统

目录

①什么是文件系统:

②什么是逻辑块:

③文件系统组成结构(以ext2为例)

Boot Sector

Super Block 超级块

GDT 块组描述符表

Block Bitmap 块位图

Inode Bitmap 索引节点位图

Inode table

Data blocks 数据块

④读取文件过程     

⑤删除文件过程     


 

①什么是文件系统:


>>>对存储设备上数据组织的一种机制,为了查询存储数据

查看文件系统类型

#parted /dev/sda1

#print list

文件系统类型

>>>ext2(没有日志功能,被取代)、ext3(常用)、ext4(常用)

 


 

②什么是逻辑块:

>>>逻辑块:文件系统读写最基本的单元,大小是扇区的2^n

>>>逻辑块存在意义:减少读写次数, 提高硬盘读写效率

逻辑块是分区进行文件系统格式化所指定的最小存储单位

Block的大小在格式化完后就不能再改变了

>>>逻辑块不是越大越好:如一个逻辑块4kb,一个文件只有1kb,则存储该文件浪费了3k

>>>决定逻辑块大小的因素:文件读写效率、空间利用率

如果存储小文件,则block设置小一点,这样磁盘空间利用率高

如果存储大文件,则block设置大一点,这样磁盘的读写效率高

 

>>>考试题:10M的一个硬盘里1K的文件多少个?

前提:得知道这个硬盘的block size大小;

假设block size大小是1kb,能存多少这种大小的文件:10*1024/1=10240

假设block size大于1KB,会造成空间浪费

 


 

③文件系统组成结构(以ext2为例)

理解:

块组 Block Group:由等量的块组成的组

块组组成:(Super Group、GDT)、Block Bitmap、inodeBitmap、inode Table,Data Table

不一定包含超级块和GDT

 

Boot Sector

>>>一个分区:一个Boot Sector+一个文件系统(文件系统无权限管理、使用boot sector

>>>Boot Sector(引导块/启动块):用于存储磁盘分区信息和启动信息

 

Super Block 超级块

>>>描述整个分区文件系统的信息

块组0一定有Super Block,其他块组可能有 (备份)

>>>通过tune2fs命令查看某个具体分区超级块的内容与组成部分

tune2fs -l /dev/sda1

>>>Super Block记录
        文件系统版本、块组号(知道这个super block是在哪个块组)、块大小、

        每个组块的数量、分区空闲块数量、分区空闲索引节点、挂载时间、最后写数据时间

 

GDT 块组描述符表
>>>由每个块组的块组描述符组成的表
>>>块组描述符记录的是所在块组的块组信息 ,大小是32字节

>>>块组描述符存放了三个指针去存储block bitmapinode bitmapinode table的位置

还包含:该块组的空闲blocks和空闲inodes、被使用inodes

>>>Ext4中 super block 和 GDT 同时存在一个块组

>>>#dumpe2fs /dev/sda1|more :查看sda1分区的Super block和GDT信息

 

Block Bitmap 块位图

>>>对分区的块中的内容进行读写时,需要知道哪些块是空闲的,哪些块是已用的

>>>Block Bitmap作用:Block Bitmap标识了所在块组哪些block是已用的,哪些块是空闲的

>>>Block Bitmap本身需要占用一个块

 

Inode Bitmap 索引节点位图

Inode存储的数据(元数据)包含可使用stat命令查看这文件的Inode信息
>>>inode号、文件类型、权限、文件所有者、文件大小、时间戳

>>>最重要的是存储了一个指针指向属于该文件的Block

Inode Bitmap作用

>>>inode Bitmap标识了哪些inode是已用的,哪些inode是空闲的

如何找到某文件的数据

>>>读取某文件的inode,找到该文件的block,读取这些block获取某文件的数据

 

文件太大,指针不够用怎么办:采用分层结构

 

实际问题

在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。 

 

查找原因:

/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。 

 

解决方案:

1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。

2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,
使用/opt分区的inode来缓解/data分区inode不足的问题:

ln -s /opt/newcache /data/cache 

 

Inode table

Inode table包含:

>>>inode号、文件类型,权限,文件大小,时间戳,指向date block的指针

>>>文件名不存在inode table 而是在data blocks

 

Data blocks 数据块——真正存数据的地方

>>>文件名和目录名存储在数据块中

>>>对于符号链接文件,如果目标路径名较短,则保存在inode中以便更快查找
                                   如果目标路径名较长,则分配一个数据块来保存
    


 

④读取文件过程     

读取文件 /etc/passwd 过程:

[root@localhost ~]# ll -di / /etc /etc/passwd

          2 dr-xr-xr-x.  27 root root  4096 Sep 11 01:23 /

130818 drwxr-xr-x. 104 root root 12288 Sep 11 01:28 /etc

132225 -rw-r--r--.   1 root root  1799 Aug  7 04:36 /etc/passwd

>>>第一步:找到GDT,找到“/”的inode

>>>第二步:找到“/”的data blocks,找到etc的inode

>>>第三步:找到etc的data blocks,找到passwd的inode

>>>第四步:找到passwd的data blocks,并读取出来

 

 


 

⑤删除文件过程     

删除普通文件 /etc/jack/hello.txt 过程:

1.找到文件hello.txt的inode和data block(通过读取文件过程)

2.从属于hello.txt文件的inode中删除指向data block的指针

3.将inode号码资源释放(inode bitmap -> 0)

4.从jack目录的data block中删除hello.txt文件名

5.将block bitmap中属于hello.txt文件的block号释放(block bitmap -> 0)

 

删除目录文件 /etc/jack

1.找到目录jack和目录下的所有文件、子目录、子文件的inode和data block

2.在inode bitmap中将这些inode号释放

3.在block bitmap中将这些block号释放

4.再该目录的父目录的data block将该目录所在记录行删除

 

 


说明:

>>>以上内容是本人学习的总结

>>>如还有错误,请留言,指正

>>>亦可分享自己的想法,互相学习

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值