目录
11.1 深入理解Linux文件系统
11.1.1 inode与block详解
1. inode和block概述
2. inode的内容
3. inode的号码
4. inode的大小
11.1.2 硬链接与软连接
1. 硬链接
2. 软连接
11.1.3 EXT类型文件恢复
1. 编译安装extundelete
2. 模拟删除并执行恢复操作
11.1.4 xfs类型文件备份和恢复
11.2分析日志文件
11.2.1 主要日志文件
11.2.2 日志文件分析
1. 内核及系统日志
2. 用户日志
3. 程序日志
11.1 深入理解Linux文件系统
在处理Linux系统出现的各种故障时,故障的症状是最易发现的,而导致这一故障的原因才是最终排除故障的关键。熟悉Linux系统中常见的日志文件,了解一般故障的分析与解决办法,将有助于管理员快速定位故障点、“对症下药"、并及时解决各种系统问题。另外,Linux系统中通过分区、格式化来创建文件系统,而文件系统的运行又与block 和 inode有关。
下面来深入地了解Linux系统的文件系统和日志文件分析,并通过一些实例介绍常见系统故障的分析与排除过程。由于故障现象的不确定性,在进行一些模拟故障的操作之前,一定要提前做好数据备份。
11.1.1 inode与block详解
操作系统的文件数据除了实际内容之外,通常含有非常多的属性,例如 Linux操作系统的文件权限(rwx)与文件属性(所有者、群组、时间参数等)。文件系统通常会将这两部分内容分别存放在inode和 block中。
1. inode和block概述
文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”( sector),每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块""的大小,最常见的是4KB,即连续八个sector组成一个block。
文件数据存储在"块"中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为“索引节点",也叫i节点。因此,一个文件必须占用一个inode,但至少占用一个 block。
2. inode的内容
inode 包含很多的文件元信息,但不包含文件名,例如:
- 文件的字节数
- 文件拥有者的UserlD
- 文件的GrouplD
- 文件的读、写、执行权限
- 文件的时间戳
- ……
使用stat命令即可查看某个文件的inode信息。
[root@localhost ~]# stat anaconda-ks.cfg
文件:"anaconda-ks.cfg"
大小:1605 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:268635202 硬链接:1
权限:(0600/-rw-------) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:admin_home_t:s0
最近访问:2024-05-29 04:51:26.303017396 +0800
最近更改:2024-05-29 04:51:26.303017396 +0800
最近改动:2024-05-29 04:51:26.303017396 +0800
创建时间:-
[root@localhost ~]#
Linux系统文件有三个主要的时间属性,分别是ctime(change time), atime(access time),mtime(modify time)。
- ctime(change time)是最后一次改变文件或目录(属性)的时间,例如执行chmod,chown等命令;
- atime(access time)是最后一次访问文件或目录的时间;
- mtime(modify time)是最后一次修改文件或目录(内容)的时间。
刚才提到inode 中并不包括文件名,其实文件名是存放在目录当中的。Linux系统中一切皆文件,因此目录也是一种文件,目录文件的结构如图所示。
每个inode都有一个号码,操作系统用inode号码来识别不同的文件,Linux系统内部不使用文件名,而使用inode号码来识别文件。对于用户来说,文件名只是 inode号码便于识别的别称。
3. inode的号码
用户在访问文件时,表面上是用户通过文件名来打开文件,而实际系统内部的过程分成以下三步:
- 系统找到这个文件名对应的inode号码;
- 通过inode号码,获取inode信息;
- 根据inode信息,找到文件数据所在的 block,并读出数据。
常见的查看inode号码的方式有两种:
- ls -i命令:直接查看文件名所对应的inode号码;
- stat命令:通过查看文件inode信息而查看到inode号码。
[root@localhost ~]# stat anaconda-ks.cfg
文件:"anaconda-ks.cfg"
大小:1605 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:268635202 硬链接:1
权限:(0600/-rw-------) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:admin_home_t:s0
最近访问:2024-05-29 04:51:26.303017396 +0800
最近更改:2024-05-29 04:51:26.303017396 +0800
最近改动:2024-05-29 04:51:26.303017396 +0800
创建时间:-
[root@localhost ~]# ls -i anaconda-ks.cfg
268635202 anaconda-ks.cfg
[root@localhost ~]#
所以,当用户在 Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode,看该用户是否具有访问这个文件的权限。如果有,就指向相对应的数据 block,如果没有,就返回Permission denied。而一块硬盘分区后的结构则是如图所示。
4. inode的大小
inode 也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据:另一个是inode区,存放inode所包含的信息。每个inode的大小,一般是128字节或256字节。通常情况下不需要关注单个inode 的大小,而是需要重点关注inode总数。inode 的总数在格式化时就给定了,执行“df-i"命令即可查看每个硬盘分区对应的的 inode 总数和已经使用的inode数量。
[root@localhost ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 494847 436 494411 1% /dev
tmpfs 498438 2 498436 1% /dev/shm
tmpfs 498438 688 497750 1% /run
tmpfs 498438 19 498419 1% /sys/fs/cgroup
/dev/mapper/centos-root 102234112 59968 102174144 1% /
/dev/sda2 524288 332 523956 1% /boot
/dev/sr0 0 0 0 - /media/cdrom
tmpfs 498438 1 498437 1% /run/user/0
[root@localhost ~]#
由于inode 号码与文件名分离,导致一些Unix/Linux系统具备以下几种特有的现象。
- 文件名包含特殊字符,可能无法正常删除。这时直接删除 inode,能够起到删除文件的作用;
- 移动文件或重命名文件,只是改变文件名,不影响inode号码;
- 打开一个文件以后,系统就以 inode号码来识别这个文件,不再考虑文件名。
这种情况使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode 则被回收。
11.1.2 硬链接与软连接
在 Linux系统下的链接文件有两种,一种类似于Windows的快捷方式功能的文件,可以快速连接到目标文件或目录,称之为软链接;另一种则是通过文件系统的 inode链接来产生的新文件名,而不是产生新文件,称之为硬链接。
1. 硬链接
一般情况下,文件名和 inode号码是一一对应关系,每个inode 号码对应一个文件名。但是Linux系统允许多个文件名指向同一个inode 号码。这意味着,可以用不同的文件名访问同样的内容。In命令可以创建硬链接,命令的基本格式为:
ln 源文件 目标
运行该命令以后,源文件与目标文件的 inode号码相同,都指向同一个inode。inode信息中的"链接数"这时就会增加1 。
当一个文件拥有多个硬链接时,对文件内容修改,会影响到所有文件名;但是删除一个文件名,不影响另一个文件名的访问。删除一个文件名,只会使得inode 中的"链接数"减1。需要注意的是不能对目录做硬链接。
通过mkdir命令创建一个新目录/app/kgc,其硬链接数应该有2个,因为常见的目录本身为1个硬链接,而目录kgc下面的隐藏目录.(点号)是该目录的又一个硬链接,也算是1个连接数。
[root@localhost ~]# mkdir -p /app/kgc
[root@localhost ~]# ls -ld /app/kgc/
drwxr-xr-x. 2 root root 6 6月 7 17:51 /app/kgc/
[root@localhost ~]#
2. 软连接
软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。例如,文件A和文件B的 inode号码虽然不一样,但是文件A的,内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。这时,文件A就称为文件B的“软链接”(soft link)或者"符号链接(symbolic link)。
这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的 inode 号码,文件B的inode"链接数"不会因此发生变化。
软链接的创建命令的基本格式为;
ln -s 源文件或目录 目标文件或目录
11.1.3 EXT类型文件恢复
删除一个文件,实际上并不清除inode节点和 block 的数据,只是在这个文件的父目录里面的 block中,删除这个文件的名字。Linux是通过Link的数量来控制文件删除的,只有当一个文件不存在任何Link的时候,这个文件才会被删除。
在Linux系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过"回收站"找回的情况,比如使用"rm -rf"来删除数据。针对Linux 下的EXT文件系统,可用的恢复工具有debugfs、ext3grep、extundelete等。其中 extundelete是一个开源的Linux数据恢复工具,支持ext3、ext4文件系统。
在数据被误删除后,第一时间要做的就是卸载被删除数据所在的分区,如果是根分区的数据遭到误删,就需要将系统进入单用户模式,并且将根分区以只读模式挂载。这样做的原因很简单,因为将文件删除后,仅仅是将文件的 inode节点中的扇区指针清零,实际文件还存储在磁盘上,如果磁盘继续以读写模式挂载,这些已删除的文件的数据块就可能被操作系统重新分配出去,在这些数据库被新的数据覆盖后,这些数据就真的丢失了,恢复工具也回天无力。所以以只读模式挂载磁盘可以尽量降低数据库中数据被覆盖的风险,以提高恢复数据成功的比例。
1. 编译安装extundelete
在编译安装extundelete之前需要先安装两个依赖包e2fsprogs-libs和l e2fsprogs-devel,这两个包在系统安装光盘的/Package目录下就有,使用rpm或yum命令将其安装。
e2fsprogs-devel安装依赖于libcom_err-devel包。
安装完依赖包之后,即可将提前上传的extundelete 软件包解压、配置、编译、安装。
[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
软件包 e2fsprogs-libs-1.42.9-19.el7.x86_64 已安装并且是最新版本
正在解决依赖关系
--> 正在检查事务
---> 软件包 e2fsprogs-devel.x86_64.0.1.42.9-19.el7 将被 安装
--> 正在处理依赖关系 libcom_err-devel(x86-64) = 1.42.9-19.el7,它被软件包 e2fsprogs-devel-1.42.9-19.el7.x86_64 需要
--> 正在处理依赖关系 pkgconfig(com_err),它被软件包 e2fsprogs-devel-1.42.9-19.el7.x86_64 需要
--> 正在检查事务
---> 软件包 libcom_err-devel.x86_64.0.1.42.9-19.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
===================================================================================
Package 架构 版本 源 大小
===================================================================================
正在安装:
e2fsprogs-devel x86_64 1.42.9-19.el7 c7-media 73 k
为依赖而安装:
libcom_err-devel x86_64 1.42.9-19.el7 c7-media 32 k
事务概要
===================================================================================
安装 1 软件包 (+1 依赖软件包)
总下载量:105 k
安装大小:179 k
Downloading packages:
-----------------------------------------------------------------------------------
总计 22 MB/s | 105 kB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : libcom_err-devel-1.42.9-19.el7.x86_64 1/2
正在安装 : e2fsprogs-devel-1.42.9-19.el7.x86_64 2/2
验证中 : libcom_err-devel-1.42.9-19.el7.x86_64 1/2
验证中 : e2fsprogs-devel-1.42.9-19.el7.x86_64 2/2
已安装:
e2fsprogs-devel.x86_64 0:1.42.9-19.el7
作为依赖被安装:
libcom_err-devel.x86_64 0:1.42.9-19.el7
完毕!
[root@localhost ~]# rz -E
rz waiting to receive.
[root@localhost ~]# tar extundelete-0.2.4.tar.bz2
tar: 旧选项“b”需要参数。
请用“tar --help”或“tar --usage”获得更多信息。
[root@localhost ~]# tar -xf extundelete-0.2.4.tar.bz2
[root@localhost ~]# cd extundelete-0.2.4
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete
Configuring extundelete 0.2.4
configure: error: in `/root/extundelete-0.2.4':
configure: error: C++ compiler cannot create executables
See `config.log' for more details
[root@localhost extundelete-0.2.4]# yum -y install gcc*
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
正在解决依赖关系
--> 正在检查事务
---> 软件包 gcc.x86_64.0.4.8.5-44.el7 将被 安装
--> 正在处理依赖关系 cpp = 4.8.5-44.el7,它被软件包 gcc-4.8.5-44.el7.x86_64 需要
--> 正在处理依赖关系 glibc-devel >= 2.2.90-12,它被软件包 gcc-4.8.5-44.el7.x86_64 需要
--> 正在处理依赖关系 libmpfr.so.4()(64bit),它被软件包 gcc-4.8.5-44.el7.x86_64 需要
--> 正在处理依赖关系 libmpc.so.3()(64bit),它被软件包 gcc-4.8.5-44.el7.x86_64 需要
---> 软件包 gcc-c++.x86_64.0.4.8.5-44.el7 将被 安装
--> 正在处理依赖关系 libstdc++-devel = 4.8.5-44.el7,它被软件包 gcc-c++-4.8.5-44.el7.x86_64 需要
---> 软件包 gcc-gfortran.x86_64.0.4.8.5-44.el7 将被 安装
--> 正在处理依赖关系 libquadmath-devel = 4.8.5-44.el7,它被软件包 gcc-gfortran-4.8.5-44.el7.x86_64 需要
--> 正在处理依赖关系 libquadmath = 4.8.5-44.el7,它被软件包 gcc-gfortran-4.8.5-44.el7.x86_64 需要
--> 正在处理依赖关系 libgfortran = 4.8.5-44.el7,它被软件包 gcc-gfortran-4.8.5-44.el7.x86_64 需要
--> 正在处理依赖关系 libgfortran.so.3()(64bit),它被软件包 gcc-gfortran-4.8.5-44.el7.x86_64 需要
---> 软件包 gcc-gnat.x86_64.0.4.8.5-44.el7 将被 安装
--> 正在处理依赖关系 libgnat-devel = 4.8.5-44.el7,它被软件包 gcc-gnat-4.8.5-44.el7.x86_64 需要
--> 正在处理依赖关系 libgnat = 4.8.5-44.el7,它被软件包 gcc-gnat-4.8.5-44.el7.x86_64 需要
---> 软件包 gcc-objc.x86_64.0.4.8.5-44.el7 将被 安装
--> 正在处理依赖关系 libobjc = 4.8.5-44.el7,它被软件包 gcc-objc-4.8.5-44.el7.x86_64 需要
--> 正在处理依赖关系 libobjc.so.4()(64bit),它被软件包 gcc-objc-4.8.5-44.el7.x86_64 需要
---> 软件包 gcc-objc++.x86_64.0.4.8.5-44.el7 将被 安装
--> 正在检查事务
---> 软件包 cpp.x86_64.0.4.8.5-44.el7 将被 安装
---> 软件包 glibc-devel.x86_64.0.2.17-317.el7 将被 安装
--> 正在处理依赖关系 glibc-headers = 2.17-317.el7,它被软件包 glibc-devel-2.17-317.el7.x86_64 需要
--> 正在处理依赖关系 glibc-headers,它被软件包 glibc-devel-2.17-317.el7.x86_64 需要
---> 软件包 libgfortran.x86_64.0.4.8.5-44.el7 将被 安装
---> 软件包 libgnat.x86_64.0.4.8.5-44.el7 将被 安装
---> 软件包 libgnat-devel.x86_64.0.4.8.5-44.el7 将被 安装
---> 软件包 libmpc.x86_64.0.1.0.1-3.el7 将被 安装
---> 软件包 libobjc.x86_64.0.4.8.5-44.el7 将被 安装
---> 软件包 libquadmath.x86_64.0.4.8.5-44.el7 将被 安装
---> 软件包 libquadmath-devel.x86_64.0.4.8.5-44.el7 将被 安装
---> 软件包 libstdc++-devel.x86_64.0.4.8.5-44.el7 将被 安装
---> 软件包 mpfr.x86_64.0.3.1.1-4.el7 将被 安装
--> 正在检查事务
---> 软件包 glibc-headers.x86_64.0.2.17-317.el7 将被 安装
--> 正在处理依赖关系 kernel-headers >= 2.2.1,它被软件包 glibc-headers-2.17-317.el7.x86_64 需要
--> 正在处理依赖关系 kernel-headers,它被软件包 glibc-headers-2.17-317.el7.x86_64 需要
--> 正在检查事务
---> 软件包 kernel-headers.x86_64.0.3.10.0-1160.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
===================================================================================
Package 架构 版本 源 大小
===================================================================================
正在安装:
gcc x86_64 4.8.5-44.el7 c7-media 16 M
gcc-c++ x86_64 4.8.5-44.el7 c7-media 7.2 M
gcc-gfortran x86_64 4.8.5-44.el7 c7-media 6.7 M
gcc-gnat x86_64 4.8.5-44.el7 c7-media 13 M
gcc-objc x86_64 4.8.5-44.el7 c7-media 5.7 M
gcc-objc++ x86_64 4.8.5-44.el7 c7-media 6.2 M
为依赖而安装:
cpp x86_64 4.8.5-44.el7 c7-media 5.9 M
glibc-devel x86_64 2.17-317.el7 c7-media 1.1 M
glibc-headers x86_64 2.17-317.el7 c7-media 690 k
kernel-headers x86_64 3.10.0-1160.el7 c7-media 9.0 M
libgfortran x86_64 4.8.5-44.el7 c7-media 301 k
libgnat x86_64 4.8.5-44.el7 c7-media 967 k
libgnat-devel x86_64 4.8.5-44.el7 c7-media 2.7 M
libmpc x86_64 1.0.1-3.el7 c7-media 51 k
libobjc x86_64 4.8.5-44.el7 c7-media 80 k
libquadmath x86_64 4.8.5-44.el7 c7-media 190 k
libquadmath-devel x86_64 4.8.5-44.el7 c7-media 54 k
libstdc++-devel x86_64 4.8.5-44.el7 c7-media 1.5 M
mpfr x86_64 3.1.1-4.el7 c7-media 203 k
事务概要
===================================================================================
安装 6 软件包 (+13 依赖软件包)
总下载量:78 M
安装大小:189 M
Downloading packages:
-----------------------------------------------------------------------------------
总计 94 MB/s | 78 MB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : mpfr-3.1.1-4.el7.x86_64 1/19
正在安装 : libmpc-1.0.1-3.el7.x86_64 2/19
正在安装 : libquadmath-4.8.5-44.el7.x86_64 3/19
正在安装 : libgfortran-4.8.5-44.el7.x86_64 4/19
正在安装 : cpp-4.8.5-44.el7.x86_64 5/19
正在安装 : kernel-headers-3.10.0-1160.el7.x86_64 6/19
正在安装 : glibc-headers-2.17-317.el7.x86_64 7/19
正在安装 : glibc-devel-2.17-317.el7.x86_64 8/19
正在安装 : gcc-4.8.5-44.el7.x86_64 9/19
正在安装 : libquadmath-devel-4.8.5-44.el7.x86_64 10/19
正在安装 : libobjc-4.8.5-44.el7.x86_64 11/19
正在安装 : gcc-objc-4.8.5-44.el7.x86_64 12/19
正在安装 : libstdc++-devel-4.8.5-44.el7.x86_64 13/19
正在安装 : gcc-c++-4.8.5-44.el7.x86_64 14/19
正在安装 : libgnat-4.8.5-44.el7.x86_64 15/19
正在安装 : libgnat-devel-4.8.5-44.el7.x86_64 16/19
正在安装 : gcc-gnat-4.8.5-44.el7.x86_64 17/19
正在安装 : gcc-objc++-4.8.5-44.el7.x86_64 18/19
正在安装 : gcc-gfortran-4.8.5-44.el7.x86_64 19/19
验证中 : libgnat-devel-4.8.5-44.el7.x86_64 1/19
验证中 : gcc-gnat-4.8.5-44.el7.x86_64 2/19
验证中 : gcc-c++-4.8.5-44.el7.x86_64 3/19
验证中 : libquadmath-4.8.5-44.el7.x86_64 4/19
验证中 : gcc-gfortran-4.8.5-44.el7.x86_64 5/19
验证中 : libquadmath-devel-4.8.5-44.el7.x86_64 6/19
验证中 : libgnat-4.8.5-44.el7.x86_64 7/19
验证中 : libgfortran-4.8.5-44.el7.x86_64 8/19
验证中 : mpfr-3.1.1-4.el7.x86_64 9/19
验证中 : glibc-headers-2.17-317.el7.x86_64 10/19
验证中 : cpp-4.8.5-44.el7.x86_64 11/19
验证中 : glibc-devel-2.17-317.el7.x86_64 12/19
验证中 : gcc-4.8.5-44.el7.x86_64 13/19
验证中 : gcc-objc-4.8.5-44.el7.x86_64 14/19
验证中 : libstdc++-devel-4.8.5-44.el7.x86_64 15/19
验证中 : libmpc-1.0.1-3.el7.x86_64 16/19
验证中 : libobjc-4.8.5-44.el7.x86_64 17/19
验证中 : gcc-objc++-4.8.5-44.el7.x86_64 18/19
验证中 : kernel-headers-3.10.0-1160.el7.x86_64 19/19
已安装:
gcc.x86_64 0:4.8.5-44.el7 gcc-c++.x86_64 0:4.8.5-44.el7
gcc-gfortran.x86_64 0:4.8.5-44.el7 gcc-gnat.x86_64 0:4.8.5-44.el7
gcc-objc.x86_64 0:4.8.5-44.el7 gcc-objc++.x86_64 0:4.8.5-44.el7
作为依赖被安装:
cpp.x86_64 0:4.8.5-44.el7 glibc-devel.x86_64 0:2.17-317.el7
glibc-headers.x86_64 0:2.17-317.el7 kernel-headers.x86_64 0:3.10.0-1160.el7
libgfortran.x86_64 0:4.8.5-44.el7 libgnat.x86_64 0:4.8.5-44.el7
libgnat-devel.x86_64 0:4.8.5-44.el7 libmpc.x86_64 0:1.0.1-3.el7
libobjc.x86_64 0:4.8.5-44.el7 libquadmath.x86_64 0:4.8.5-44.el7
libquadmath-devel.x86_64 0:4.8.5-44.el7 libstdc++-devel.x86_64 0:4.8.5-44.el7
mpfr.x86_64 0:3.1.1-4.el7
完毕!
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete
Configuring extundelete 0.2.4
Writing generated files to disk
[root@localhost extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/
[root@localhost extundelete-0.2.4]#
2. 模拟删除并执行恢复操作
- 使用fdisk命令创建新分区,将其挂载到/tmp目录下,往该目录下新建一些文件或目录
[root@localhost ~]# fdisk -l
磁盘 /dev/sda:214.7 GB, 214748364800 字节,419430400 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a87f4
设备 Boot Start End Blocks Id System
/dev/sda1 2048 6143 2048 83 Linux
/dev/sda2 * 6144 2103295 1048576 83 Linux
/dev/sda3 2103296 419430399 208663552 8e Linux LVM
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/centos-root:209.4 GB, 209375461376 字节,408936448 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/centos-swap:4294 MB, 4294967296 字节,8388608 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xeddae805 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+10G
分区 1 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
分区号 (2-4,默认 2):
起始 扇区 (20973568-41943039,默认为 20973568):
将使用默认值 20973568
Last 扇区, +扇区 or +size{K,M,G} (20973568-41943039,默认为 41943039):
将使用默认值 41943039
分区 2 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# mkfs.ext3 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@localhost ~]# mkdir /test/
[root@localhost ~]# mount /dev/sdb1 /test/
[root@localhost ~]# cd /test/
[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
a b c d lost+found
[root@localhost test]#
执行完命令'extundelete /ldevsdb1"后输入"y“即可查看该文件系统的使用情况。
也可以使用"extundelete ldevsdb1 --inode 2"查看文件系统ldevlsdb1下存在哪些文件,具体的使用情况。其中--inode 2代表从i节点为2的文件开始查看,一般文件系统格式化挂载之后,i节点是从2开始的,2代表该文件系统最开始的目录。
2. 模拟误操作并恢复
使用"rm -rf a b"命令删除/tmpl下的a文件和 b文件,当出现误操作时,立刻卸载该文件系统,然后使用“extundelete /devlsdb1 --restore-al恢复ldevlsdb1文件系统下的所有内容。
执行完恢复的命令后,在当前目录下会出现一个/RECOVERED_FILES/目录,里面保存了已经恢复的文件。
11.1.4 xfs类型文件备份和恢复
extundelete工具仅可以恢复EXT类型的文件,无法恢复CentOS7系统默认采用xfs类型的文件。针对xfs文件系统目前也没有比较成熟的文件恢复工具,所以建议提前做好数据备份,以避免数据丢失。
xfs类型的文件可使用xfsdump 与xfsrestore 工具进行备份恢复。若系统中未安装xfsdump与xfsrestore工具,可以通过yum install -y xfsdump命令安装。xfsdump 按照 inode顺序备份一个xfs文件系统。xfsdump 的备份级别有两种:О表示完全备份;1-9表示增量备份。xfsdump的备份级别默认为0。xfsdump 的命令格式为:xfsdump -f备份存放位置要备份路径或设备文件。常用的备份参数包括以下几种:
- -f:指定备份文件目录;
- -L:指定标签session label;
- -M:指定设备标签 media label;
- -s:备份单个文件,-s后面不能直接跟路径。
下面通过一个案例来备份恢复xfs类型的文件。首先添加一款新硬盘并格式化为xfs类型的文件系统,然后挂在到/date目录下。
准备测试文件。
使用xfsdump命令备份整个分区。
删除之前创建的内容,模拟数据丢失。
使用xfsrestore命令恢复文件。xfsrestore命令的语法为:xfsrestore -f恢复文件的位置存放恢复后文件的路径。
使用xfsdump时,需要注意以下的几个限制:
- xfsdump不支持没有挂载的文件系统备份,所以只能备份已挂载的;
- xfsdump必须使用root的权限才能操作(涉及文件系统的关系);
- xfsdump只能备份XFS文件系统
- xfsdump备份下来的数据(档案或储存媒体)只能让xfsrestore 解析;
- xfsdump是透过文件系统的UUID来分辨各个备份档的,因此不能备份两个具有相同UUID的文件系统。
11.2分析日志文件
日志文件是用于记录Linux操作系统中各种运行消息的文件,相当于Linux主机的"日记"。不同的日志文件记载了不同类型的信息,如 Linux内核消息、用户登录事件、程序错误等。
日志文件对于诊断和解决系统中的问题很有帮助,因为在Linux操作系统中运行的程序通常会把系统消息和错误消息写入相应的日志文件,这样系统- - 旦出现问题就会有据可查"。此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹。本节将对Linux操作系统中的主要日志文件及分析方法进行介绍。
11.2.1 主要日志文件
在 Linux操作系统中,日志数据主要包括以下三种类型。
- 内核及系统日志:这种日志数据由系统服务rsyslog 统一管理,根据其主配置文件letc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置。系统中有相当一部分程序会把自己的日志文件交由rsyslog管理,因而这些程序使用的日志记录也具有相似的格式。
- 用户日志:这种日志数据用于记录Linux操作系统用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。
- 程序日志:有些应用程序会选择由自己独立管理一份日志文件(而不是交给 rsyslog服务管理),用于记录本程序运行过程中的各种事件信息。由于这些程序只负责管理自己的日志文件,因此不同程序所使用的日志记录格式可能会存在较大的差异。
Linux操作系统本身和大部分服务器程序的日志文件都默认放在目录/varllog/下。一部分程序共用一个日志文件,一部分程序使用单个日志文件,而有些大型服务器程序由于日志文件不止一个,所以会在/varllog/目录中建立相应的子目录来存放日志文件,这样既保证了日志文件目录的结构清晰,又可以快速定位日志文件。有相当一部分日志文件只有root用户才有权限读取,这保证了相关日志信息的安全性。
对于Linux操作系统中的日志文件,有必要了解其各自的用途,这样才能在需要的时候更快地找到问题所在,及时解决各种故障。下面介绍常见的一些日志文件。
- lvar/log/messages:记录Linux内核消息及各种应用程序的公共日志信息,包括启动、I/O错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。
- /varllog/cron:记录crond计划任务产生的事件信息。
- /varllogldmesg:记录 Linux操作系统在引导过程中的各种事件信息。
- /var/log/maillog:记录进入或发出系统的电子邮件活动。
- /var/log/lastlog:记录每个用户最近的登录事件。
- /varllog/secure:记录用户认证相关的安全事件信息。
- /var/log/wtmp:记录每个用户登录、注销及系统启动和停机事件。
- /var/log/btmp:记录失败的、错误的登录尝试及验证事件。
11.2.2 日志文件分析
熟悉了系统中的主要日志文件以后,下面将介绍针对日志文件的分析方法。分析日志文件的目的在于通过浏览日志查找关键信息、对系统服务进行调试,以及判断发生故障的原因等。
对于大多数文本格式的日志文件(如内核及系统日志、大多数的程序日志),只要使用tail、more、less、cat等文本处理工具就可以查看日志内容。而对于一些二进制格式的日志文件(如用户日志),则需要使用特定的查询命令。
1. 内核及系统日志
内核及系统日志功能主要由默认安装的rsyslog-7.4.7-16.el7.x86_64.rpm 软件包提供。rsyslog服务所使用的配置文件为letclrsyslog.conf。通过查看letc/rsyslog.conf文件中的内容,可以了解到系统默认的日志设置,具体操作如下:
从配置文件/etcIrsyslog.conf中可以看到,受rsyslogd服务管理的日志文件都是Linux操作系统中主要的日志文件,它们记录了Linux操作系统中内核、用户认证、电子邮件、计划任务等基本的系统消息。在Linux内核中,根据日志消息的重要程度不同,将其分为不同的优先级别(数字等级越小,优先级越高,消息越重要)。
- 0 EMERG(紧急):会导致主机系统不可用的情况。
- 1 ALERT(警告):必须马上采取措施解决的问题。
- 2 CRIT(严重):比较严重的情况。
- 3 ERR(错误):运行出现错误。
- 4 WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。
- 5 NOTICE(注意):不会影响正常功能,但是需要注意的事件。
- 6 INFO(信息):一般信息。
- 7 DEBUG(调试):程序或系统调试信息等。
内核及大多数系统消息被记录到公共日志文件l/varlog/messages 中,而其他一些程序消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者直接发送给指定用户。查看/var/log/messages 文件的内容如下:
对于rsyslog服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的。以公共日志/varlog/messages文件的记录格式为例,其中每一行表示一条日志消息,每一条消息均包括以下四个字段。
- 时间标签:消息发出的日期和时间。
- 主机名:生成消息的计算机的名称。
- 子系统名称:发出消息的应用程序的名称。
- 消息:消息的具体内容。
在有些情况下,可以设置rsyslog,使其在把日志信息记录到文件的同时将日志信息发送到打印机进行打印,这样无论网络入侵者怎样修改日志都不能清除入侵的痕迹。rsyslog日志服务是一个常会被攻击的显著目标,破坏了它将使管理员难以发现入侵及入侵的痕迹,因此要特别注意监控其守护进程及配置文件。
2. 用户日志
在wtmp、 btmp、 lastlog 等日志文件中,保存了系统用户登录、退出等相关的事件消息。但是这些文件都是二进制的数据文件,不能直接使用tail、less等文本查看工具进行浏览,需要使用who、w、 users、last和 lastb 等用户查询命令来获取日志信息。
- 查询当前登录的用户情况——users、 who、w命令
users命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。user命令的具体操作如下:
who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用户名、终端类型、登录日期及远程主机。who命令的具体操作如下:
w命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users.who命令的输出内容要丰富一些。w命令的具体操作如下:
2. 查询用户登录的历史记录——last、 lastb命令
last命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。通过last命令可以及时掌握Linux主机的登录情况,若发现未经授权的用户登录过,则表示当前主机可能已被入侵。last命令的具体操作如下:
lastb命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除了使用lastb命令查看以外,也可以直接从安全日志文件/varlog/secure中获得相关信息。
或者
从上述查询结果可以看到,teacher用户在tty3终端上出现了失败登录。
3. 程序日志
在 Linux操作系统中,还有相当一部分应用程序没有使用rsyslog服务来管理日志,而是由程序自己维护日志记录。例如,httpd网站服务程序使用两个日志文件 access_log和error_log分别记录客户访问事件和错误事件。不同应用程序的日志记录格式差别较大,且没有严格使用统一的格式。
总的来说,作为一名合格的系统管理人员,应该提高警惕,随时注意各种可疑状况,定期并随机检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志及用户登录日志记录等。在检查这些日志时,要注意是否有不合常理的时间或操作记录。例如,出现以下现象就应多加注意。
- 用户在非常规的时间登录,或者用户登录系统的IP地址和以往的不一样。
- 用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录。
- 非法使用或不正当使用超级用户权限。
- 无故或者非法重新启动各项网络服务的记录。
- 不正常的日志记录,如日志残缺不全,或者是诸如 wtmp这样的日志文件无故缺少了中间的记录文件。
另外,需要提醒管理人员注意的是,日志并不是完全可靠的,高明的黑客在入侵系统后经常会打扫现场。所以管理人员需要综合运用以上的系统命令,全面、综合地进行审查和检测,切忌断章取义,否则将可能做出错误的判断。