Linux文件系统与日志分析

Linux文件系统

一、inode 与 block

  • 文件数据包括元信息与实际信息;

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

  • 一个文件必须占用一个inode, 并且至少占用一个block

1. block:(块)的概念

  • 连续的八个扇区组成一个block(4k);

  • 是文件存取的最小单位

  • 操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取

2. inode:(索引节点)的概念

  • 存储文件元信息( 比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode号;

  • 中文译名为"索引节点",也叫i节点;

  • 用于存储文件元信息;

  • inode不包含文件名,文件名是存放在目录当中的。

3. 文件数据的概念

文件数据包括实际数据元信息文件数据存储在block中,文件元信息存在inode中。而文件名是存放在目录当中的

文件数据 存放位置
实际数据 block
元信息 inode
文件名 目录

二、inode表的结构

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

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

每一个inode表记录对应保存了文件的元信息:

  • inode number 节点号

  • 文件类型

  • 文件的读、写、执行权限

  • 文件属主的UID

  • 文件属组的GID

  • 链接数(指向这个文件名路径名称个数)

  • 该文件的大小和不同的时间戳

  • 指向磁盘上文件的数据块指针

  • 有关文件的其他数据

三、inode 的大小

  • inode也会消耗硬盘空间

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

    • 如果磁盘还有空间,但inode号被全部占用,也无法创建新文件。

    • inode号在同一个文件系统内唯一,在不同的文件系统中可以重复

使用 "df -i" 命令可以查看每个硬盘分区的inode总数和已经使用的数量

删除文件后空间不释放的处理方法

删除文件后,如果磁盘空间没有释放,是因为文件正在被其他人打开。 其他人退出使用该文件后空间会被释放。

可以使用 w 命令或 lsof 命令查看是否有人在使用该文件。

如果确定有人打开了该文件,可以使用三种方法释放空间

  • 将被打开的文件变成空文件,依赖shell环境:echo " " > f1.txt

  • 导入空文件:cat /dev/null > f1.txt

  • 查看被删除的文件和对应PID,之后杀死该进程:

lsof | grep f1.txt

kill -9 PID

注意

删除文件前,一定要确认清除的该文件是否为有效文件。

四、访问文件的简单流程

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

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

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

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

    • 如果有访问权限,则利用指针去指向实际数据所在的block,读出数据。

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

查看inode号码的方法

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

  • stat 命令:查看文件inode信息中的inode号码

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

  • atime(access time):最近访问

    最后一次访问文件的时间

  • mtime(modify):最近更改

    最后一次更改文件内容的时间

  • ctime(change time):最近改动

    最后一次改变文件元信息的时间

注意

  • 不打开文件的话,atime不变。例如使用echo追加内容,atime不会变,因为文件没有被打开访问。

  • 修改文件内容的话,mtime会变,ctime也会变。

  • 如果只修改文件的权限,ctime变,mtime不变

日志分析

一、日志文件介绍

日志的功能

  • 用于记录系统、程序运行中发生的各种事件

  • 通过阅读日志,有助于诊断和解决系统故障

日志文件的分类

  • 内核及系统日志:

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

  • 用户日志:

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

  • 程序日志:

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

日志保存位置:

  • 默认位于:/var/log 目录下

主要日志文件介绍

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

二、内核及系统日志

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

  • 软件包:rsyslog-8.24.0-12.el7.x86_64 (可使用 "rpm -q" 命令查看)

  • 主要程序:/sbin/rsyslogd

  • 配置文件:/etc/rsyslog.conf (可使用 "rpm -qc" 命令查看)

日志消息的级别

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

日志记录的一般格式

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

三、用户日志分析

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

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

示例

  1. users:查询最近三次登录的用户信息。
  1. who:查看当前登录的用户、终端、登录时间、IP地址。
  1. w:查看当前登录的用户、终端、IP地址、登录时间、占用CPU的情况、进程等。
  1. last: 读取 /var/log/wtmp 文件,显示登录系统的用户信息。
  1. lastb:读取 /var/log/btmp 文件,显示登入系统失败的用户信息。

四、程序日志分析

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

  • 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. sysklogd 系统日志服务

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

  • syslogd: system application 记录应用日志

  • klogd: linux kernel 记录内核日志

事件记录格式

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

C/S架构

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

2.rsyslog 系统日志

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

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

官网www.rsyslog.com/

rsyslog 特性

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

查看 rsyslog 工具的详细信息:

3. ELK

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

  • 非关系型分布式数据库基于apache软件基金会jakarta项目组的项目lucene;

  • Elasticsearch是个开源分布式搜索引擎,可以处理大规模日志数据,比如:Nginx、Tomcat、系统日志等功能;

  • Logstash对日志进行收集、分析,过滤,并将其存储供以后使用;

  • Kibana 可以提供的日志分析友好的 Web 界面。

六、rsyslog管理

1 系统日志术语

  • facility:设施,从功能或程序上对日志进行归类

内置分类:auth(验证), authpriv, cron(定时任务), daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, syslog

自定义的分类

local0-local7

  • Priority 优先级别,从低到高排序

  • 参看帮助: man 3 syslog,man logger

日志等级

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

服务名称(即什么服务产生的日志)

服务名称 说 明
auth(LOG AUTH) 安全和认证相关消息 (不推荐使用authpriv替代)
authpriv(LOG_AUTHPRIV) 安全和认证相关消息(私有的)
cron (LOG_CRON) 系统定时任务cront和at产生的日志
daemon (LOG_DAEMON) 与各个守护进程相关的曰志
ftp (LOG_FTP) ftp守护进程产生的曰志
kern(LOG_KERN) 内核产生的曰志(不是用户进程产生的)
Iocal0 ~ local7 (LOG_LOCAL0-7) 为本地使用预留的服务
lpr (LOG_LPR) 打印产生的日志
mail (LOG_MAIL) 邮件收发信息
news (LOG_NEWS) 与新闻服务器相关的日志
syslog (LOG_SYSLOG) 存syslogd服务产生的曰志信息(虽然服务名称己经改为reyslogd,但是很多配罝依然沿用了 syslogd服务的,所以这里并没有修改服务名称)
user (LOG_USER) 用户等级类别的日志信息
uucp (LOG_UUCP> uucp子系统的日志信息,uucp是早期Linux系统进行数据传递的协议,后来 也常用在新闻组服务中

2. 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

3. rsyslog 配置文件

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

  • MODULES:相关模块配置

  • GLOBAL DIRECTIVES:全局配置

  • RULES:日志记录相关的规则配置

查看/etc/rsyslog.conf 文件中的RULES模块

七、rsyslog 应用实例

1.单独设置ssh远程登录程序的日志

实验步骤

步骤1:修改rsyslog服务的配置文件/etc/rsyslog.conf,设置LOCAL6对应的日志路径。

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

步骤3:重启 rsyslog 服务和 ssh 服务。

步骤4:打开第二台机器,添加规则信息,远程连接原服务器。输入密码,稍后查看原服务器的日志。

步骤5:查看原服务器的日志记录。在/data/ssh.log目录中成功记录了第二台机器的行为。

注意:两台服务器都需要关闭防火墙。

2.网络日志(远程日志功能)

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

实验步骤

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

关闭防火墙;

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

重启rsyslog 服务;

检查514端口是否开启。

步骤2:编辑配置文件 /etc/rsyslog.conf(发送方填写需要传输的日志和接收方的IP地址)。

关闭防火墙;

编辑配置文件,填写需要传输的日志和接收方地址;

注意

@IP地址表示使用UDP功能;@@IP地址表示使用TCP地址

重启rsyslog 服务;

测试日志打印。

步骤3:查看接收方能否成功接收日志记录。

八、日志管理工具:journalctl

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

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

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

示例

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

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

3)查看本次启动的日志:journalctl -b

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

查看上一次启动的日志:journalctl -b -1

4)查看指定时间的日志:

