inode和block概述
- 文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节
- block(块)
- 连续的八个扇区组成一个block(块),一个块是4K大小
- 是文件存取的最小单位
- 操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的
- 文件数据包括元信息(类似文件属性)与实际数据
- 文件数据存储在“块”中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode不包含文件名,文件名是存放在目录当中的。Linux系统中一切皆文件,因此目录也是一种文件
- inode(索引节点)
- 每个inode都有一个号码,操作系统用inode号来识别不同的文件。Linux内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个文件名
- 所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号:通过inode号码,获取inode信息:根据inode信息,看该用户是否具有访问这个文件的权限:如果有,就指向相对于的数据block,并读取数据
inode的内容
- 用stat命令查看某个文件的inode信息
- Linux系统文件三个主要的时间属性
- ctime(change time)
- 最后一次改动文件或目录(属性)的时间
- atime(access time)
- 最后一次访问文件的目录时间
- mtime(modify time)
- 最后一次**修改(变更)**文件或目录(内容)的时间
- 目录文件的结构
- 目录也是一种文件
- 目录文件的结构
- 每个inode都有一个号码,操作系统用inode号码来识别不同的文件
- Linux系统文件内部不使用文件名,而使用inode号码来识别文件
- 对于用户,文件名只是inode号码便于识别的别称
文件存储小结
- 硬盘分区后的结构
- 访问文件的简单流程
inode的大小
- inode也会消耗硬盘空间
- 每个inode的大小,一般是128字节或256字节
- 格式化文件系统时确定inode的总数
- 使用df -i命令可以查看每个硬盘分区的inode总数和已经使用的数量
inode的特殊作用
- 由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象
- 当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
- 移动或重命令文件时,只改变文件名,不影响inode号码
- 打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名
- 移动文件或重命名文件,只是改变文件名,不影响inode号码
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名
- 文件数据被修改保存后,公生成一个新的inode号码
- 通过inode号删除文件方法
find ./ -inum 52305140 -exec rm -i { } ;
find ./ -inum 50464299 -delete
模拟inode号节点被耗尽故障
1.使用fdisk /dev/sdb1,分区大小20M即可
fdisk /dev/sdb
2.格式化ext4类型,创建挂载的目录,挂载进去
mkfs.ext4 /dev/sdb1
mkdir /data
mount /dev/sdb1 /data
3.查看可用inode号的数量
4.模拟故障
或者可以使用
for ((i=1; i<=5136; i++));do touch /data/${i}.txt;done
5.删除文件恢复
rm -rf /data/*
案例:恢复EXT类型的文件
- extundelete是一个开源的Linux数据恢复工具,支持ext3、ext4文件系统。(ext4只能在centos6版本恢复)本人安装的是centos7所以以下试验为ext3
- 实验恢复ext类型文件
1.使用fdisk创建分区,格式化成ext3文件系统并挂载
fdisk /dev/sdb
mkfs.ext3 /dev/sdb1
mkdir /data
mount /dev/sdb1 /data
2.安装环境依赖包
yum -y install e2fsprogs-devel e2fsprogs-libs
cd /opt
tar jxvf extundelete-0.2.4.tar.bz2
cd extundelete-0.2.4/
./configure --prefix=/usr/local/extundelete
make
make install
cd /usr/local/extundelete/bin
ln -s /usr/local/extundelete/bin/extundelete /usr/bin
3.创建文件
cd /data
echo a > a
echo b > b
echo c > c
echo d> d
extundelete /dev/sdb1 --inode 2
4.删除创建的文件并解挂载来模拟故障
rm -rf a b
cd
umount /data
5.恢复
extundelete /dev/sdb1 --inode 2
extundelete /dev/sdb1 --restore-all
cd RECOVERED_FILES/
ls此时恢复的文件就在里面文件内容也在
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命令查看)
- 操作步骤
1.使用fdisk创建分区,格式化xfs文件系统创建一些文件目录
2.使用xfsdump 命令备份整个分区
xfsdump -f /opt/dump_sdb1 /dev/sdb1 -L dump_sdb1 -M sdb1
cd /opt
ls
3.模拟数据丢失并使用xfsrestore命令恢复
cd /data
rm -rf *
xfsrestore -f /opt/dump_xfs /data
ls -R查看最后被恢复的文件