带你更深入的了解Linux文件系统(超详细!)(inode号耗尽故障处理、恢复误删文件以及分析日志文件)


一、inode耗尽故障处理

  • 之前我们学习过,每个文件与inode是相互对应的关系,也就是说每个文件都会有一个inode号码,但这样就会有可能会发生inode已经用光,但硬盘还未存满的情况
  • 一旦发生这种情况后,我们就无法再在硬盘上创建新文件了,为了更直观的让大家理解,下面通过一个案例来模拟Linux文件系统中文件数量耗尽的故障

1.准备

  • 新建一块硬盘,创建分区/dev/sdb1,分区大小+30M即可(不用太大,这里只是模拟实验,不然inode号会太多)
  • 格式化,ext4格式(xfs也行)
[root@localhost ~]# mkfs.ext4 /dev/sdb1
  • 可能会发生一种情况:创建好分区后格式化发现没有这个磁盘文件,怎么办呢,这时建议将系统重启或者执行“partprobe”命令使操作系统检测新的分区表情况,以防止格式化分区时损坏硬盘中已有数据
  • 新建一个目录,挂载进去
    mark
  • 使用带“-i”选项的df命令确认该文件系统中i节点的使用情况,可见inode有7680个
    mark

2.模拟i节点耗尽故障

  • 编写一个脚本来模拟耗尽/dev/sdb1中的所有可用i节点(7680个)
  • 关于脚本程序后续再进行详细学习,这里仅做了解即可
[root@localhost test]# for ((i=1;i<=7680;i++));do touch /test/file$i;done 
touch: 无法创建"/test/file7670": 设备上没有空间
touch: 无法创建"/test/file7671": 设备上没有空间
touch: 无法创建"/test/file7672": 设备上没有空间
touch: 无法创建"/test/file7673": 设备上没有空间
touch: 无法创建"/test/file7674": 设备上没有空间
touch: 无法创建"/test/file7675": 设备上没有空间
touch: 无法创建"/test/file7676": 设备上没有空间
touch: 无法创建"/test/file7677": 设备上没有空间
touch: 无法创建"/test/file7678": 设备上没有空间
touch: 无法创建"/test/file7679": 设备上没有空间
touch: 无法创建"/test/file7680": 设备上没有空间        ##这里开始提示设备上没有空间了

  • 这时再查看一下分区可用inode,发现满了,再创建新的文件也无法成功,但是通过df命令查看该分区,仅用“4%”,还有很多可用空间;由此可以得出:磁盘创建文件的数量受到磁盘容量大小以及inode号的数量限制
[root@localhost test]# df -i /dev/sdb1
文件系统       Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sdb1       7680    7680       0     100% /test
[root@localhost test]# touch xcf.txt
touch: 无法创建"xcf.txt": 设备上没有空间
[root@localhost test]# df -Th /test/
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/sdb1      ext4   29M  916K   26M    4% /test

3.修复故障

  • 我们理解了故障的由来,那么问题就比较好解决了,可以“ls -a”查看所有文件(包含隐藏文件)
  • 然后找出该分区中占用大量i节点的细小文件,并进行转移或删除即可
  • 对于许多用户公用的文件系统,建议为相关用户设置磁盘限额(包括文件数量、磁盘空间两方面)

二、恢复误删的文件

  • 我们很多普通用户在删除一个文件的时候,实际上并不知晓inode节点和block数据,仅仅只是找到这个文件(名),然后删除
  • 实际上Linux是通过Link(链接)的数量来控制文件删除的,只有当一个文件不存在任何Link的时候,这个文件才会被彻底删除
  • 针对Linux系统下的EXT文件系统,可以用extundelete恢复工具来恢复文件,它是一个开源的Linux数据恢复工具,支持ext3、ext4文件系统(ext4只能在CentOS6版本中恢复)