journalctl --since="2022-03-05 18:10:30"

journalctl --since "20 min ago"

journalctl --since yesterday

journalctl --since "2022-03-05" --until "2022-03-10 03:00"

journalctl --since 09:00 --until "1 hour ago"

5) 显示尾部指定行数。默认10行:journalctl -n <数字>

6)实时滚动显示最新日志(显示最新10行):journalctl -f

7) 查看指定服务的日志:journalctl /usr/lib/systemd/systemd

九、日志管理策略

及时做好备份和归档

延长日志保存期限

控制日志访问权限

  • 日志中可能会包含各类敏感信息,如账户和口令等。

集中管理日志

  • 将服务器的日志文件发到统一的日志文件服务器;

  • 便于日志信息的统一收集、 整理和分析;

  • 杜绝日志信息的意外丢失、恶意篡改或删除。

相关推荐
人生苦短,菜的抠脚7 小时前
Linux 内核IIO sensor驱动
linux·驱动开发
jz_ddk7 小时前
[LVGL] 从0开始,学LVGL:进阶应用与项目实战(上)
linux·信息可视化·嵌入式·gui·lvgl·界面设计
望获linux8 小时前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
MC丶科8 小时前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
江公望8 小时前
ubuntu kylin(优麒麟)和标准ubuntu的区别浅谈
linux·服务器·ubuntu·kylin
Lynnxiaowen8 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
生态笔记8 小时前
PPT宏代码
linux·服务器·powerpoint
mucheni9 小时前
迅为RK3588开发板Ubuntu 系统开发ubuntu终端密码登录
linux·运维·ubuntu
skywoodsky9 小时前
Ubuntu 24.04环境下的挂起转休眠
linux
小云数据库服务专线9 小时前
GaussDB 应用侧报Read timed out解决方法
linux·服务器·gaussdb