Bootstrap

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

一.inode和block概述

文件数据包括元信息与实际数据
文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节

1.block(块)

连续的八个扇区组成一个block
是文件存取的最小单位,文件存储的最小单位为块8个扇区组成为4k

2.inode(索引节点)

中文译名为“索引节点”,也叫节点
用干存储文件元信息
每个文件的属性信息,比如:文件的大小,时间,类型,权限等,称为文件的元数据(meta data)
元数据是存放在inode (indexnode)表中。inode表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。

2.1每一个inode表记录对应的保存了以下信息:

● inode number节点号
●文件类型
●权限
●UID
●GID
●链接数(指向这个文件名路径名称个数)
●该文件的大小和不同的时间戳
●指向磁盘上文件的数据块指针
●有关文件的其他数据
不包括文件名

2.2用stat命令可以查看某个文件的inode

信息示例:stat aa.txt

二.Linux系统文件三个主要的时间属性

atime(access time) 最后一次访问文件或目录的时间
mtime(modify time) 最后一次修改文件或目录权限(内容)的时间
ctime(change time) 最后一次改变文件或目录(属性)的时间

[root@localhost zhou]# touch 1.txt
[root@localhost zhou]# stat 1.txt
  File: ‘1.txt’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 997329      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-09-22 16:32:00.382951444 +0800
Modify: 2021-09-22 16:32:00.382951444 +0800
Change: 2021-09-22 16:32:00.382951444 +0800
 Birth: -
[root@localhost zhou]# vim 1.txt
[root@localhost zhou]# stat 1.txt
  File: ‘1.txt’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 997329      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-09-22 16:32:17.604951405 +0800
Modify: 2021-09-22 16:32:00.382951444 +0800
Change: 2021-09-22 16:32:00.382951444 +0800
 Birth: -
[root@localhost zhou]# echo "111" > 1.txt
[root@localhost zhou]# stat 1.txt
  File: ‘1.txt’
  Size: 4         	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 997329      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-09-22 16:32:17.604951405 +0800
Modify: 2021-09-22 16:33:41.418951215 +0800
Change: 2021-09-22 16:33:41.418951215 +0800
 Birth: -
[root@localhost zhou]# 

当新创建一个文件时,这个文件的最后访问时间、最后内容修改时间、最后状态更新时间都是一致的。修改一个文件的权限状态信息,只会更新这个文件的最后状态修改时间
对比事例2,这里最后状态时间、最后内容改变时间都被更新了。当修改一个文件时,文件的Modify、Change会被更新
新建文件时,三种时间状态一样
当使用echo,没有打开文件,最后两种变
当改变权限,最后一种变
当使用VIM,只有第一种变

三.目录文件的结构

目录也是一种文件
目录文件的结构

文件名1inode号码1
文件名2inode号码2
。。。。。。。。

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

目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系文件引用一个是inode号
是通过文件名来引用一个文件
一个目录是目录下的文件名和文件inode号之间的映射
每个inode都有一个号码,操作系统用inode号码来识别不同的文件
Linux系统内部不使用文件名,而使用inode号码来识别文件
对于用户,文件名只是inode号码便于识别的别称

[root@localhost zy]# ls -i
51843566 1.txt
[root@localhost zy]# find -inum 51843566 -delete


四.文件存储小结

1.硬盘分区后的结构

在这里插入图片描述

2.访问文件的简单流程

不是
用户访问文件
系统查找文件对应的inode
判断用户是否具备访问权限
指向对应的数据block
返回Permission denide

3. inode的大小

inode也会消耗硬盘空间
每个inode的大小
一般是128字节或256字节
格式化文件系统时确定inode的总数
使用df-i命令可以查看每个硬盘分区的inode总数和已经使用的数量

五.inode号特殊作用

由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象
1.当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
2.移动或重命名文件时,只改变文件名,不影响inode号码
3.打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名

cp命令和inode:
分配一个空闲的inode号,在inode表中生成新条目
在目录中创建一个目录项,将名称与inode编号关联
拷贝数据生成新的文件
rm命令和inode:
链接数递减,从而释放的inode号可以被重用
把数据块放在空闲列表中
删除目录项
数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
mv和inode
如果mv命令的目标和源在同一设备,
不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
删除旧的目录对应关系新建目录对应关系

六.文件恢复extundelete

删除一个文件,实际上并不清除inode节点和block的数据,只是在这个文件的父目录里面的block中,删除这个文件的名字。Linux是通过Link的数量来控制文件删除的,只有当一个文件不存在任何Link的时候,这个文件才会被删除。
在Linux系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过"回收站"找回的情况,比如使用"rm -rf"来删除数据。针对Linux下的EXT文件系统,可用的恢复工具有debugfs、 ext3grep、extundelete等。其中extundelete是一个开源的Linux数据恢复工具,支持ext3文件系统。

使用extundelete工具如何恢复误删除的文件步骤:
在编译安装extundelete之前需要先安装两个依赖包e2fsprogs-libs和e2fsprogs-devel,这两个包在系统安装光盘的/Package目录下就有,使用rpm或yum命令将其安装。

