Linux文件系统和日志分析

201 阅读4分钟

1. inode与block

1.1 inode和block概述

  • 文件数据包括元信息与实际数据
  • 文件存储在硬盘上,硬盘最小存储单位是“扇区",每个扇区存储512字节
  • block (块)
 - 连续的八个扇区组成一个block(一个块是4K大小)
 - 是文件存取的最小单位
  • inode (索引节点)
- 中文译名为“索引节点”,也叫节点
- 用于存储文件元信息
- 是文件读取的最小单位

image.png

总结: 操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。一个文件必须占用一个inode,但至少占用一个block

1.2 inode的内容

  • inode包含文件的元信息
- 文件的字节数
- 文件拥有者的User ID
- 文件的Group ID
- 文件的读、写、执行权限
- 文件的时间戳
- `不包含文件名` 
  • 用stat和ls命令可以查看某个文件的inode信息
[root@localhost opt]# stat aa.txt 

image.png

atime(accesstime):使用这个文件的时候就会更新这个时间。

mtime(modification time):修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别。

ctime(status time):修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,更像是change time,只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间。

[root@localhost opt]# ls -i

image.png

  • inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区,存放 inode 所包含的信息。
  • 每个 inode 的大小,一般是 128 字节或 256 字节。
  • 通常情况下不需要关注单个 inode 的大小,而是需要重点关注 inode 总数。inode 的总数在格式化时就给定了,执行 “df -i” 命令即可查看每个硬盘分区对应的的 inode 总数和已经使用的inode 数量。
[root@localhost ~]# df -i

image.png

1.3 inode号的特殊作用

由于 inode 号码与文件名分离,导致Linux 系统具备以下几种特有的现象

  • 文件名包含特殊字符,可能无法正常删除。这时直接删除 inode,能够起到删除文件的作用;
[root@localhost opt]# find ./ -inum 33554505 -exec rm -i {} \;

image.png

  • 移动文件或重命名文件,只是改变文件名,不影响 inode 号码;
[root@localhost data]# mv a.txt /opt/123.txt
[root@localhost data]# ls -i /opt/

image.png

  • 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。

  • 使用 vi 编辑器修改文件数据保存后,会生成一个新的 inode号码。

image.png

1.4 文件存储小结

  • 访问文件的简单流程

用户访问文件时,通过文件名找到对应的inode号,通过Inode号获取inode信息,根据inode信息判断用户是否有权限访问文件,有则指向对于的数据block并读取数据,无则拒绝访问 image.png

  • 磁盘分区后的结构

image.png

1.5 inode号小实验

  • 问:磁盘空间还有,但无法创建文件
`答:inedo应该已经用完了`
  • 实验验证: inode节点耗尽故障处理
使用fdisk创建分区/dev/sdb1,分区大小10M即可
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1  `使用ext4系统类型inode号误差会很小`

image.png

[root@localhost ~]# mkdir /test
[root@localhost ~]# mount /dev/sdb1 /test/   ##挂载

image.png

模拟inode节点耗尽故障

[root@localhost test]#for ((i=1; i<=2549; i++));do touch /test/file$i;done     
或
[root@localhost test]#touch file{1..2549}.txt

image.png

image.png

新建文件看是否可以再创建

[root@localhost test]# touch 1.txt

image.png 删除文件恢复

[root@localhost test]#rm -rf /test/*

2. 软连接与硬连接

2.1链接文件

  • 为文件或目录建立链接文件
  • 链接文件分类 ||软链接|硬链接| |---|---|---| |删除原始文件后|失效|仍旧可用| |使用范围|适用于文件或目录|只可用于文件| |保存位置|与原始文件可以位于不同的文件系统中| 必须与原始文件在同一个文件系统(如一个Linux分区)内|

3. 恢复误删的文件

3.1 ext类型文件恢复

  • 先将磁盘分区
[root@localhost ~]# fdisk /dev/sdb

image.png

  • 刷新磁盘并查看磁盘分区
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# fdisk -l

image.png

  • 格式化分区
[root@localhost ~]# mkfs.ext3 /dev/sdb1

image.png

  • 磁盘分区挂载
