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

852 阅读18分钟
  1. 安装软件
  2. 修改配置文件(理解)
  3. 重启服务
  4. 验证结果

一、inode和block概述

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

1. inode表结构

每个文件的属性信息,比如:文件的大小,时间,类型,权限等,称为文件的元数据(meta data 元信息 )

元数据存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。

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

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

2. 查看inode号

ls -i 命令:查看文件名对应的inode号码

stat 命令:查看某个文件的inode信息

[root@localhost data]#  ls -i
 70281951 11   70130061 22   70130062 33   33576520 aa   70359287 bb  103031601 cc   70359280 test.txt

[root@localhost data]#  stat bb
  文件:"bb"
  大小:6         	块:0          IO 块:4096   目录
设备:fd00h/64768d	Inode70359287    硬链接:2
权限:(0755/drwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:default_t:s0
最近访问:2024-04-22 15:27:11.286260614 +0800
最近更改:2024-04-22 15:27:11.286260614 +0800
最近改动:2024-04-22 15:27:11.286260614 +0800
创建时间:-

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

  • atime (access time): 最近访问文件时间,需要打开文件,时间才会发生改变。
  • mtime (modify time):最近更改时间,文件内容发生改变,时间才会改变。
  • ctime (change time):最近改动时间,文件的元信息(属主、属组、大小等)发生改变,时间才会改动。

在使用find找文件时间时,建议使用 mtime

用户通过文件名打开文件时,系统内部的过程

  1. 系统找到这个文件名对应的inode号码;
  2. 通过inode号码,获取inode信息;
  3. 根据inode信息,找到文件数据所在的block,读出数据。

3. inode 的大小

  • inode也会消耗硬盘空间 : 每个inode的大小一般是128字节或256字节
  • 使用 df -i 命令可以查看每个硬盘分区的inode总数和已经使用的数量
[root@localhost ~]#  df -i
文件系统                   Inode 已用(I)  可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 26214400  146305 26068095       1% /
devtmpfs                  250009     453   249556       1% /dev
tmpfs                     253989       1   253988       1% /dev/shm
tmpfs                     253989     615   253374       1% /run
tmpfs                     253989      16   253973       1% /sys/fs/cgroup
/dev/sda1                2097152     327  2096825       1% /boot
tmpfs                     253989      18   253971       1% /run/user/0
/dev/sr0                       0       0        0        - /run/media/root/CentOS 7 x86_64
  • 明明硬盘空间还有剩余,为什么无法继续新建文件?

因为 inode 号使用完毕。

  • inode号是有限资源,如果消耗完毕,无法继续新建文件。

解决方法:删除空文件或没有用的文件。 (可以用 rsync 命令进行删除)

  • inode节点可能一样吗?

inode号在同一设备中是唯一的;在不同设备中inode是可以相同的。

4. inode的特殊作用

由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象:

①当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件。

②在同一个文件系统中移动或重命名文件时,只改变文件名,不影响inode号码。

③打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名。

二、 日志文件概述

1. 日志的功能

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

2. 日志文件的分类

  • 内核及系统日志 由系统服务 rsyslog\color{red}{rsyslog} 统一进行管理,日志格式基本相似
  • 用户日志 记录系统用户登录及退出系统的相关信息
  • 程序日志 由各种应用程序独立管理的日志文件,记录格式不统一

3. 日志消息的级别

日志消息的级别描述了事件的严重程度。在 Linux 内核中,根据日志消息的重要程度不同,将其分为不同的优先级别(数字等级越小,优先级越高,消息越重要)。

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

4. 日志文件的格式

日志文件的格式包含以下 4 列:

  • 事件产生的时间。
  • 产生事件的服务器的主机名。
  • 产生事件的服务名或程序名。
  • 事件的具体信息。

5. 日志保存位置

默认位于:/var/log 目录下 (位置可以改)

日志位置
内核及公共消息日志/var/log/messages
计划任务日志/var/log/cron
系统引导日志/var/log/dmesg
邮件系统日志/var/log/maillog
用户登录日志/var/log/lastlog
/var/log/wtmp
/var/log/btmp
/var/log/secure

6. 主要日志文件介绍

6.1 日常日志信息

文件位置 : /var/log/messages
系统中绝大多数信息都放在这 (内核及公共消息日志)

[root@localhost ~]#  tail -f /var/log/messages
Apr 22 17:50:01 localhost systemd: Started Session 162 of user root.
Apr 22 17:50:01 localhost systemd: Starting Session 162 of user root.
Apr 22 18:00:01 localhost systemd: Started Session 163 of user root.

6.2 系统安全日志

文件位置 : /var/log/secure
这个日志中主要记录的是用户验证和授权方面的信息

[root@localhost ~]#tail -f /var/log/secure
Sep 22 22:43:31 localhost sshd[17254]: Accepted password for root from 192.168.91.1 port 54264 ssh2
Sep 22 22:43:31 localhost sshd[17254]: pam_unix(sshd:session): session opened for user root by (uid=0)
Sep 22 22:56:11 localhost sshd[13323]: pam_unix(sshd:session): session closed for user root

6.3 登录失败日志

文件位置 : /var/log/btmp
二进制文件,不是普通文本文件,无法直接查看。 可以使用 lastb\color{red}{lastb} 命令查看哪些用户登录失败。

[root@localhost ~]#  tail  /var/log/btmp    
©:0reboot:0񧧟                                 #无法直接查看信息

[root@localhost ~]#  lastb                   #使用lastb命令查看哪些用户登录失败
reboot   :0           :0               Tue Apr 16 19:54 - 19:54  (00:00)    

btmp begins Tue Apr 16 19:54:37 2024

6.4 记录用户最后一次登录的日志

文件位置 : /var/log/lastlog
二进制文件,无法直接查看。使用命令 lastlog\color{red}{lastlog} 查看

[root@localhost ~]#  lastlog
用户名           端口     来自             最后登陆时间
root             pts/0    172.16.235.1     一 4月 22 13:54:30 +0800 2024
bin                                        **从未登录过**
daemon                                     **从未登录过**
adm                                        **从未登录过**

6.5 目前用户成功登录的日志

文件位置 : /var/log/wtmp
二进制文件,无法直接查看。使用命令 last\color{red}{last} 查看

[root@localhost ~]#  last
root     pts/0        172.16.235.1     Mon Apr 22 13:54   still logged in   
root     pts/1        172.16.235.1     Fri Apr 19 15:53 - 19:35  (03:41)    
root     pts/0        172.16.235.1     Fri Apr 19 15:23 - 18:57  (03:34)    
root     pts/1        172.16.235.1     Thu Apr 18 14:23 - 23:11  (08:47) 
日志作用命令
btmp查看登录失败的用户lastb
lastlog查看用户最后一次登录的情况lastlog
wtmp用户成功登录的日志last

6.6 记录硬件信息日志

文件位置 : /var/log/dmesg
添加硬件,会记录在此日志中,需要使用单独命令 dmesg

6.7 记录系统启动服务

文件位置 :/var/log/boot.log

6.8 记录安装系统的相关信息

文件位置 :/var/log/anaconda:anaconda

6.9 计划任务

文件位置 :/var/log/cron

7. 日志分析

7.1 用户日志分析

保存了用户登录、退出系统等相关信息:

  • /var/log/lastlog:最近的用户登录事件。二进制文件,使用 lastlog 命令查看。
  • /var/log/wtmp:用户登录、注销,及系统开、关机事件。二进制文件,使用 last 命令查看。
  • /var/run/utmp:当前登录的每个用户的详细信息。二进制文件,使用w、who、users等命令查看。
  • /var/log/secure:与用户验证有关的安全性事件。

分析工具:

users、who、w、last、lastb

7.2 程序日志分析

由相应的应用程序独立进行管理:

  • Web服务:/var/log/httpd/

    • access_log、error_log
  • 代理服务:/var/log/squid

    • access.log、cache.log
  • FTP服务:/var/log/xferlog

分析工具:

  • 文本查看、grep过滤检索、Webmin管理套件中查看

  • awk、sed等文本过滤、格式化编辑工具

  • Webalizer、Awstats等专用日志分析工具

三、 日志管理

1. 日志管理策略

  • 及时做好备份和归档
  • 延长日志保存期限
  • 控制日志访问权限
    • 日志中可能会包含各类敏感信息,如账户、口令等。
  • 集中管理日志
    • 将服务器的日志文件发到统一的日志文件服务器
    • 便于日志信息的统一收集、整理和分析
    • 杜绝日志信息的意外丢失、恶意篡改或删除

2. 系统日志相关服务

2.1 sysklogd系统日志服务

CentOS 5 之前版本采用的日志管理系统服务

2.2 rsyslog系统日志服务

rsyslog是CentOS 6以后版本的系统管理服务:它提供了高性能,出色的安全性和模块化设计。尽管rsyslog最初是常规的syslogd,但发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地。

  • rsyslog 特性
    • 多线程
    • UDP, TCP, SSL, TLS, RELP
    • MySQL, PGSQL, Oracle实现日志存储
    • 强大的过滤器,可实现过滤记录日志信息中任意部分
    • 自定义输出格式 可以日志
    • 适用于企业级
    • 有windows版

2.3 ELK日志收集

ELK:由Elasticsearch, Logstash, Kibana三个软件组成

  • 非关系型分布式数据库基于apache软件基金会jakarta项目组的项目lucene
  • Elasticsearch是个开源分布式搜索引擎,可以处理大规模日志数据,比如:Nginx、Tomcat、系统日志等功能
  • Logstash对日志进行收集、分析,过滤,并将其存储供以后使用
  • Kibana 可以提供的日志分析友好的 Web 界面
  • kafka消息队列。管理过量日志

3. 系统日志术语

  • facility:设施,从功能或程序上对日志进行归类
#内置分类
auth(验证), authpriv, cron(定时任务), daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, syslog

#自定义的分类
local0-local7
  • Priority 优先级别,从低到高排序
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)