[root@localhost ~]# yum install e2fsprogs-devel e2fsprogs-libs -y    先安装2个依赖包
[root@localhost ~]# cd /opt                                      把安装文件拖入/opt下
[root@localhost opt]# rz -E
rz waiting to receive.
[root@localhost opt]# tar jxvf extundelete-0.2.4.tar.bz2                解压缩该文件
[root@localhost extundelete-0.2.4]# ls
acinclude.m4  config.h.in   depcomp     Makefile.am  README
aclocal.m4    configure     install-sh  Makefile.in  src
autogen.sh    configure.ac  LICENSE     missing
[root@localhost extundelete-0.2.4]# ./configure                          编译安装
Configuring extundelete 0.2.4
Writing generated files to disk
[root@localhost extundelete-0.2.4]# make
[root@localhost extundelete-0.2.4]# make install


验证恢复,只对ext3文件有效
[root@localhost ~]# df -Th|tail -n 2                     创建分区并挂载
/dev/sdb1               ext3      9.8G   23M  9.2G   1% /zy1
/dev/sdb2               ext4      9.8G   37M  9.2G   1% /zy2
[root@localhost zy1]# echo a>a             在只zy1和zy2里建立同样的内容,后证txt4确实不支持
[root@localhost zy1]# echo a>b
[root@localhost zy1]# echo a>c
[root@localhost zy1]# echo a>d
[root@localhost zy1]# ls
a  b  c  d  lost+found
[root@localhost zy1]# rm -rf a d                                   模拟删除a和d
[root@localhost ~]# umount /zy1                                     在家目录下解挂
[root@localhost ~]# extundelete /dev/sdb1 --inode 2            查看分区下存在哪些文件
File name                                       | Inode number | Deleted status
.                                                 2
..                                                2
lost+found                                        11
a                                                 12             Deleted
b                                                 13
c                                                 14
d                                                 15             Deleted
[root@localhost ~]# extundelete /dev/sdb1 --restore-all                    使用恢复
[root@localhost ~]# ls                    使用ls查看可以看见多了一个RECOVERED_FILES文件夹
[root@localhost RECOVERED_FILES]# ls                 查看文件夹里的文件可以找到已删除的文件
a  d


七.xfs文件的恢复

xfsdump命令格式
xfsdump-f备份存放位置要备份的路径或设备文件
xfsdump备份级别(默认为0)
0:完全备份
1-9:增量备份
xfsdump常用选项
-f:指定备份文件目录
L:指定标签session label
-M:指定设备标签media label
-S:备份单个文件,-s后面不能直接跟路径
xfsrestore命令格式
xfsrestore -f 恢复文件的位置存放恢复后文件的位置
使用xfsdump时,需要注意以下的几个限制:
不支持没有挂载的文件系统备份,所以只能备份已挂载的;
必须使用root的权限才能操作;
只能备份XFS文件系统;
备份下来的数据只能让xfsrestore解析;
不能备份两个具有相同UUID的文件系统(可使用blkid查看)

八.日志文件

1.日志的功能

用于记录系统、程序运行中发生的各种事件
通过阅读日志,有助于诊断和解决系统故障

2.日志文件的分类

2.1内核及系统日志

由系统服务rsyslog统一进行管理,日志格式基本相似

2.2用户日志

记录系统用户登录及退出系统的相关信息

2.3程序日志

由各种应用程序独立管理的日志文件,记录格式不统一

3.日志保存位置

默认位于:/var/log目录下

日志文件位置日志文件说明
/var/log/messages内核和公共日志它是核心系统日志文件,其中包含了系统启动时的引导信息,以及系统运行时的其他状态消息。1/0错误、网络错误和其他系统错误都会记录到此文件中。其他信息,比如某个人的身份切换为root,已及用户自定义安装软件的日志,也会在这里列出。
/var/log/cron计划任务日志记录与系统定时任务相关的日志
/var/log/dmesg系统引导日志记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/maillog邮件日志记录邮件信息的日志
/var/log/lastlog查看记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件.不能直接用Vi查看。而要使用lastlog命令
/var/log/secure记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
/var/log/wtmp永久记录所有用户的登陆、注销信息,同时记录系统的启动、重启、关机事件。同样,这个文件也是二进制文件.不能直接用Vi查看,而要使用last命令查看
/var/tun/ulmp记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用Vi查看,而要使用w、who、users等命令查看

4.日志文件的格式:

日志文件的格式包含以下4列:
事件产生的时间。
产生事件的服务器的主机名。
产生事件的服务名或程序名。
事件的具体信息。

[root@localhost yum.repos.d]# vim /var/log/secure

Sep 17 09:51:41 localhost polkitd[770]: Loading rules from directory /etc/polkit-1/rules.d
Sep 17 09:51:41 localhost polkitd[770]: Loading rules from directory /usr/share/polkit-1/rules.d
Sep 17 09:51:41 localhost polkitd[770]: Finished loading, compiling and executing 8 rules

5.日志消息的级别

级号消息级别说明
0EMERG紧急会导致主机系统不可用的情况
1ALERT警告必须马上采取措施解决的问题
2CRIT严重比较严重的情况
3ERR错误运行出现错误
4WARNING提醒可能会影响系统功能的事件
5NOTICE注意不会影响系统但值得注意
6INFO信息一般信息
7DEBUG调试程序或系统调试信息等

6.内核和公共日志

日志的配置文件 位置在 /etc/rsyslog.conf

总结

掌握inode的作用,了解查找文件的路径,
了解日志文件的分类,解读,调取。

;