Linux文件系统与日志分析

130 阅读20分钟

 一、inode和block

  • 文件数据包括元信息与真实数据。

  • 文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节。

  • block(块)

    • 连续的八个扇区组成一个block
    • 是文件存取的最小单位
  • inode(索引节点)

    • 中文译名为“索引节点”,也叫 i 节点
    • 用于存储文件元信息
  • 一个文件必须占用一个inode ,至少占用一个block

inode和block关系

  1. 文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。
  2. 一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。
  3. 文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在“块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode。 因此,一个文件必须占用一个inode,并且至少占用一个block。
  4. inode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
  5. 每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个或多个文件名。
  6. 所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找自己文件夹中的目录项,之后找到对应的inode号码;通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。

inode介绍

inode 表结构

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

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

文件的元数据信息。

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

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

inode的号码

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

  1. 用户访问文件时,系统先去查找文件所属目录中的目录项,根据文件名找到对应的inode号码。

  2. 通过inode号码,获取inode信息。

  3. 根据inode信息,判断用户是否具备访问权限。

    • 如果有访问权限,则利用指针去指向实际数据所在的block,读出数据。
    • 如果没有访问权限,则返回Permission denied。根据inode信息,利用指针去指向实际数据所在的block,读出数据。

inode 的大小

  • inode也会消耗硬盘空间

    • 每个inode的大小一般是128字节或256字节
  • 格式化文件系统时确定inode的总数

    • 如果磁盘还有空间,但inode号被全部占用,也无法创建新文件。
    • inode号在同一个文件系统内唯一,在不同的文件系统中可以重复。
  • 使用 "df -i" 命令可以查看每个硬盘分区的inode总数和已经使用的数量

image.png

在同一设备中inode号是唯一的,但是在不同的设备里则不是唯一的,可以相同。

inode号是一种有限资源,若消耗完毕将无法继续新建文件,解决方式就是删除垃圾文件和空文件

如何查看inode号

  • ls -i 命令:查看文件名对应的inode号码
  • stat 命令:查看文件inode信息中的inode号码
[root@localhost ~]# stat /data       //stat 文件查看当前文件inode号。   
  文件:"/data"
  大小:22        	块:0          IO 块:4096   目录