1.准备(编译安装extundelete)

  • 可以接着刚才新创建好的那个分区接着做,不过要先解挂载,然后重新格式化为“ext3”再来挂载
[root@localhost test]# cd
[root@localhost ~]# umount /test/
[root@localhost ~]# mkfs.ext3 /dev/sdb1 
...略
[root@localhost ~]# mount /dev/sdb1 /test/
  • 在编译安装extundelete之前需要先安装两个依赖包(首先注意自己有没有挂载镜像)
[root@localhost ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs
...略
  • 安装完依赖包后,可以将软件包拷进来,或者是直接下载(直接复制粘贴即可)
[root@localhost test]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
--2020-12-03 15:32:50--  http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
正在解析主机 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)... 140.110.96.69, 2001:e10:ffff:1f02::17
正在连接 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)|140.110.96.69|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:108472 (106K) [application/octet-stream]
正在保存至: “extundelete-0.2.4.tar.bz2”

100%[==================>] 108,472     40.4KB/s 用时 2.6s   

2020-12-03 15:32:54 (40.4 KB/s) - 已保存 “extundelete-0.2.4.tar.bz2” [108472/108472])

  • 解压、配置、编译、安装
[root@localhost test]# ls
extundelete-0.2.4.tar.bz2  lost+found
[root@localhost test]# tar jxvf extundelete-0.2.4.tar.bz2        ##解压
...略
[root@localhost test]# ls
extundelete-0.2.4  extundelete-0.2.4.tar.bz2  lost+found
[root@localhost test]# cd extundelete-0.2.4/
[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 --prefix=/usr/local/extundelete        ##进行配置,指定软件安装(工作)目录
Configuring extundelete 0.2.4
Writing generated files to disk
[root@localhost extundelete-0.2.4]# make && make install        ##编译完成后进行安装
...略
[root@localhost extundelete-0.2.4]# cd /usr/local/extundelet
[root@localhost extundelet]# ls
bin
[root@localhost extundelet]# cd bin/
[root@localhost bin]# ls
extundelete
[root@localhost bin]# ln -s /usr/local/extundelet/bin/extundelete /usr/bin/        ##创建软链接,把前者文件放入/usr/bin目录中,让系统能识别extundelete的所有命令

2.模拟删除

  • 回到/test/目录下,往该目录下新建文件,(“echo”是输出的意思,相当于用a的内容创建出四个文件)
[root@localhost bin]# cd /test/
[root@localhost test]# echo a>a
[root@localhost test]# echo a>b
[root@localhost test]# echo a>c
[root@localhost test]# echo a>d
[root@localhost test]# cat a
a
[root@localhost test]# cat b
a
[root@localhost test]# cat c
a
[root@localhost test]# cat d
a
[root@localhost test]# ls
a  c  extundelete-0.2.4          lost+found
b  d  extundelete-0.2.4.tar.bz2
  • 查看文件系统/dev/sdb1下存在哪些文件,i节点从2开始,2代表该文件是系统最开始的目录
[root@localhost test]# extundelete /dev/sdb1 --inode 2
...略
Would you like to continue? (y/n) 
y        ##你想继续吗,输入y继续
...略
File name                                       | Inode number | Deleted status
.                                                 2
..                                                2
lost+found                                        11
extundelete-0.2.4.tar.bz2                         12
extundelete-0.2.4                                 1921
a                                                 13
b                                                 14
c                                                 15
d                                                 16
##只列出关键内容,这里可以看到a、b、c、d的inode号都有了
  • 我们再删除a文件和b文件之后,“ls”会发现a和b文件都没有了,再输入“extundelete /dev/sdb1 --inode 2”命令时也会发现a和b文件处于Deleted被删除状态
[root@localhost test]# rm -rf a b
[root@localhost test]# ls
c  extundelete-0.2.4          lost+found
d  extundelete-0.2.4.tar.bz2
[root@localhost test]# extundelete /dev/sdb1 --inode 2
...略

3.执行恢复操作

  • 首先回到家目录,解挂/test/,再使用恢复/dev/sdb1文件系统下的所有内容,执行完此命令后,会在当前目录下出现一个新目录,里面保存了已经恢复的文件
    mark
  • extundelete的用法还有很多,有兴趣的同学可以通过help查看更多的详细用法
  • 文件被误删后,inode号若被覆盖(目录被占满或格式化)就无法再找回恢复了

三、xfs类型的文件备份和恢复

1.概述

  • 注:是另外一种类型,不是直接删除恢复了,而是备份恢复
  • CentOS7默认采用xfs类型的文件,xfs类型的文件可以用xfsdump与xfsrestore工具进行备份恢复
    • xfsdump的备份级别有两种: 0表示完全备份: 1-9表示增量备份
    • 增量备份:备份完毕之后,磁盘若有新增内容,它只会备份新增内容,而不是再一次的进行完整备份
    • xfsdump 的备份级别默认为0.

2.命令格式

xfsdump -f 指定备份存放位置 要备份的路径或设备文件

3.常用选项

  • -f:指定备份文件目录
  • -L:指定会话标签(如果不指定的话,直接执行会提示我们输入)
  • -M:指定设备标签
  • -s:备份单个文件(后面不能直接跟路径)

4.使用限制

  • 只能备份已挂载的文件系统
  • 必须使用root的权限才能操作
  • 只能备份XFS文件系统
  • 备份后的数据只能让xfsrestore解析

5.操作步骤

  • 新建分区/dev/sdb2,大小为+10G(随意),格式化为xfs,并挂载进新建的/data/目录
[root@localhost ~]# mkfs.xfs /dev/sdb2
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount /dev/sdb2 /data/
##可以df-Th检查一下
##注:记得之前说过的,若是这里格式化没有出来sdb2,要重启系统或者刷新一下
  • 进入/data/目录,复制一个文件进去,然后再在里面创建一个目录,目录里面再创建一个文件
[root@localhost ~]# cd /data/
[root@localhost data]# cp /etc/passwd ./
[root@localhost data]# ls
passwd
[root@localhost data]# mkdir xcf
[root@localhost data]# touch xcf/xcf.txt
[root@localhost data]# ls
passwd  xcf
[root@localhost data]# ls -R
.:
passwd  xcf

./xcf:
xcf.txt        ##创建成功(子目录和他的文件)
  • 使用“xfsdump”备份整个分区(/dev/sdb2)到目录(/opt/dump_sdb2)下
[root@localhost data]# rpm -q xfsdump        ##首先查询一下“xfsdump”软件包有没有安装,一般都是安装了,没有则安装一下
xfsdump-3.1.4-1.el7.x86_64
[root@localhost data]# xfsdump -f /opt/dump_sdb2 /dev/sdb2
##输入此命令后,会提示输入我的标签,而标签就是这个文件名,我们输入“dump_sdb2”按回车
##之后又会提示让我们输入设备,输入“sdb2”就行了
[root@localhost data]# cd /opt/
[root@localhost opt]# ls
dump_sdb2  rh        ##备份成功
  • 模拟数据丢失并使用“xfsrestore”命令恢复文件
[root@localhost opt]# cd -
/data
[root@localhost data]# ls
passwd  xcf
[root@localhost data]# rm -rf *
[root@localhost data]# ls
[root@localhost data]# xfsrestore -f /opt/dump_sdb2 ./
...略
[root@localhost data]# ls
passwd  xcf        ##检查一下是否成功恢复
[root@localhost data]# cd xcf/
[root@localhost xcf]# ls
xcf.txt        ##OK~

四、分析日志文件

1.日志的功能

  • 日志文件用于记录Linux系统中各种运行信息的文件,相当于是一种“日记”
  • 不同的日志文件记载了不同类型的信息,比如用户登录时间、程序报错等等
  • 通过阅读日志,有助于诊断和解决系统故障(有据可查)
  • 此外,当主机受到黑客攻击时,日志文件还有助于帮助寻找黑客留下的痕迹(比如暴力破解多次尝试密码来登录)

2.日志的分类

在Linux系统中,日志数据主要包括以下三种类型:

  • 内核及系统日志:
    • 由系统服务rsyslog统一进行管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置
    • 系统中相当一部分程序会把自己的日志文件交由rsyslog日志管理,因此这些格式基本一致
  • 用户日志:
    • 记录系统用户登录及退出系统的相关信息
    • 包括用户名、登录的终端、登录时间、来源主机、正在使用的进程等
  • 程序日志:
    • 用于记录本程序运行过程中的各种事件信息
    • 由各种应用程序独立管理的日志文件,记录格式不统一
  • Linux操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log下

3.常见的日志文件

  • 对于Linux系统中的日志文件,有必要了解其各自的用途,这样才能在需要的时候更快更准确的找到问题所在,及时解决各种故障,下面介绍一些常见的日志文件
日志文件 介绍
内核及公共消息日志:/var/1og/messages 记录Linux内 核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等
计划任务日志:/var/log/cron 记录crond计划任务产生的事件信息
系统引导日志:/var/1og/dmesg 记录Linux 系统在引导过程中的各种事件信息
#邮件系统日志:/var/ log/maillog 记录进入或发出系统的电子邮件活动
用户登录日志:/var/1og/secure 记录用户认证相关的安全事件信息
/var/log/lastlog 记录每个用户最近的登录事件;二进制格式
/var/log/wtmp 记录每个用户登录、注销及系统启动和停机事件;二进制格式(反正你看不懂)
/var/run/btmp 记录失败的、错误的登录尝试及验证事件;二进制格式
  • 进入目录,"vim 目标"即可查看日志

4.日志文件分析

  • 熟悉了系统中的主要日志文件后,再来介绍针对日志文件的分析方法
  • 分析日志文件的目的在于浏览日志查找关键信息,对服务器进行调试,以及判断故障的原因等
  • 对于大多数文本格式的日志文件(如内核及系统日志、大多数的程序日志),只要使用tail、more、less、cat等文本处理工具就可以查看日志内容
  • 而对于一些二进制格式的日志文件(如用户日志),则需要使用特点的查询命令

5.内核及系统日志

  • 由系统服务 rsyslog 统一管理
    • 软件包:rsyslog-7.4.7-16.el7.x86_ 64
    • 配置文件: /etc/rsyslog.conf
    • 主要程序: /sbin/rsyslogd
  • 输入“vim /etc/rsyslog.conf”可以进入查看配置文件
    • "*.info"表示info等级及以上的所有等级的信息都写到对应的日志文件里
    • “mail.none”表示某件事的信息不写到日志文件里
      mark
  • Linux系统内核日志消息的优先级别(数字等级越小,优先级越高,消息越重要) :
优先级别 说明
0 EMERG(紧急):会导致主机系统不可用的情况
1 ALERT(警告):必须马上采取措施解决的问题
2 CRIT (严重) :比较严重的情况
3 ERR (错误) :运行出现错误
4 WARNING (提醒):可能影响系统功能,需要提醒用户的重要事件
5 NOTICE (注意):不会影响正常功能,但是需要注意的事件
6 INFO(信息):一般信息
7 DEBUG (调试) :程序或系统调试信息等
  • 一般在实际使用中,最多纪录到ERR(3,错误)级别,不可能把所有的信息都纪录到日志中,为了效率,只纪录重要的(就是说要么就是普通日志或者错误日志,更多的是错误日志,看看到底发生了什么故障)

6.日志记录的一般格式

  • 内核及大多数系统消息都被记录到公共日志文件/var/log/messages中,而其他一些程序消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者直接发送给指定用户
  • 查看/var/log/messages文件的内容如下
    mark
    …略
  • 每一行表示一条日志消息,每一条消息均包括四个字段
    • 时间标签:消息发出的日期和时间
    • 主机名:生成消息的计算机的名称
    • 子系统名:发出消息的应用程序的名称
    • 消息:消息的具体内容
  • 有些情况下,可以设置rsyslog,使其在把日志文件记录到文件的同时将日志信息发送到打印机进行打印,这样无论网络入侵者怎么修改日志都不能清除入侵的痕迹
  • rsyslog是一个经常会被攻击的显著目标,破坏了它会使管理员难以发现入侵以及入侵痕迹,因此要特别注意监控其守护进程及配置文件

7.用户日志分析

  • 保存了用户登录、退出系统等相关信息
    • /varl/log/lastlog:最近的用户登录事件
    • /var/log/wtmp:用户登录、注销及系统开、关机事件
    • /var/run/utmp:当前登录的每个用户的详细信息
    • /var/log/secure:与用户验证相关的安全性事件
  • 这些文件都是二进制的数据文件,不能直接使用tail、less等文本查看工具进行浏览,需要使用users、who、w、last、lastb等用户查询命令来获取日志信息
    • user命令指示简单的输出当前登录的用户名称,每个显示的用户名对应一个登录会话;如果一个用户有不止一个登录会话,那么他的用户名将显示与其相同的次数
    • who命令用于报告当前登录到系统中的每个用户的信息;使用该命令,系统管理员可以查看当前系统存在哪些不合法用户,从而对其进行审计和处理(who的默认输出包括用户名、终端类型、登录日期及远程主机)
    • w命令用于显示当前系统中的每个用户与其所运行的进程信息,输出内容会更加丰富一点
    • last命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面;若发现未经授权的用户登陆过即可知道被入侵了
    • lastb命令用于查询登录失败的用户记录,可以注意是否有人在暴力破解你的密码;也可以在安全日志/var/log/secure中获得相关信息(tail /var/log/secure)

8.程序日志分析

  • 在Linux系统中,有相当一部分应用程序没有使用rsylog服务来管理日志,而是由程序自己维护日志记录
    • httpd网站服务程序(Web服务): /var/log/httpd/
    • 通过以下两个日志文件来记录
      • access_ log //记录客户访问事件
      • error_ log //记录错误事件
    • 代理服务(相当于是一种用户再访问的缓存服务器机制,减少服务器并发负载):/var/log/squid/
      • access.log、cache.log
  • 由于不同程序的日志记录格式差别较大,也并没有严格规定统一的格式,所以这里不再详细介绍
  • 日志文件是会动态的写入,你在看的时候也是在不断地写入,日志是会不断的变大,会影响我们的查看,这时就需要一些专业的日志分析工具来查看(有兴趣的同学可以再深入了解下)

9.日志管理策略(小结)

  • 总的来说,作为一名专业的系统管理人员,应该时刻提高警惕,随时注意各种可疑情况,定期检查各种系统日志文件并且及时做好备份和归档
  • 在检查这些日志的时候一旦发现不合理的地方就立刻做好记录
  • 延长日志保存时间(方便自己查看,也方便别人?),通过备份等操作
  • 控制日志访问权限(比如一些敏感信息,如账号,口令和密码等)
  • 集中管理日志
    • 将服务器的日志文件发到统一的日志文件服务器(方便我们查找)
    • 这样便于日志信息的统一收集、 整理和分析
    • 有效杜绝日志信息的意外丢失、恶意篡改或删除
  • 另外,日志其实有的时候也并不是完全可靠的,技术高超的老黑客在入侵后会很完美的打扫现场
  • 所以综上所述,需要我们能够熟练灵活的应用以上系统命令,要全面、综合的进行审查和检测,切记断章取义
  • 加油啊,爱学习的同学们!

猜你喜欢

转载自blog.csdn.net/weixin_51486343/article/details/110564983
今日推荐