深入了解linux系统文件系统和日志文件分析,介绍常见的系统故障的分析与排除过程
文件系统通常会将这两部分分别存放在inode和block中
linux系统中储存文件的权限和文件属性(所有者,群组,时间参数),都会存放在inode和bolck中
操作系统读取硬盘时候,不会一个个扇区读取,效率低,而是一次性读取多个扇区,即一次读写一“块”(block)
八个扇区组成一块,“块”大小为4KB,是文件最小单元,文件是储存在硬盘上的,最小储存单元是“ 扇区”,每个扇区储存512字节
元信息是是文件创建者,文件创建日期,文件大小
储存云信息的地方叫inode,中文名“ 索引节电”,也叫i节点
存储内容 存储位置 元信息 inode 数据 blockinode包含很多的文件元信息,但不包括文件名,例如:
文件字节数
文件拥有者UserID
文件GroupID
文件读,写,执行权限
文件时间戳
使用star命令查看文件inode信息
[root@localhost ~]# touch 1.txt [root@localhost ~]# stat 1.txt 文件:"1.txt" 大小:0 块:0 IO 块:4096 普通空文件 设备:fd00h/64768d Inode:100670485 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 环境:unconfined_u:object_r:admin_home_t:s0 最近访问:2020-06-23 19:12:29.093061439 +0800 最近更改:2020-06-23 19:12:29.093061439 +0800 最近改动:2020-06-23 19:12:29.093061439 +0800 创建时间:-ctime(change time)
最后一次改变文件或目录(属性)的时间,例如执行chmod,chown等命令
atime(access time)
最后一次访问文件或目录的时间
mtime(modify time)
最后一次修改文件或目录(内容)时间
目录文件表格
文件名1inode号码1文件名2inode号码2inode不包括文件名,文件名存放在目录下
每个inode都有一个号码,操作系统用inode号码来识别不同的文件
Linux系统内部不使用文件名,而使用inode号码来识别文件
对于用户来说,文件名指示inode号码便于识别的别称
表面上用户通过文件名打开文件,实际上,系统内部过程分为3步骤
1.系统找到这个文件名对应的inode号码
2.通过inode号码,获取inode信息
3.根据inode信息,找到文件数据所在的block,读出数据
[root@localhost ~]# stat 1.txt 文件:"1.txt" 大小:0 块:0 IO 块:4096 普通空文件 设备:fd00h/64768d Inode:100670485 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 环境:unconfined_u:object_r:admin_home_t:s0 [root@localhost ~]# ls -i 1.txt 100670485 1.txtdiode也会耗硬盘空间,每个inode的大小一般是128字节或256字节
格式化时确定inode的总数
[root@localhost ~]# df -i 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点 /dev/mapper/centos-root 26214400 29647 26184753 1% / devtmpfs 479645 399 479246 1% /dev tmpfs 482685 1 482684 1% /dev/shm tmpfs 482685 1283 481402 1% /run tmpfs 482685 16 482669 1% /sys/fs/cgroup /dev/sda1 524288 327 523961 1% /boot /dev/mapper/centos-home 128512000 7 128511993 1% /home tmpfs 482685 1 482684 1% /run/user/0 /dev/sr0 0 0 0 - /mnt于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象
1,当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
2,移动或者重命名文件时,只改变文件名,不影响inode号码
3,打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名
因为系统通过inode号码,识别运行中的文件,不通过文件名更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件
链接文件有两种(in 。in —s)
一种类似于Windows的快捷方式功能的文件,这种称为软链接
另一种则是通过文件系统的inode链接文件来产生新的文件名,而不是产生新文件,这种称之为硬链接
一般情况下,每个inode号码对应一个文件名。Linux系统允许,多个文件名指向同一个inode号码。
硬链接格式
ln命令创建硬链接 ln 源文件 目标 ,不可以对目录做硬链接 运行此命令后,源文件和目标文件的inode号码相同,都指向同一个inode。inode信息中的“链接数”此时就会增加1
当一个文件拥有多个硬链接时,对文件内容修改,会影响到所有文件名
但删除一个文件名,不会影响另一个文件名的访问
删除一个文件名,就会使得inode信息中的“链接数”减少1
[root@localhost ~]# mkdir -p /kgc/bdqn [root@localhost ~]# stat /kgc/bdqn 文件:"/kgc/bdqn" 大小:6 块:0 IO 块:4096 目录 设备:fd00h/64768d Inode:67505956 硬链接:2 权限:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root) 环境:unconfined_u:object_r:default_t:s0 最近访问:2020-06-23 19:47:54.058897986 +0800 最近更改:2020-06-23 19:47:54.058897986 +0800 最近改动:2020-06-23 19:47:54.058897986 +0800 创建时间:- [root@localhost kgc]# ls -a . .. bdqn [root@localhost ~]# stat /kgc 文件:"/kgc" 大小:18 块:0 IO 块:4096 目录 设备:fd00h/64768d Inode:33584870 硬链接:3 权限:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root) 环境:unconfined_u:object_r:default_t:s0 最近访问:2020-06-23 19:47:54.057897961 +0800 最近更改:2020-06-23 19:47:54.058897986 +0800 最近改动:2020-06-23 19:47:54.058897986 +0800 创建时间:- [root@localhost bdqn]# ls -ai 67505956 . 33584870 ..链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名
这是软链接与硬链接的最大不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode“链接数”不会因此产生变化。
这表示,文件A依赖于文件B而存在,如果删除了文件B ,打开文件A就会报错
读取文件A时,系统会自动将访问者导向文件B
软链接的inode不一样 [root@localhost bdqn]# echo a>a lrwxrwxrwx. 1 root root 1 6月 23 21:56 b -> a [root@localhost bdqn]# stat a b 文件:"a" 大小:2 块:8 IO 块:4096 普通文件 设备:fd00h/64768d Inode:67505954 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 环境:unconfined_u:object_r:default_t:s0 最近访问:2020-06-23 21:56:30.566896860 +0800 最近更改:2020-06-23 21:56:30.566896860 +0800 最近改动:2020-06-23 21:56:30.566896860 +0800 创建时间:- 文件:"b" -> "a" 大小:1 块:0 IO 块:4096 符号链接 设备:fd00h/64768d Inode:67505961 硬链接:1 权限:(0777/lrwxrwxrwx) Uid:( 0/ root) Gid:( 0/ root) 环境:unconfined_u:object_r:default_t:s0 最近访问:2020-06-23 21:56:51.743429433 +0800 最近更改:2020-06-23 21:56:49.559374506 +0800 最近改动:2020-06-23 21:56:49.559374506 +0800 创建时间:-EXT 类型文件恢复
删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录 里面的 block 中, 删除这个文件的名字。Linux 是通过 Link 的数量来控制文件删除的,只有 当一个文件不存在任何 Link 的时候, 这个文件才会被删除。 尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过“回收 站”找回的情况, 比如使用“rm -rf”来删除数据。针对 Linux 下的 EXT 文件系统,可用的恢复工具有 debugfs、ext3grep、extundelete 等。 其中 extundelete 是一个开源的 Linux 数据 恢复工具,支持 ext3、ext4 文件系统。
在数据被误删除后,第一时间要做的就是卸载被删除数据所在的分区,如果是根分区的 数据遭到误删, 就需要将系统进入单用户模式,并且将根分区以只读模式挂载。这样做的原因很简单,因为将文件删除后, 仅仅是将文件的 inode 节点中的扇区指针清零,实际文件还 存储在磁盘上,如果磁盘继续以读写模式挂载, 这些已删除的文件的数据块就可能被操作系统重新分配出去。如果数据库被新的数据覆盖后, 这些数据就真的丢失了,恢复工具也回 天无力。所以以只读模式挂载磁盘可以尽量降低数据库中数据被覆盖的风险,以提高恢复数 据成功的比例。
1.编译安装 extundelete 在编译安装 extundelete 之前需要先安装两个依赖包 e2fsprogs-libs 和 e2fsprogs-devel, 这两个包在系统安装光盘的/Package 目录下就有,使用 rpm 或 yum 命令将其安装。
[root@localhost bdqn]# yum -y install e2fsprogs-devel e2fsprogs-libs [root@localhost ~]# yum -y install wget 安装wget wget是一个下载文件的工具 [root@localhost bdqn]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 在网页上下载 [root@localhost bdqn]# yum -y install bzip2 安装bzip2解压 [root@localhost bdqn]# tar xvf extundelete-0.2.4.tar.bz2 用tar解压 [root@localhost bdqn]# cd extundelete-0.2.4/ 进入 extundelete 编译软件 #####没有make 安装make#### make是gcc的编译器,一定要安装 2、安装g++: yum install gcc gcc-c++ [root@localhost extundelete-0.2.4]# ./configure [root@localhost extundelete-0.2.4]# make extundelete.cc:1272:29: 警告:在 {} 内将‘search_flags’从‘int’转换为较窄的类型‘ext2_ino_t {aka unsigned int}’ [-Wnarrowing] 这里安装警告没事 [root@localhost extundelete-0.2.4]# make install 安装make2、模拟删除并执行恢复操作
[root@192 ~]# fdisk -l [root@192 ~]# fdisk /dev/sdb 进入交互模型 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0x002fd88d 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended 将使用默认值 41943039 分区 1 已设置为 Linux 类型,大小设为 20 GiB 命令(输入 m 获取帮助): 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x002fd88d 设备 Boot Start End Blocks Id System /dev/sdb1 2048 41943039 20970496 83 Linux 命令(输入 m 获取帮助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。 [root@192 ~]# mkfs -t ext4 /dev/sdb1 把sdb1格式化 [root@192 ~]# mkdir /data 创建一个data目录 [root@localhost ~]# mount /dev/sdb1 /data/ [root@192 ~]# cd /data [root@192 data]# echo a>a && echo a>b && echo a>c && echo a>d 写入一第东西 [root@192 data]# ll 总用量 16 -rw-r--r--. 1 root root 2 6月 23 22:39 a -rw-r--r--. 1 root root 2 6月 23 22:39 b -rw-r--r--. 1 root root 2 6月 23 22:39 c -rw-r--r--. 1 root root 2 6月 23 22:39 d3执行完命令‘extundelete /dev/sdb1”后输入”y“即可查看该文件系统的使用情况
[root@localhost data]# extundelete /dev/sdb1 [root@192 data]# extundelete /dev/sdb1 --inode 2 也可以使用“extundelete 查看文件系统/dev/sdb1 下存在哪些文件, 其中--inode 2 代表从 i 节点为 2 的文件开始查看,一般文件系统格式化挂 载之后,i 节点是从 2 开始的,2 代表该文件系统最开始的目录。(2)模拟误操作并恢复
[root@localhost data]# rm -rf a b ####删除a b 文件 [root@192 data]# rm -rf a b [root@192 data]# ls c d root@localhost data]# cd ###切到家目录 [root@localhost ~]# umount /data/ ###卸载挂载 [root@localhost ~]# extundelete /dev/sdb1 --restore-all ###恢复删除cd的数据 [root@localhost RECOVERED_FILES]# ll ###查看恢复的文件 总用量 8 -rw-r--r-- 1 root root 2 6月 23 00:40 a -rw-r--r-- 1 root root 2 6月 23 00:40 b使用 xfsdump 时,需要注意以下的几个限制 1、xfsdump 不支持没有挂载的文件系统备份,所以只能备份已挂载的; 2、xfsdump 必须使用 root 的权限才能操作(涉及文件系统的关系); 3、xfsdump 只能备份 XFS 文件系统; 4、xfsdump 备份下来的数据(档案或储存媒体)只能让 xfsrestore 解析; 5、xfsdump 是透过文件系统的 UUID 来分辨各个备份档的,因此不能备份两个具有相同 UUID 的文件系统。
用于记录系统,程序运行中发生的各种事件,日志文件是用于记录Linux系统中各种运行消息的文件,相当于Linux主机的“日记”,不同的日志文件记载了不同类型的信息,如Linux内核消息,用户登录事件,程序错误等,通过阅读日志,有助于诊断和解决系统故障,在Linux系统中运行的程序通常会把系统消息和错误消息写入相应的日志文件,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹
1:内核及系统日志
由系统服务rsyslog统一进行管理,日志格式基本相似
2:用户日志
记录系统用户登录及退出系统的相关信息,包括用户名,登录的终端,登录时间,来源主机,正在使用的进程操作等。
3:程序日志
由各种应用程序独立管理的日志文件,记录格式不统一
程序安装后不会生成日志文件,只有在启动的时候才会生成日志文件,没有访问它,日志文件就是空的
Linux系统本身和大部分服务器程序的日志文件都默认存放在/var/log下
有相当一部分日志文件只有root用户才有权读取,保证了相关日志信息的安全性
日志类别存放目录内核及公共消息日志/var/log/messages计划任务日志/var/log/cron系统引导日志/var/log/dmesg邮件系统日志/var/log/maillog用户登录日志/var/log/lastlog,/var/log/secure,/var/log/wtmp,/var/log/btmp为了通过查询日志文件找到关键信息,对系统服务文件分析方法,判断故障发生的原因
内核及大多数系统消息都被记录到公共日志文件/var/log/messages中,而其他一些程序消息被记录到各自独立的日志文件中,日志消息还可以记录到特定的存储设备中,或者直接发送给指定用户
[root@localhost ~]# more /var/log/messages/var/log/lastlog:最近的用户登录事件
/var/log/wtmp:用户登录,注销及系统开,关机事件
/var/log/utmp:当前登录的每个用户的详细信息
/var/log/secure:与用户验证相关的安全性事件
user命令只简单的输出当前登录的用户名称,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数
[root@localhost ~]# users root root rootwho命令用户报告当前登录到系统中的每个用户的信息
[root@localhost ~]# who root tty1 2020-06-25 16:01 root pts/0 2020-06-25 16:01 (192.168.136.2) root pts/1 2020-06-25 16:58 (192.168.136.2)w命令用于显示当前系统中的每个用户及其所运行的进程信息,比users,who命令的输出内容要更加丰富一些
[root@localhost ~]# w 17:41:00 up 1:02, 3 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 16:01 1:39m 0.02s 0.02s -bash root pts/0 192.168.136.2 16:01 1:26m 0.20s 0.20s -bash root pts/1 192.168.136.2 16:58 4.00s 0.10s 0.04s wlast命令用于查询成功登录到系统的用户记录
[root@localhost ~]# last root pts/1 192.168.136.2 Thu Jun 25 16:58 still logged in root pts/0 192.168.136.2 Thu Jun 25 16:01 still logged in root tty1 Thu Jun 25 16:01 still logged in reboot system boot 3.10.0-957.el7.x Thu Jun 25 15:51 - 17:41 (01:50) root tty1 Tue Jun 23 23:23 - 15:50 (1+16:27) reboot system boot 3.10.0-957.el7.x Tue Jun 23 23:23 - 15:51 (1+16:28) root pts/1 192.168.136.1 Wed Jun 17 19:55 - crash (6+03:27) root pts/0 192.168.136.1 Tue Jun 16 19:52 - crash (7+03:30) root tty1 Tue Jun 16 19:51 - 23:22 (7+03:30) reboot system boot 3.10.0-957.el7.x Tue Jun 16 19:51 - 15:51 (8+19:59) root pts/1 192.168.136.1 Tue Jun 16 19:50 - down (00:00) root pts/0 192.168.136.1 Tue Jun 16 18:58 - down (00:53) root tty1 Tue Jun 16 18:49 - 19:51 (01:01) reboot system boot 3.10.0-957.el7.x Wed Jun 17 02:48 - 19:51 (-6:-57) root tty1 Wed Jun 17 02:09 - 02:23 (00:13) reboot system boot 3.10.0-957.el7.x Wed Jun 17 01:40 - 19:51 (-5:-48) wtmp begins Wed Jun 17 01:40:06 2020lastb命令用于查询登录失败的用户记录
[root@localhost ~]# lastb root tty1 Wed Jun 17 02:09 - 02:09 (00:00) root tty1 Wed Jun 17 02:09 - 02:09 (00:00) (unknown tty1 Wed Jun 17 02:09 - 02:09 (00:00) (unknown tty1 Wed Jun 17 02:09 - 02:09 (00:00) root tty1 Wed Jun 17 02:08 - 02:08 (00:00)还有一部分文件没有使用rsyslog服务来管理,而是由自己程序维护一下包括:
web服务:/var/log/httpd/
access_log,error_log(httpd网站服务程序使用的两个日志文件access_log和error_log,分别记录客户访问事件,错误事件。)
`` [root@localhost ~]# lastb root tty1 Wed Jun 17 02:09 - 02:09 (00:00) root tty1 Wed Jun 17 02:09 - 02:09 (00:00) (unknown tty1 Wed Jun 17 02:09 - 02:09 (00:00) (unknown tty1 Wed Jun 17 02:09 - 02:09 (00:00) root tty1 Wed Jun 17 02:08 - 02:08 (00:00)
#### 程序日志 还有一部分文件没有使用rsyslog服务来管理,而是由自己程序维护一下包括: web服务:/var/log/httpd/ access_log,error_log(httpd网站服务程序使用的两个日志文件access_log和error_log,分别记录客户访问事件,错误事件。) ## 总结 管理人员注意的是,日志文件不是完全可靠,高明的黑客在入侵的时候,经常会打扫现场。所有需要综合运用以上系统命令,全面的进行审核和检查,做出正确的判断