掘金 后端 ( ) • 2024-04-23 14:55

theme: channing-cyan

38945869881017195d7c9d00cad250e.jpg

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总数和已经使用的数量

image.png

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

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

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

image.png

image.png

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

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

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

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

lsof | grep f1.txt

kill -9 PID

注意

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

四、访问文件的简单流程

12e0646a2315bffa7447a562e053b57.jpg

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

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

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

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

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

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

查看inode号码的方法

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

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

image.png

五、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:查询最近三次登录的用户信息。

image.png

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

image.png

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

image.png

  1. last: 读取 /var/log/wtmp 文件,显示登录系统的用户信息。

image.png

  1. lastb:读取 /var/log/btmp 文件,显示登入系统失败的用户信息。

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. 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 特性

e6360c374a95702b1266d896de810aa.jpg

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

查看 rsyslog 工具的详细信息:

image.png

3. ELK

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

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

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

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

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

六、rsyslog管理

系统日志术语

  • 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模块

image.png

image.png

image.png

七、rsyslog 应用实例

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

实验步骤

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

image.png

image.png

image.png

image.png

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

image.png

image.png

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

image.png

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

image.png

image.png

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

image.png

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

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

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

实验步骤

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

关闭防火墙;

image.png

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

image.png

重启rsyslog 服务;

image.png

检查514端口是否开启。

image.png

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

关闭防火墙;

image.png

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

image.png

注意

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

重启rsyslog 服务;

image.png

测试日志打印。

image.png

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

image.png

八、日志管理工具:journalctl

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

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

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

示例

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

image.png

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

image.png

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

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

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

image.png

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

九、日志管理策略

及时做好备份和归档

延长日志保存期限

控制日志访问权限

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

集中管理日志

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

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

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