图文详解——inode与block,模拟inode号耗尽、EXT和XFS类型文件恢复
一、inode与block
1、概论
扇区(sector)
- 文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。
块(block)
- 一般连续八个扇区组成一个"块"(block),一个块是4K大小,是文件存取的最小单位,文件数据存储在“块”中。
- 操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。
索引节点(inode)
- 文件数据包括实际数据与元信息(类似文件属性)。
- 文件数据存储在"块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode。
- 因此一个文件必须占用一个inode,并且至少占用一个 block。
- inode不包含文件名。文件名是存放在目录当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
- 每个inode都有一个号码。操作系统用inode号码来识别不同的文件。Linux内部不使用文件名,而使用inode号来识别文件。
- 文件名只是inode号便于识别的别称。文件名和inode号是一一对应的关系,每个inode号都对应一个文件名。
系统访问文件过程
- 当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码;通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。
2、查看文件名对应的inode号的方式
第一种方式: ls -i 文件名
第二种方式: stat 文件名
3、注意事项
- inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盏分成两个区域。
- 一个是数据区,存放文件数据;
- 另一个是inode区,存放inode所包含的信息。
- 每个inode的大小,一般是128字节或256字节。
- 通常情况下不需要关注单个inode的大小,而是需要重点关注inode总数。inode的总数在格式化时就给定了。
- 执行“df -i”命令即可查看每个硬盘分区对应的的inode总数和已经使用的inode数量。
4、特点
由于inode号码与文件名分离,导致Linux系统具备以下几种特有的现象:
- 1、文件名包含特殊字符,可能无法正常删除。这时直接删除inode,能够起到删除文件的作用。
- 2、移动文件或重命名文件,只是改变文件名,不影响inode号码。
- 3、打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。
- 4、文件数据被修改保存后,公生成一个新的inode号码。
5、Linux系统文件的三个主要的时间属性
- ctime(change time)
- 最后一次改变文件或目录(属性)的时间
- atime(access time)
- 最后一次访问文件或目录的时间
- mtime(modify time)
- 最后一次修改文件或目录(内容)的时间
二、inode节点耗尽故障处理
1、进行分区
2、格式化成ext4格式
3、进行挂载,并删除挂载目录内已有文件
4、模拟故障
5、查看inode号和占用空间大小情况
6、恢复方式:删除无用文件,以恢复节点数
三、EXT文件误删除处理办法
1、导入extundelete软件包
- extundelete 是一个开源的 Linux 数据恢复工具,支持 ext3、ext4 文件系统(ext4只能在CentOS7版本恢复)
2、安装环境依赖包
3、安装extundelete软件
4、挂载目录内创建文件,并赋予内容,然后查看inode号
5、删除刚刚创建的文件,并解挂载,用来模拟故障
6、进行恢复操作
四、xfs类型文件备份和恢复
1、xfs类型文件备份和恢复
- CentOS 7 系统默认采用 xfs类型的文件,xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。
- xfsdump的备份级别有两种
- 0表示完全备份(默认为0)
- 1-9表示增量备份
xfsdump 命令格式 | xfsdump -f 备份存放位置 要备份的路径或设备文件 | |
xfsdump 命令常用的选项 | -f | 指定备份文件目录 |
---|---|---|
-L | 指定标签 session label | |
-M | 指定设备标签 media label | |
-s | 备份单个文件,-s 后面不能直接跟路径 | |
xfsdump使用限制 | 只能备份已挂载的文件系统 | |
必须使用root的权限才能操作 | ||
只能备份 XFS 文件系统 | ||
备份后的数据只能让 xfsrestore 解析 | ||
不能备份两个具有相同 UUID 的文件系统(可用 blkid命令查看) |