文章目录
一、深入理解Linux文件系统
1.inode和block概述
文件数据包括元信息与实际数据
文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节
block(块)
- 连续的八个扇区组成一个block
- 是文件存取的最小单位
inode(索引节点)
- 中文译名为“索引节点”,也叫i节点
- 用于存储文件元信息
2.inode的内容
inode 包含很多的文件元信息,但不包含文件名,例如:
- 文件的字节数
- 文件拥有者的 UserID
- 文件的 GroupID
- 文件的读、写、执行权限
- 文件的时间戳
- …
使用 stat 命令即可查看某个文件的 inode 信息
[root@localhost ~]# stat anaconda-ks.cfg
Linux 系统文件有三个主要的时间属性
- ctime(change time)
最后一次改变文件或目录(属性)的时间 - atime(access time)
最后一次访问文件或目录的时间 - mtime(modify time)
最后一次修改文件或目录(内容)的时间
目录文件的结构 - 目录也是一种文件
- 目录文件的结构如下图:
每个inode都有一个号码,操作系统用inode号码来识别不同的文件 Linux系统内部不使用文件名,而使用inode号码来识别文件对于用户,文件名只是inode号码便于识别的别称
(1)inode的号码
用户在访问文件时,表面上是用户通过文件名来打开文件,而实际系统内部的过程分成以下三步:
- 系统找到这个文件名对应的 inode 号码
- 通过 inode 号码,获取 inode 信息
- 根据 inode 信息,找到文件数据所在的 block,并读出数据
常见的查看 inode 号码的方式有两种:
ls -i
命令:直接查看文件名所对应的 inode 号码stat
命令:通过查看文件 inode 信息而查看到 inode 号码
[root@localhost ~]# stat anaconda-ks.cfg
或者
[root@localhost ~]# ls -i anaconda-ks.cfg
所以,当用户在 Linux 系统中试图访问一个文件时,系统会先根据文件名去查找它对应的 inode,看该用户是否具有访问这个文件的权限。如果有,就指向相对应的数据 block, 如果没有,就返回 Permission denied。
一块硬盘分区后的结构则是如下图所示:
(2)文件存储小结
(3)inode的大小
inode 也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区,存放inode 所包含的信息。每个 inode 的大小,一般是 128 字节或 256 字节。通常情况下不需要关注单个 inode的大小,而是需要重点关注 inode 总数。inode 的总数在格式化时就给定了,执行“df -i”命令即可查看每个硬盘分区对应的的inode 总数和已经使用的 inode 数量。
[root@localhost ~]# df -i
由于 inode 号码与文件名分离,导致一些Unix/Linux 系统具备以下几种特有的现象:
- 文件名包含特殊字符,可能无法正常删除。这时直接删除 inode,能够起到删除文件的作用
- 移动文件或重命名文件,只是改变文件名,不影响 inode 号码
- 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名
这种情况使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。 因为系统通过 inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode 则被回收。
3.链接文件
在 Linux 系统下的链接文件有两种,一种类似于 Windows的快捷方式功能的文件,可以快速连接到目标文件或目录,称之为软链接;另一种则是通过文件系统的 inode链接来产生的新文件名,而不是产生新文件,称之为硬链接。
①硬链接
一般情况下,文件名和 inode 号码是一一对应关系,每个 inode 号码对应一个文件名。但是 Linux 系统允许多个文件名指向同一个inode 号码。这意味着,可以用不同的文件名访问同样的内容。
硬链接的创建命令的基本格式为:
运行该命令以后,源文件与目标文件的 inode 号码相同,都指向同一个 inode。inode信息中的“链接数”这时就会增加 1 。
当一个文件拥有多个硬链接时,对文件内容修改,会影响到所有文件名;但是删除一个文件名,不影响另一个文件名的访问。删除一个文件名,只会使得inode 中的"链接数"减 1。需要注意的是不能对目录做硬链接。
通过 mkdir 命令创建一个新目录/app/kgc,其硬链接数应该有 2 个,因为常见的目录本身为 1 个硬链接,而目录 kgc下面的隐藏目录.(点号)是该目录的又一个硬链接,也算是1 个连接数。
②软连接
软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件 的文件名。例如,文件 A 和文件 B 的 inode 号码虽然不一样,但是文件 A 的,内容是文件B 的路径。读取文件 A 时,系统会自动将访问者导向文件 B。这时,文件 A 就称为文件 B 的“软链接”(soft link)或者“符号链接(symbolic link)。
这意味着,文件 A 依赖于文件 B 而存在,如果删除了文件 B,打开文件 A 就会报错。这是软链接与硬链接最大的不同:文件 A 指向文件 B 的文件名,而不是文件 B 的 inode 号码,文件 B 的 inode“链接数”不会因此发生变化。
软链接的创建命令的基本格式为:
4.EXT 类型文件恢复
删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录里面的 block 中,删除这个文件的名字。Linux 是通过 Link 的数量来控制文件删除的,只有当一个文件不存在任何 Link 的时候,这个文件才会被删除。
在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过“回收站”找回的情况,比如使用“rm
-rf”来删除数据。针对 Linux 下的 EXT 文件系统,可用的恢复工具有 debugfs、ext3grep、extundelete 等。 其中 extundelete 是一个开源的 Linux 数据恢复工具,支持 ext3、ext4 文件系统。
在数据被误删除后,第一时间要做的就是卸载被删除数据所在的分区,如果是根分区的数据遭到误删,就需要将系统进入单用户模式,并且将根分区以只读模式挂载。这样做的原 因很简单,因为将文件删除后,仅仅是将文件的 inode 节点中的扇区指针清零,实际文件还存储在磁盘上,如果磁盘继续以读写模式挂载,这些已删除的文件的数据块就可能被操作系统重新分配出去,在这些数据库被新的数据覆盖后,这些数据就真的丢失了,恢复工具也回 天无力。所以以只读模式挂载磁盘可以尽量降低数据库中数据被覆盖的风险,以提高恢复数 据成功的比例。
实验
[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs
[root@localhost ~]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar. bz2
[root@localhost ~]# tar -jxvf extundelete-0.2.4.tar.bz2
[root@localhost ~]# cd extundelete-0.2.4
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete&& make && make install
[root@localhost extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/
[root@localhost ~]# fdisk -l
[root@localhost ~]# fdisk /dev/sdb ###进入并创建硬盘分区
[root@localhost ~]# mkfs.ext3 /dev/sdb1
[root@localhost ~]# mkdir /data/
[root@localhost ~]# mount /dev/sdb1 /data/
[root@localhost ~]# cd /data/
[root@localhost test]# echo a > a
[root@localhost test]# echo b > b
[root@localhost test]# echo c > c
[root@localhost test]# echo d > d
[root@localhost test]# ls
[root@localhost test]# rm -rf a b ###模拟故障
[root@localhost ~]# umount /data/ ###开始恢复
[root@localhost ~]# extundelete /dev/sdb1 --restore-all
[root@localhost ~]# ls
[root@localhost ~]# cd RECOVERED_FILES/
[root@localhost RECOVERED_FILES]# ls ###可以查看到被删除的a和b
5.xfs 类型文件备份和恢复
extundelete 工具仅可以恢复 EXT 类型的文件,无法恢复 CentOS 7 系统默认采用 xfs 类型的文件。针对 xfs 文件系统目前也没有比较成熟的文件恢复工具,所以建议提前做好数据备份,以避免数据丢失。
xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。若系统中未安装xfsdump 与xfsrestore 工具,可以通过yum install -y xfsdump 命令安装。xfsdump 按照inode 顺序备份一个 xfs 文件系统。xfsdump 的备份级别有两种:0 表示完全备份;1-9 表示增量备份。xfsdump 的备份级别默认为 0。xfsdump 的命令格式为:xfsdump -f备份存放位置要备份路径或设备文件。
常用的备份参数包括以下几种:
- f:指定备份文件目录;
- L:指定标签 session label;
- M:指定设备标签 media label;
- s:备份单个文件,-s 后面不能直接跟路径。
实验
[root@localhost ~]# fdisk /dev/sdb ###进入并创建硬盘分区
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# mkfs.xfs /dev/sdb1
[root@localhost ~]# mkdir /date
[root@localhost ~]# mount /dev/sdb1 /date/
[root@localhost ~]# cd /date
[root@localhost date]# cp /etc/passwd ./
[root@localhost date]# mkdir test
[root@localhost date]# touch test/a
[root@localhost date]# tree /date
[root@localhost ~]# xfsdump -f /opt/dump_sdb1 /dev/sdb1 ###使用 xfsdump 命令备份整个分区
please enter label for this dump session (timeout in 300 sec)
-> dump_sdb1 ###指定备份会话标签
please enter label for media in drive 0 (timeout in 300 sec)
-> sdb1 ###指定设备标签,就是对要备份的设备做一个描述
[root@localhost ~]# xfsdump -I ###查看备份信息与内容
[root@localhost ~]# cd /date/ ###开始删除之前创建的内容,模拟数据丢失
[root@localhost date]# ls passwd test
[root@localhost date]# rm -rf ./*
[root@localhost date]# ls
[root@localhost ~]# xfsrestore -f /opt/dump_sdb1 /date/ ###开始恢复
[root@localhost ~]# ls /date/
使用 xfsdump 时,需要注意以下的几个限制:
- xfsdump 不支持没有挂载的文件系统备份,所以只能备份已挂载的;
- xfsdump 必须使用 root 的权限才能操作(涉及文件系统的关系);
- xfsdump 只能备份 XFS 文件系统;
- xfsdump 备份下来的数据(档案或储存媒体)只能让 xfsrestore 解析;
- xfsdump 是透过文件系统的 UUID 来分辨各个备份档的,因此不能备份两个具有相同
UUID 的文件系统。
二、分析日志文件
1.日志文件
2.内核及系统日志