[root@localhost ~]# mkdir /test
[root@localhost ~]# mount /dev/sdb1 /test/
[root@localhost ~]# df -Th

image.png  

[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs  ##下载依赖包

image.png

  • 通过xftp将我们所需要的extundelete-0.2.4.tar.bz2压缩包上传到/test目录,进入/test目录并进行解压
[root@localhost test]# tar -xf extundelete-0.2.4.tar.bz2

image.png

  • 进入extundelete-0.2.4目录,进行编译安装
[root@localhost test]# cd extundelete-0.2.4
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete &ake && make install

image.png

  • 将/usr/local/extundelete/bin下所有的文件都软连接到/usr/bin下面,进入test目录创建文件
[root@localhost extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/    #*/
[root@localhost extundelete-0.2.4]# 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
  • 查看文件系统/dev/ode1下存在哪些文件。i节点是从2开始的,2代表该文件系统最开始的目录。
[root@localhost test]# extundelete /dev/sdb1 --inode 2

image.png

  • 模拟删除实验
[root@localhost test]# rm -rf a b

image.png

[root@localhost test]# extundelete /dev/sdb1 --inode 2

image.png

  • 对磁盘内容进行恢复
[root@localhost ~]# extundelete /dev/sdb1 --restore-all

image.png

  • 恢复后会在当前目录下出现一个 RECOVERED_FILES文件,里面会存放被删除的文件

image.png

3.2 xfs 类型文件备份和恢复

  • CentOS7系统默认采用xfs类型的文件,xfs 类型的文件可使用xfsdump与xfsrestore工具进行备份恢复。

  • xfsdump的备份级别有两种:0表示完全备份;1-9表示增量备份。xfsdump的备份级别默认为0。

  • xfsdump 的命令格式为:

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

  • xfsdump 命令常用的选项:
选项说明
f指定备份文件目录
L指定标签 session label
M指定设备标签 media label
s备份单个文件,-s后面不能直接跟路径
  • xfsdump使用限制:
1.只能备份已挂载的文件系统
2.必须使用root的权限才能操作
3.只能备份XFS文件系统
4.备份后的数据只能让xfsrestore解析
5.不能备份两个具有相同UUID的文件系统(可用 blkid命令查看)
  • 实验配置

使用fdisk创建分区/dev/sdb1,格式化xfs文件系统

[root@localhost ~]# fdisk /dev/sdb
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# mkfs.xfs /dev/sdb1
[root@localhost ~]# mkdir /test1
[root@localhost ~]# mount /dev/sdb1 /test1/

在test1文件夹下添加文件准备实验

[root@localhost ~]# cd /test1/
[root@localhost ~]# cp /etc/passwd ./
[root@localhost ~]# mkdir abc
[root@localhost ~]# touch abc/123.txt

使用 xfsdump 命令备份整个分区

[root@localhost ~]# yum install -y xfsdump
[root@localhost ~]# rpm -qa | grep xfsdump
[root@localhost ~]# xfsdump -f /opt/dump_sdb1 /dev/sdb1

image.png

模拟数据丢失并使用 xfsrestore 命令恢复文件

[root@localhost ~]# cd /test1/
[root@localhost test1]# rm -rf ./*  ##*/
[root@localhost test1]# ls
[root@localhost test1]# xfsrestore -f /opt/dump_sdb1 /test1/

image.png

4. 分析日志文件

4.1日志的功能

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

4.2 日志文件的分类

  • 日志保存位置:
    • 默认位于:/var/log 目录下
  • 内核及系统日志
    • 由系统服务rsyslog统一进行管理,日志格式基本相似
    • 主配置文件/etc/rsyslog.conf
[root@localhost ~]# vim /etc/rsyslog.conf    #查看rsyslog.conf配置文件
规则配置格式:[设备.级别 动作]	
*.info;mail.none;authpriv.none;cron.none         /var/log/messages

*.info		#表示info等级及以上的所有等级的信息都写到对应的日志文件里
mail.none	#表示某事件的信息不写到日志文件里(这里比如是邮件)

image.png

  • 用户日志
    • 记录系统用户登录及退出系统的相关信息
  • 程序日志
    • 由各种应用程序独立管理的日志文件,记录格式不统一

注: Linux操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下

4.3 常见的一些日志文件:

  • 内核及公共消息日志
    • /var/log/messages:记录Linux内核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。
    • 公共日志/var/log/messages 文件的记录格式
      • 时间标签:消息发出的日期和时间。
      • 主机名:生成消息的计算机的名称。
      • 子系统名称:发出消息的应用程序的名称
      • 消息:消息的具体内容

image.png

  • 计划任务日志

    • /var/log/cron:记录crond计划任务产生的事件信息。
  • 系统引导日志

    • /var/log/dmesg:记录Linux系统在引导过程中的各种事件信息
  • 邮件系统日志

    • /var/log/maillog:记录进入或发出系统的电子邮件活动。
  • 用户登录日志

    • /var/log/secure:记录用户认证相关的安全事件信息。
    • /var/log/lastlog:记录每个用户最近的登录事件。二进制格式
    • /var/log/wtmp:记录每个用户登录、注销及系统启动和停机事件。二进制格式
    • /var/run/btmp:记录失败的、错误的登录尝试及验证事件。二进制格式

4.4 用户日志分析

  • 程序自己维护日志记录,httpd 网站服务程序使用两个日志文件
access_log 		#记录客户访问事件
error_log		#记录错误事件。
也可以使用tail -f 实时跟踪日志信息
[root@localhost ~]# tail -f /var/log/secure

image.png

  • 设备字段说明 |设备字段|说明| |---|---| |auth | 用户认证时产生的日志 |authpriv | ssh、ftp等登录信息的验证信息 |daemon | 一些守护进程产生的日志 |ftp | FTP产生的日志 |lpr | 打印相关活动 |mark | rsyslog服务内部的信息,时间标识 |news | 网络新闻传输协议(nntp)产生的消息。 |syslog | 系统日志 |uucp | Unix-to-Unix Copy 两个unix之间的相关通信 |console | 针对系统控制台的消息。 |cron | 系统执行定时任务产生的日志。 |kern | 系统内核日志 |local0~local7 | 自定义程序使用 |mail | 邮件日志 |user | 用户进程

  • 由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf。

    • 软件包:rsyslog-8.24.0-12.el7.x86_64 (可使用 ”rpm -q“ 命令查看)
    • 主要程序:/sbin/rsyslogd
    • 配置文件:/etc/rsyslog.conf (可使用 ”rpm -qc“ 命令查看)
  • Linux系统内核日志消息的优先级别(数字等级越小,优先级越高,消息越重要)

等级说明
0EMERG(紧急):会导致主机系统不可用的情况。如系统崩溃
1ALERT(警告):必须马上采取措施解决的问题。如数据库被破坏
2CRIT(严重):比较严重的情况。如硬盘错误,可能会阻碍程序的部分功能
3ERR(错误):运行出现错误。不是非常紧急,尽快修复的
4WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。不是错误,如磁盘用了85%等
5NOTICE(注意):不会影响正常功能,但是需要注意的事件。无需处理
6INFO(信息):一般信息。正常的系统信息
7DEBUG(调试):程序或系统调试信息等。包含详细开发的信息,调试程序时使用
none没有优先级,不记录任何日志消息。
  • 举例:
mail.info  /var/log/maillog :比指定级别更高的日志级别,包括指定级别自身,保存到/var/log/maillog中
mail.=info  /var/log/maillog :明确指定日志级别为info,保存至/var/log/maillog
mail.!info  /var/log/maillog :除了指定的日志级别(info)所有日志级别信息,保存至/var/log/maillog
*.info      /var/log/maillog :所有facility的info级别,保存至/var/log/maillog
mail.*     /var/log/maillog :mail的所有日志级别信息,都保存至/var/log/maillog
mail.notice;news.info  /var/log/maillog :mail的notice以上记得日志级别和news的info以上的级别保存至/var/log/maillog
mail,news.crit  -/var/log/maillog :mail和news的crit以上的日志级别保存/var/log/maillog中;“-”代表异步模式

5. 配置日志服务器收集日志

  • rsyslog是一个C/S架构,可以通过套接字来进行监听记录工作,可以基于TCP和UDP工作,默认的监听端口是514,只需要在MODULES打开即可。

发送服务器:客户端 192.168.80.20

收集服务器:服务端 192.168.80.30

  • 关闭服务端和客户端防火墙、selinux
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
  • 修改客户端配置文件,并启动服务
[root@localhost ~]# vim /etc/rsyslog.conf
#### MODULES ####
#将下面四行前的注释取消掉
$ModLoad imudp		
$UDPServerRun 514	
$ModLoad imtcp		
$InputTCPServerRun 514

#### RULES ####
#添加下列内容
$template myFormat, "%timestamp% %hostname% %syslogseverity-text% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate myFormat
*.info;mail.none;authpriv.none;cron.none              @@192.168.200.100:514

[root@localhost ~]#systemctl restart rsyslog

#%timestamp% :时间戳

#%fromhost-ip% :接收的信息来自于哪个节点的 IP

#%hostname% :主机名

#%syslogseverity-text% :日志等级

#%syslogtag% :服务进程

#%msg% :日志内容

#接收方 IP 前面一个 @ 表示 TCP 传输,两个 @ 表示 UDP 传输

  • 修改服务端配置文件,并启动服务
[root@localhost ~]#vim /etc/rsyslog.conf
#将下面四行前的注释取消掉
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
 
#添加以下内容
$AllowedSender tcp, 192.168.80.0/24		#允许 192.168.80.0 网段内的主机以tcp协议来传输
$template Remote,"/data/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"		#定义模板,接受日志文件路径,区分了不同主机的日志
:fromhost-ip, !isequal, "127.0.0.1" ?Remote		#过滤掉 server 本机的日志

[root@localhost ~]#systemctl restart rsyslog
  • 在服务端创建/data/log目录,以接受大量日志信息,配置文件中的路径应当与该路径一致
[root@localhost ~]#mkdir -p /data/log
  • 验证
    • 客户端的终端命令行输入或者重启一个服务
[root@localhost ~]#logger "hello world"
  • 在服务端查看日志文件
[root@localhost ~]#tree /data/log/

6. journalctl 日志管理工具

  • 日志管理工具journalctl是centos7上专有的日志管理工具,该工具是从messages这个文件里读取信息。 Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。

  • 日志的配置文件是/etc/systemd/journald.conf

  • 查看所有日志(默认情况下,只保存本次启动的日志)

journalctl

journalctl -r #-r表示倒序,从尾部看(推荐)

  • 查看内核日志(不显示应用日志)

journalctl -k

  • 查看系统本次启动的日志

journalctl -b [-0]

  • 查看上一次启动的日志(需更改设置,如上次系统崩溃,需要查看日志时,就要看上一次的启动日志)

journalctl -b -1

  • 显示尾部指定行数的日志

查看的是/var/log/messages的日志,但是格式上有所调整,如主机名格式不一样而已

journalctl -n 20 [-f]

  • 查看某个服务的日志

journalctl -u nginx.service [-f]

  • 查看指定进程的日志

journalctl _PID=1

  • 查看指定用户的日志

journalctl _UID=0 --since today

journalctl -xe

-x 是目录(catalog)的意思,在报错的信息下会,附加解决问题的网址

-e pager-end 从末尾开始看

7. rsyslog 收集 apache 日志

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

ErrorLog logs/error_log

  • 方法一

ErrorLog syslog #修改配置表示对 error_log 启用 syslog

LogLevel notice #notice 及以上的 log 全部记录,默认的 facility 是 local7

  • 方法二

ErrorLog "|/usr/bin/logger -p local5.notice"

#error_log 全部通过管道写入 syslog,并且 log 的 facility 配置为 local5

#LogLevel warn

#CustomLog logs/access_log combined

CustomLog "|/usr/bin/logger -p local4.info" combined

#access_log全部通过管道写入syslog,并且log的facility配置为local4

#logger -p 指定输入消息的优先级,优先级可以是数字或者指定为 "facility.level" 的格式