第四阶段提升
时 间:2023年8月29日
参加人:全班人员
内 容:
深入解析文件系统原理
目录
一、Inode and Block概述
(一)查看文件的inode信息:stat
(二)Atime、Mtime、Ctime详解:
(三)操作示例:
二、目录文件的结构
三、Inode的号码
(二)查看文件的inode号码
(三)文件存储位置对照
(四)删除指定inode号所对应的文件
(五)查看文件系统的inode与block的信息
(六)格式化时指定文件系统的inode个数与block大小
(七)解决inode耗尽导致的磁盘故障
四、Linux文件系统软硬链接原理
(一)硬链接(hard link)
(二)软链接(soft link)
(三)硬链接与软链接的对比
文件储存在硬盘上,硬盘的最小储存单位叫“扇区”(sector),每个扇区拥有512字节。
操作系统从硬盘上读取数据时,不会按照扇区的方式读取,这样读取效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(Block,由多个扇区的空间组成)。
这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成一个Block。Block存储文件数据。
文件数据存储在“块”中,那么还必须找到一个地方存储文件的元信息,比如文件的所属用户、文件所属组、文件的类型、文件的权限、文件的创建时间、文件的修改时间、文件的访问时间、文件使用的Block信息、文件的硬链接数、文件的大小等等属性信息。
这种储存文件元信息的区域叫做Inode。中文译名为“索引节点”,也叫i节点。
Inode 和 Block 是文件系统组成的基本核心概念,文件系统是在分区格式化的时候形成的,文件系统负责组织文件在分区上的存放的。
注意:
Inode不包含文件名。文件名是储存在目录的目录项中。
一个文件必须占用一个inode,至少占用一个block。
[root@localhost ~]# stat 1.txt
英文 |
别称 |
中文翻译 |
何时修改 |
查看命令 |
Access |
Atime |
访问时间 |
读取 |
ls -lu |
Modify |
Mtime |
修改时间 |
写入、修改 |
ls -l |
Change/Create |
Ctime |
改变时间/创建时间 |
修改文件名、写入、修改、改权限、做链接 |
ls -lc |
1、读取文件内容,查看Atime的改变:
[root@localhost ~]# echo haha > a.txt
[root@localhost ~]# stat a.txt
[root@localhost ~]# cat a.txt
[root@localhost ~]# stat a.txt
2、文件写入内容,查看Mtime/Ctime的改变
[root@localhost ~]# stat a.txt
[root@localhost ~]# echo hehe > a.txt
[root@localhost ~]# stat a.txt
3、修改文件权限,查看Ctime的改变
[root@localhost ~]# stat a.txt
[root@localhost ~]# chmod 777 a.txt
[root@localhost ~]# stat a.txt
4、创建硬链接,查看Ctime的修改
[root@localhost ~]# stat a.txt
[root@localhost ~]# ln /root/a.txt /tmp/a.txt
[root@localhost ~]# stat a.txt
5、修改文件名,查看Ctime的改变
[root@localhost ~]# stat a.txt
[root@localhost ~]# mv a.txt aa.txt
[root@localhost ~]# stat aa.txt
6、Touch更新时间,三个时间全部修改
[root@localhost ~]# stat aa.txt
[root@localhost ~]# touch aa.txt
[root@localhost ~]# stat aa.txt
目录也是一种文件
每个inode都有一个号码,操作系统用inode号码来识别不同的文件
文件系统内部不使用文件名引用文件,而是使用inode号码来识别文件。对于文件系统来说,文件名只是inode号码便于识别的别称,文件名是目录的数据。
(一)文件系统访问文件的步骤:
1.用户在目录中看到要访问的文件名
2.通过目录的数据找到这个文件名对应的inode号码
3.通过inode号码,获取inode信息(文件的元信息)
4.根据inode信息,找到文件数据所在的block,读出数据
inode一般为128字节或256字节,每个inode中都记录着文件所使用的block号,每条记录着block号的信息占用4字节。
inode中关于block号的记录一共包含有12个直接、1个间接、1个双间接和1个三间接。
12个直接连接,共占用48字节磁盘空间,包含着12个直接指向block号的信息, 若此文件系统默认的block大小为4KB,则仅仅可以指向12*4=48KB大小的文件内容。
然而我们的文件若较大时,则需要使用到更多的block,肯定要多于12个block,进而有间接、双间接和三间接。
间接:指的是inode中所记录这4字节的内容,所指向一个block,这个block中存放的不是真是的文件内容,而是真实文件所存放位置的block号信息,若每个block大小为4KB,那么可以存放1024个block号信息,1个间接可以存放的文件大小为1024*4=4096KB
双间接:则可以存放更大的文件内容,即在间接的基础上再进行间接,若此时block 大小为默认的4KB,则1个双间接可以存放的文件内容大小为:1024*1024*4=4096MB
三间接:即在双间接的基础上在进行间接,若此时block大小为默认的4KB,则1个三间接可以存放的文件内容大小为:1024*1024*1024*4=4096GB
也就是说,在一个block大小默认为4KB的文件系统中,一个文件最大存储可以达到48KB+4096KB+4096MB+4096GB,约为4100GB。
ls -i 文件名
stat 文件名
示例:
[root@localhost ~]# ls -i aa.txt
[root@localhost ~]# stat aa.txt
SuperBlock 里面存储的文件系统所有Inode、block的相关信息。
当一个用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它的inode,看该用户是否具有访问这个文件的权限。如果有,就指向相对应的数据block; 如果没有过,就返回Permission denied(拒绝访问)
格式:find ./ -inum inode号 -exec rm -i {} \;
示例:当文件名中包含特殊符号时我们可以删除其inode号达到删除文件的目的
[root@localhost ~]# touch 'a b`_c de ! 4|'.txt
[root@localhost ~]# ls -li
[root@localhost ~]# find ./ -inum 34097384 -exec rm -i {} \;
rm: 是否删除普通空文件 “./a b`_c de ! 4|.txt”? y
[root@localhost ~]# ls
从/root/目录下查找3天内修改的文件,并复制到/tmp下
[root@localhost ~]# ls /tmp/
[root@agent ~]# find /root/ -mtime -3 -a -type f -exec cp {} /tmp \;
df -i 设备名(文件系统已挂载时查询,查询inode总数与已用数量)
dumpe2fs -h 设备名(文件系统无需挂载)
tune2fs -l 设备名(文件系统无需挂载)
示例:
[root@localhost ~]# df -i /data
[root@localhost ~]# umount /data
[root@localhost ~]# dumpe2fs -h /dev/sdb1
[root@localhost ~]# tune2fs -l /dev/sdb1
mkfs.ext4 -N inode数 -b 块大小(单位字节) 设备名
示例:inode数设定为60000个,block大小为1KB
[root@localhost ~]# mkfs.ext4 -N 60000 -b 1024 /dev/sdb1
[root@localhost ~]# dumpe2fs -h /dev/sdb1 | grep -i "inode count"
[root@localhost ~]# dumpe2fs -h /dev/sdb1 | grep -i "block size"
1、删除不使用的文件,配置磁盘配额
[root@localhost ~]# find /data -mtime -1 -exec rm -rf {} \;
[root@localhost ~]# rm -rf `find /data -mtime -1` `` = $()
[root@localhost ~]# find /data -mtime -1 |xargs rm -rf
2.将文件备份,重新格式化此文件系统,指定较多的inode个数
[root@localhost ~]# df -i /test
[root@localhost ~]# touch /test/{1..28213}.txt
[root@localhost ~]# touch /test/hello.txt
使用第二种方法:
[root@localhost ~]# mkdir /backup
[root@localhost ~]# mv /test/* /backup/
[root@localhost ~]# umount /test
[root@localhost ~]# mkfs.ext4 -N 50000 /dev/sdb2 &> /dev/null
[root@localhost ~]# mount /dev/sdb2 /test
[root@localhost ~]# mv /backup/* /test
mv: overwrite `/test/lost+found'? y
[root@localhost ~]# touch /test/hello.txt
方法:ln 源文件 目标文件
特点:
硬链接指向的文件inode号,新生成的硬链接文件的inode号与源文件的inode号相同,不可针对目录进行硬链接,必须在同一文件系统内。删除一个文件名,不影响另外一个的访问。
示例:
[root@localhost ~]# df -h /data
[root@localhost ~]# cd /data
[root@localhost data]# ln a.txt hardlink-a.txt
[root@localhost data]# ls -li
删除源文件,硬链接不受影响
[root@localhost data]# echo "abc" > a.txt
[root@localhost data]# rm -rf a.txt
[root@localhost data]# cat hardlink-a.txt
方法:ln -s 源文件或目录 目标文件或目录
特点:
软连接又被称为符号链接
软链接指向的文件名,新生成的软链接文件的inode号与源文件不同,目录也可以生成软链接,软链接文件与源文件可以不在同一文件系统内,软链接文件的内容是源文件的路径,读取时系统会自动导向源文件路径,根据源文件找到文件内容,但当源文件移动或重命名时,软链接将报错。
示例:
[root@localhost data]# echo "soft test" > a.txt
[root@localhost data]# ln -s a.txt softlink-a.txt
[root@localhost data]# ll -i
重命名源文件,硬链接不受影响,但软链接失效
[root@huyang1 data]# ls -li
[root@huyang1 data]# ln a.txt hardlink.txt
[root@huyang1 data]# ls -li
[root@localhost data]# mv a.txt b.txt
[root@localhost data]# ls -li
[root@huyang1 data]# cat b.txt
[root@huyang1 data]# cat hardlink.txt
[root@localhost data]# cat softlink-a.txt
硬链接 |
软链接 |
|
指向 |
inode号 |
文件名 |
inode号是否相同 |
相同 |
不同 |
是否可以针对目录 |
不可针对目录 |
可以针对目录 |
可否跨文件系统 |
不可跨文件系统 |
可跨文件系统 |
删除、重命名、移动源文件 |
不受影响 |
失效 |
创建命令 |
ln 源文件 目标文件 |
ln -s 源文件或目录 目标文件或目录 |