设备:fd00h/64768d	Inode:16985362    硬链接:2
权限:(0755/drwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:default_t:s0
最近访问:2024-04-21 15:35:52.181793985 +0800
最近更改:2024-04-21 15:35:51.040771914 +0800
最近改动:2024-04-21 15:35:51.040771914 +0800
创建时间:-
[root@localhost ~]# ls -i /data         //ls -i 查看inode号
16985372 tmp.fifo

image.png

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

  • atime(access time):最近访问

    最后一次(最近一次)访问文件的时间,必须要打开文件才能更改。

  • mtime(modify):最近更改

    最后一次(最近一次)更改文件内容的时间,文件内容有更改就会改变该时间。

  • ctime(change time):最近改动

    最后一次(最近一次)改变文件元信息的时间,包括权限、 属主、属组、大小。会随着mtime更改而更改。

注意:

  • 不打开文件的话,atime不变。例如使用echo追加内容,atime不会变,因为文件没有被打开访问。
  • 修改文件内容的话,mtime会变,ctime也会变。
  • 如果只修改文件的权限,ctime变,mtime不变。

通过观察,在使用find查找文件时间时(尤其是查找日志文件)建议使用mtime。

image.png

inode的特殊作用

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

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

演示:

[root@localhost zhu]# ls               //查看当前文件夹下的文件
__  passwd
[root@localhost zhu]# ls -i __        //查看当前文件的inode号
8389462 __
[root@localhost zhu]# find -inum 8389462 -delete
//通过inode号来删除该文件

image.png

日志

日志文件介绍与分析

日志的功能:

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

日志文件的分类:

  • 内核及系统日志:

    这种日志数据由系统服务rsyslog统一管理,对本机日志进行收集、整理、分析。根据其主配置文件/etc/rsyslog.conf中的设置,决定将内核消息及各种系统程序消息记录到什么位置。日志格式基本相似。

  • 用户日志:

    记录用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。

  • 程序日志:

    有些应用程序会选择由自己独立管理一份日志文件(而不是交给rsyslog服务管理),用于记录本程序运行过程中的各种事件信息。记录格式不统一。

    总的来说日志主要记录系统中的历史事件,时间、某用户(机器)、相关操作

日志保存位置:

  • 默认位于:/var/log 目录下,也可以改变但是要修改rsyslog配置文件。

主要日志文件介绍

常见的一些日志文件:

日志文件位置日志文件说明命令
/var/log/messages内核和公共日志系统中大部分信息都存在这里,它是核心系统日志文件,其中包含了系统启动时的引导信息,以及系统运行时的其他状态消息。I/O 错误、网络错误和其他系统错误都会记录到此文件中。其他信息,比如某个人的身份切换为 root,已及用户自定义安装软件的日志,也会在这里列出。
/var/log/cron 计划任务日志记录与系统定时任务相关的曰志
/var/log/dmesg 系统引导日志记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/maillog 邮件日志记录邮件信息的曰志
用户日志
/var/log/lastlog记录系统中所有用户最后一次的登录时间的曰志。这个文件也是二进制文件.不能直接用Vi 查看。而要使用lastlog命令查看lastlog
/var/log/secure系统安全日志,记录一些登录失败的信息。记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
/var/log/btmp登录失败目录,由于是二进制文件,无法立刻查看。这里可以利用lastb可以查看到哪些用户登录失败lastb
/var/log/wtmp永久记录所有用户的登陆、注销信息,同时记录系统的启动、重启、关机事件。同样,这个文件也是二进制文件.不能直接用Vi查看,而要使用last命令查看last
/var/tun/ulmp记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用Vi查看,而要使用w、who、users等命令查看w、who、users

较为重要

日志作用命令
btmp查看登录失败的用户lastb
lastlog查看用户最后一次登录的情况lastlog
wtmp用户成功登录的日志last

1.日常日志信息

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

[root@localhost log]# cat /var/log/messages | head 
Apr 23 09:38:01 localhost rsyslogd: [origin software="rsyslogd" swVersion="8.24.0" x-pid="707" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Apr 23 09:40:01 localhost systemd: Started Session 12 of user root.
Apr 23 09:40:01 localhost systemd: Starting Session 12 of user root.
Apr 23 09:50:01 localhost systemd: Started Session 13 of user root.

2.系统安全日志

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

例如登录失败提醒

[root@localhost log]# tail -f /var/log/secure
Apr 23 18:55:32 localhost sshd[4026]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Apr 23 18:55:34 localhost sshd[4026]: Failed password for root from 192.168.83.10 port 44566 ssh2
Apr 23 18:55:41 localhost unix_chkpwd[4030]: password check failed for user (root)
Apr 23 18:55:41 localhost sshd[4026]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Apr 23 18:55:43 localhost sshd[4026]: Failed password for root from 192.168.83.10 port 44566 ssh2

image.png

3.登录失败日志

文件位置 : /var/log/btmp
该文件为二进制文件,不是普通文本文件,所以无法直接查看。 可以借助lastb 命令查看哪些用户登录失败。

[root@localhost log]# lastb
root 用户身份    ssh:notty登录方式    192.168.83.10远端地址    Tue Apr 23 18:55 - 18:55  (00:00)时间    
root     ssh:notty    192.168.83.10    Tue Apr 23 18:55 - 18:55  (00:00)    
root     ssh:notty    192.168.83.10    Tue Apr 23 18:55 - 18:55  (00:00)    

btmp begins Tue Apr 23 18:55:34 2024

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

文件位置 : /var/log/lastlog
该文件同样是二进制文件,无法直接查看。使用lastlog命令进行查看

[root@localhost log]# lastlog 
用户名           端口     来自             最后登陆时间
root             pts/0    192.168.83.1     二 4月 23 18:55:05 +0800 2024
bin                                        **从未登录过**
daemon                                     **从未登录过**
adm                                        **从未登录过**
zhu              :0                        四 2月 29 01:06:02 +0800 2024

5.目前用户成功登录的日志

文件位置 : /var/log/wtmp
该文件为非文本,属于二进制文件,无法直接查看。使用last命令查看,查看最近一次成功登录或重启日志。

[root@localhost log]# last
root     pts/0        192.168.83.1     Tue Apr 23 21:30   still logged in   
root     pts/0        192.168.83.1     Tue Apr 23 18:55 - 19:25  (00:30)    
root     pts/1        192.168.83.1     Tue Apr 23 15:14 - 19:25  (04:10)    
reboot   system boot  3.10.0-693.el7.x Tue Apr 23 15:14 - 21:34  (06:19)    

6.记录硬件信息日志

文件位置 :  /var/log/dmesg
机器添加任何硬件,都会记录在此日志中,可以查看文本,也可以使用单独命令 dmesg

[root@localhost log]# tail -n10  /var/log/dmesg
[    2.484517] Bluetooth: HCI socket layer initialized
[    2.484518] Bluetooth: L2CAP socket layer initialized
[    2.484522] Bluetooth: SCO socket layer initialized
[    2.489895] XFS (sda1): Mounting V5 Filesystem
[    2.496263] usbcore: registered new interface driver btusb
[    2.508317] Adding 4194300k swap on /dev/mapper/centos-swap.  Priority:-1 extents:1 across:4194300k FS
[    2.583650] XFS (sda1): Ending clean mount
[    5.360409] floppy0: no floppy controllers found
[    5.360454] work still pending
[    5.459319] type=1305 audit(1713856486.677:4): audit_pid=678 old=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:auditd_t:s0 res=1

7.记录系统启动服务

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

系统服务启动的相关信息,系统启动时的服务日志,可以文本查看。

8.记录安装系统的相关信息

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

安装系统时的相关信息 ,属于文本格式。

9.计划任务

文件位置 : /var/log/cron

日志消息的级别:

描述事件的严重程度,日志消息级号越小优先级越高代表级别越紧急。

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

用户日志分析

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

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

分析工具:

  • users、who、w、last、lastb

演示:

1.users:查询最近三次登录的用户信息。

users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。 如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。 image.png

2.who:查看当前登录的用户、终端、登录时间、IP地址。

who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可 以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用 户名、终端类型、登录日期及远程主机。 image.png

3.w:查看当前登录的用户、终端、IP地址、登录时间、占用CPU的情况、进程等。

w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的 输出内容要丰富一些。 image.png

程序日志分析

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

  • 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. 延长日志保存期限

  3. 控制日志访问权限

    • 日志中可能会包含各类敏感信息,如账户、口令等。
  4. 集中管理日志(专门抽调出一个服务器进行管理日志文件)

    • 将服务器的日志文件发到统一的日志文件服务器
    • 便于日志信息的统一收集、整理和分析
    • 杜绝日志信息的意外丢失、恶意篡改或删除

系统日志相关服务

sysklogd 系统日志服务介绍

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

  • syslogd: system application 记录应用日志
  • klogd: linux kernel 记录内核日志

事件记录格式:

  • 日期时间 主机 进程[pid]: 事件内容

C/S架构:

  • 通过TCP或UDP协议的服务完成日志记录传送,将分布在不同主机的日志实现集中管理

rsyslog 系统日志服务

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

当应用有限的处理时,RSYSLOG每秒可以将超过一百万的消息传递到本地目的地。即使在远程的目的地和更精细的处理中,性能通常也被认为是惊人的”。

官网:

www.rsyslog.com/

rsyslog 特性:

  • 多线程
  • 适配UDP, TCP, SSL, TLS, RELP协议。
  • MySQL, PGSQL, Oracle实现日志存储。
  • 强大的过滤器,可实现过滤记录日志信息中任意部分。
  • 自定义输出格式。
  • 适用于企业级中继。
  • 支持Windows系统。

rsyslog 工具的详细信息: image.png

ELK

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

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

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:日志记录相关的规则配置(日志生成规则)

通过rpm- qc命令找到rsyslog的配置文件/etc/rsyslog.conf

#### 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
"-"表示异步写入 异步:内存中记录一段时间后再存入磁盘 同步:内存中有一条,磁盘上有一条

# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
local0~local7    自定义使用,生成独立的文件指向相对应的程序,对应的文件也需要更改配置文件,相互兼容。

 rsyslog应用实例

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

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

1.找到rsyslog文件配置,修改rsyslog服务的配置文件/etc/rsyslog.conf,设置local6对应的日志路径。

image.png

image.png

2.修改ssh服务的配置文件/etc/ssh/sshd_config,将ssh的日志修改为记录在LOCAL6对应的路径下。

  • 注意:ssh服务的日志默认放在authpriv服务对应的路径下,需先将该行注释掉。

image.png

image.png

3.重启 rsyslog 服务和 ssh 服务。

image.png

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

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

实验思路:

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

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

实验步骤:

客户端(发送方)设置:

开始之前一定要关防火墙!!!

1. 关闭防火墙 image.png

2. 编辑配置文件,开启TCP功能和514端口(去掉这两行原有的#号) image.png

3.编辑规则信息需要传输的日志和接收方地址;(@@代表使用tcp @代表udp) image.png

4.重启日志服务 image.png

服务器(接收方)设置:编辑rsyslog的配置文件 /etc/rsyslog.conf(接收方开启TCP功能和514端口)。

1.关闭防火墙 image.png

2.编辑对应的配置文件,开启TCP功能和514端口(去掉这两行原有的#号) image.png image.png

3.重启rsyslog 服务并检查514端口是否开启。 image.png

4.测试打印日志查看接收方能否收到日志记录 image.png

 日志管理工具 journalctl

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

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

journalctl命令格式:journalctl [选项] [匹配项]

1.查看所有日志。 默认情况下,只保存本次启动的日志:journalctl

image.png

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

image.png

  1. 查看本次启动的日志:journalctl -b

image.png

4.查看上一次启动的日志:journalctl -b | head -10 image.png

5.journalctl -f,实时滚动显示最新日志(显示最新10行) image.png

6.只看某个服务的日志 image.png

logrotate 日志转储

面对生产环境下日志可能很大,在这样的环境下需要对日志进行分割。

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

logrotate 相关文件

软件包:logrotate

  • 计划任务:/etc/cron.daily/logrotate
  • 程序文件:/usr/sbin/logrotate
  • 配置文件: /etc/logrotate.conf
  • 日志文件:/var/lib/logrotate/logrotate.status
[root@zhuzhu ~]# rpm -qc logrotate 
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/rwtab.d/logrotate
[root@zhuzhu ~]# vim /etc/logrotate.conf 

# see "man logrotate" for details
# rotate log files weekly
weekly  每周,一周生成一个新的日志

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

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

# keep 4 weeks worth of backlogs
rotate 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