Linux文件系统
目录
①什么是文件系统:
>>>对存储设备上数据组织的一种机制,为了查询存储数据
查看文件系统类型
#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 bitmap、inode bitmap、inode 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 过程:
[[email protected] ~]# 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将该目录所在记录行删除
说明:
>>>以上内容是本人学习的总结
>>>如还有错误,请留言,指正
>>>亦可分享自己的想法,互相学习