深入理解LINUX文件系统

Posted Shmily冰魄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解LINUX文件系统相关的知识,希望对你有一定的参考价值。

inode与block概述

文件数据包括元信息与实际数据
文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节
block(块)连续的八个扇区组成一个block(一个块是4k大小)是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。
文件数据包括实际数据与信元信息(类似文件属性)。文件数据存储在“块“中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域叫做inode。因此,一个文件必须占用一个inode,并且至少占用一个block。
inode不包含文件名。文件名时存放在目录当中的,linux系统中一切皆文件,因此目录也是一种文件。
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名知识inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。
所以,当用户在linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码:通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据,如果无,告知没有权限。
inode(索引节点):中文译名为“索引节点”,也叫i节点,用于存储文件元信息。

inode包含文件的元信息(不包含文件名)

1、文件的字节数,2、文件拥有者的User ID,3、文件的Group ID,4、文件的读、写、执行权限,5、文件的时间戳

查看文件名对应的inode号码有两种方式:

ls -i 文件名


stat 文件名
stat查看inode号的信息时候有三个时间:
atime(accesstime):当使用这个文件的时候就会更新这个时间
mtime(modification time):当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别。
ctime(status time):当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,更像是change time,只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间。


inode也会消耗磁盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。每个inode的大小,一般是128字节或256字节。
通常情况下不需要关注这单个inode的大小,而是需要重点关注inode总数。inode的总数在格式化时就给定了,执行"df -i"命令即可查看每个硬盘分区对应的inode总数和已经使用的inode数量。

由于inode号码与文件名 分离,导致linux系统具备以下几种特有的现象:
1、文件名包含特殊字符,可能无法正常删除。这时直接删除inode,能够起到删除文件的作用。
2、移动文件或重命名文件,只是改变文件名,不影响inode号码;
3、打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。
4、使用 vi 编辑器修改文件数据保存后,会生成一个新的inode号码。

目录文件的结构

目录也是一种文件
目录文件的结构
文件名1 inode号码1
文件名2 inode号码2

每个inode都有一个号码,操作系统用inode号码来识别不同的文件
linux系统内部不适用文件名,而使用inode号码来识别文件
对于用户,文件名只是inode号码便于识别的别称


用户通过文件名打开文件时,系统内部的过程
1、系统找到这个文件名对应的inode号码
2、通过inode号码,获取inode信息
3、根据inode信息,找到文件数据所在的block,读取数据


删除某一个inode号的两种方法
find ./ -inum 52305120 -exec rm -i {} \\;
find ./ -inum 52305120 -delete


实验

实验一:inode节点耗尽故障处理

使用fdisk创建分区/dev/sdb1,分区大小20M即可
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkdir /test
mount /dev/sdb1 /test
df -i ==//模拟inode节点耗尽故障==
for ((i=1; i<=7680; i++)); do touch /test/file$i;done
或者使用 touch {1..7680}.txt
df -i
df -hT
/删除文件恢复
rm -rf /text/*









实验二:恢复EXT类型的文件

编译安装extundelete软件包
安装依赖包
yum -y install e2fsprogs-devel e2fprogs-libs ==//一定要安装这两个依赖包==
编译安装 extundelete
cd /text
wget http://nchc.dl.sourceforge.net/project/extundelete/0.2.4/extundelet-0.2.4.tar.bz2
tar jxvf extundelete-0.2.4.tar.bz2
cd extundelete-0.2.4/
./configure --prefix=usr/local/extundelete && make && make install
ln -s /usr/local/extundelete/bin/* usr/bin/
echo 1 > a
echo 2 > b
echo 3 > c
echo 4 > d
ls
extundelete /dev/sdc1 --inode 2 ==//查看文件系统/dev/sdc1下存在那些文件,i节点是从2开始的,2代表该文件系统最开始的目录。==
rm -rf a b
extundelete /dev/sdc1 --inode 2
cd ~
umount /test
extundelete /dev










实验三:恢复XFS类型的文件

xfsdump 命令格式

xfsdump -f 备份存放位置 要备份的路径或设备文件
xfsdump 备份级别(默认为0)
0:完全备份
1-9:增量备份

xfsdump 常用选项
-f:指定存储目的地
-L:指定转储会话的标签
-M:为第一个媒体对象指定一个标签(例如,tape car‐tridge) 在会话期间写入相应的目的地。
-s:将转储限制为包含在指定路径名中的文件

模拟删除并执行恢复操作





以上是关于深入理解LINUX文件系统的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Linux文件系统与日志分析

深入理解Linux文件系统之文件系统挂载(下)

深入理解linux系统下proc文件系统内容

深入理解linux系统下proc文件系统内容

深入理解Linux文件系统与日志分析

深入理解Linux文件系统之文件系统挂载(上)