4. rsyslog管理

4.1 rsyslog 相关文件

  • 程序包:rsyslog
  • 主程序:/usr/sbin/rsyslogd
  • CentOS 6:/etc/rc.d/init.d/rsyslog {start|stop|restart|status}
  • CentOS 7,8:/usr/lib/systemd/system/rsyslog.service
  • 配置文件:/etc/rsyslog.conf , /etc/rsyslog.d/*.conf
  • 库文件: /lib64/rsyslog/*.so

4.2 rsyslog 配置文件

/etc/rsyslog.conf 配置文件格式:由三部分组成

  • MODULES:相关模块配置
  • GLOBAL DIRECTIVES:全局配置
  • RULES:日志记录相关的规则配置
配置文件中rules的通式:
服务程序.记录的日志级别      日志文件的位置(绝对路径)

#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
*指任意程序的日志  info:info及以上级别记录    除了mail  authpriv  cron

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

文件路径:通常在/var/log/,文件路径前的   -表示异步写入
异步:内存中记录一段时间后再存入磁盘
同步:内存中有一条,磁盘上有一条

4.3 rsyslog应用实例

实验1:将ssh服务的日志单独设置

有些软件程序是没有单独的日志服务,我们可以利用 rsyslog 软件给一些重要的程序生成独立的日志文件。

ssh  远程登录程序
ssh软件默认的日志在/var/log/secure ,是和很多程序一起使用的,并不是独立的
将 ssh服务的日志 文件 独立出来

[root@localhost ~]# rpm -qc rsyslog           #查看rsyslog软件配置文件的位置
/etc/logrotate.d/syslog
/etc/rsyslog.conf
/etc/sysconfig/rsyslog

[root@localhost ~]#vim /etc/rsyslog.conf       #修改rsyslog的配置文件
# Save boot messages also to boot.log
local6.*                      /opt/ssh.log    #76 行添加自己的文件位置         

启用一个程序自定义叫local6,这个local6是谁不知道,要和程序相配合进行设置

[root@localhost ~]#  rpm -qc openssh-server    #查看ssh软件配置文件的位置
/etc/pam.d/sshd
/etc/ssh/sshd_config
/etc/sysconfig/sshd

[root@localhost ~]#vim /etc/ssh/sshd_config    #修改ssh配置文件,32下一行添加自己的自定义
 30 # Logging
 31 #SyslogFacility AUTH
 32 #SyslogFacility AUTHPRIV
 33 SyslogFacility local6

[root@localhost ~]#systemctl restart rsyslog.service sshd    #重启服务

实验2:网络日志(远程日志功能)

远程日志,即通过网络,将本地的日志远程备份到另一台机器,这样,就算本机系统崩溃,我们可以查看另一台机器备份的日志,来排查故障。

搭建日志服务器,所有的日志汇聚到一台服务器

实验思路:

假设服务器A需要将日志备份到服务器B,那么A是发送方(客户端),B是接收方(服务器端)。

双方开启TCP功能(或UDP功能)和514接口;发送方还需填写想要传输的日志和接收方的地址。

实验步骤:

  • 客户端 (发送方)设置
[root@localhost ~]#  systemctl   stop  firewalld    //关闭防火墙
[root@localhost ~]#  setenforce  0
   
[root@localhost ~]# vim /etc/rsyslog.conf        //编辑配置文件
------------------------      
# Provides TCP syslog reception
 19 $ModLoad imtcp                //开启TCP功能
 20 $InputTCPServerRun 514        //开启514端口

//编辑需要传输的日志和接收方地址                      #两个@代表使用tcp ;一个代表udp
 55 *.info;mail.none;authpriv.none;cron.none                @@172.16.235.10 

 [root@localhost ~]# systemctl restart rsyslog     //重启日志服务
 [root@localhost ~]# ss -ntap | grep 514          //检查514端口是否开启
 LISTEN     0      25           *:514                      *:*                   users:(("rsyslogd",pid=44087,fd=3))
LISTEN     0      25          :::514                     :::*                   users:(("rsyslogd",pid=44087,fd=4))
  • 服务器端(接收方)设置
[root@fwq ~]# systemctl   stop  firewalld    //关闭防火墙
[root@fwq ~]# setenforce  0

[root@fwq ~]# vim /etc/rsyslog.conf      //编辑配置文件
 ------------------------    
 18 # Provides TCP syslog reception
 19 $ModLoad imtcp                    //开启TCP功能
 20 $InputTCPServerRun 514            //开启514端口

[root@fwq ~]# systemctl restart rsyslog   //重启日志服务
[root@fwq ~]# ss -ntap | grep 514         //检查514端口是否开启
LISTEN     0      25           *:514                      *:*                   users:(("rsyslogd",pid=14884,fd=3))
LISTEN     0      25          :::514                     :::*                   users:(("rsyslogd",pid=14884,fd=4
  • 两端设置完成后进行测试
[root@localhost ~]# logger "nihao  123"     //在客户端写日志进去,测试日志打印

[root@fwq ~]# tail -f /var/log/messages     //在服务端查看日志记录
Apr 22 23:01:02 localhost systemd: Started Session 28 of user root.
Apr 22 23:01:02 localhost systemd: Starting Session 28 of user root.
Apr 22 23:05:02 fwq systemd: Stopping System Logging Service...
Apr 22 23:05:02 fwq rsyslogd: [origin software="rsyslogd" swVersion="8.24.0" x-pid="736" x-info="http://www.rsyslog.com"] exiting on signal 15.
Apr 22 23:05:02 fwq systemd: Starting System Logging Service...
Apr 22 23:05:02 fwq rsyslogd: [origin software="rsyslogd" swVersion="8.24.0" x-pid="14884" x-info="http://www.rsyslog.com"] start
Apr 22 23:05:02 fwq systemd: Started System Logging Service.
Apr 22 23:08:13 localhost root: nihao  123                     #显示出了nihao 123
Apr 22 23:08:13 localhost rsyslogd: action 'action 1' resumed (module 'builtin:omfwd') [v8.24.0 try http://www.rsyslog.com/e/2359 ]
Apr 22 23:08:13 localhost rsyslogd: action 'action 1' resumed (module 'builtin:omfwd') [v8.24.0 try http://www.rsyslog.com/e/2359 ]

5. 日志管理工具 journalctl

CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用 journalctl 一个命令,查看所有日志(内核日志和应用日志)。

#只查看内核日志(不显示应用日志)
journalctl -k     

#只看某个服务的日志
journalctl -u sshd  

#查看指定时间的日志   -S=since    -U=unit
 journalctl --since="2017-10-30 18:10:30"
 journalctl --since "20 min ago"
 journalctl --since yesterday
 journalctl -S "2023-07-31 2:00" -U "2023-07-31 03:00"
 journalctl --since 09:00 --until "1 hour ago"
 
#显示日志占据的硬盘空间
journalctl --disk-usage
 
#改变日志的输出格式,以 JSON 格式(多行)输出,可读性更好
journalctl  -u sshd -o json-pretty

#日志默认分页输出,--no-pager 改为正常的标准输出
 journalctl --no-pager

6. logrotate 日志转储

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。

6.1 logrotate 相关文件

  • 软件包:logrotate

  • 计划任务:/etc/cron.daily/logrotate

  • 程序文件:/usr/sbin/logrotate

  • 配置文件: /etc/logrotate.conf

  • 日志文件:/var/lib/logrotate/logrotate.status

6.2 logrotate 配置

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

# see "man logrotate" for details                                   全局配置
# rotate log files weekly
weekly      #一周生成一个新的日志文

# keep 4 weeks worth of backlogs
rotate 4    #只保留最近的4个文件

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext     # 添加一个日期后缀

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here            局部配置
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.
~                                                            

配置文件主要参数:

配置参数说明
compress通过gzip压缩转储以后的日志
nocompress不压缩
copytruncate用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate备份日志文件但是不截断
create mode ownergroup转储文件,使用指定的权限,所有者,所属组创建新的日志文件
nocreate不建立新的日志文件
delaycompress和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress覆盖 delaycompress 选项,转储同时压缩
errors address转储时的错误信息发送到指定的Email地址
ifempty即使是空文件也转储,此为默认选项
notifempty如果是空文件的话,不转储
mail address把转储的日志文件发送到指定的E-mail 地址
nomail转储时不发送日志文件
olddir directory转储后的日志文件放入指定目录,必须和当前日志文件在同一个文件系统
noolddir转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript在转储以前需要执行的命令,这两个关键字必须单独成行
postrotate/endscript在转储以后需要执行的命令,这两个关键字必须单独成行
daily指定转储周期为每天
weekly指定转储周期为每周
monthly指定转储周期为每月
rotate count指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份
tabooext [+] list让logrotate*不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig,.rpmsave, v, 和~
size size当日志文件到达指定的大小时才转储bytes(缺省)及KB或MB
sharedscripts默认,对每个转储日志运行prerotate和postrotate脚本,日志文件的绝对路径作为第一个参数传递给脚本。 这意味着单个脚本可以针对与多个文件匹配的日志文件条目多次运行(例如/ var / log / news /.example)。 如果指定此项sharedscripts,则无论有多少个日志*与通配符模式匹配,脚本都只会运行一次
nosharedscripts针对每一个转储的日志文件,都执行一次prerotate和 postrotate脚本,此为默认值
missingok如果日志不存在,不提示错误,继续处理下一个
nomissingok如果日志不存在,提示错误,此为默认值

以nginx为例:

cat /etc/logrotate.d/nginx 
/var/log/nginx/*.log {
   daily       #一天转储一个
   rotate 5    #保留5个
   missingok   #日志文件不存在不报错
   compress    #压缩转储后的日志
   delaycompress   #延迟压缩,下次再压缩
   notifempty      #如果空文件不转储
   create 644 ngnix nginx   #指定权限和属主属组
   postrotate               #转储前需要执行的命令
      if [ -f /app/nginx/logs/nginx.pid ]; then
          kill -USR1 `cat /app/nginx/logs/nginx.pid`
      fi
   endscript       #结束位
}