文件系统和日志分析
一、文件系统
1、文件系统的组成
-
扇区(Sector):
- 扇区是硬盘存储数据的最小单位。它是一个固定大小的数据块,通常为512字节。硬盘上的每个扇区都有一个唯一的地址,操作系统可以通过这个地址来读取或写入数据。扇区的大小是硬件设备决定的,一般是固定不变的。
-
块(Block):
- 块是文件系统管理存储空间的基本单位。它通常由连续的多个扇区组成,以便更高效地管理和操作文件。在大多数文件系统中,一个块由连续的八个扇区组成,这意味着一个块的大小为4KB(8 * 512字节)。块的大小是文件系统设计时确定的,并且通常是固定的,这有助于提高文件系统的性能和效率。块是文件系统中的最小存取单位,意味着文件系统中的文件无法被读取或写入单个扇区,而是以块为单位进行操作。
-
索引节点(Inode)
-
索引节点是文件系统中用于管理文件的元数据的数据结构。虽然索引节点包含了文件的许多属性,如文件的大小、创建者、创建日期、权限等,但通常不包括文件名。这是因为文件名通常不是存储在索引节点中的,而是存储在目录项(Directory Entry)中。
-
在文件系统中,目录项是一个记录文件名和对应索引节点的映射关系的数据结构。每个目录都是一个包含目录项的文件,这些目录项将文件名与相应的索引节点关联起来。因此,当操作系统需要查找特定文件时,它会先在相应的目录中查找文件名,然后获取对应的索引节点,从而获得文件的其他元数据以及指向文件内容的指针。
-
将文件名存储在目录项而不是索引节点中的一个好处是,文件名可以在不改变文件内容或属性的情况下进行修改。如果文件名存储在索引节点中,每次修改文件名都需要更新索引节点,这可能会引起一些额外的开销。另外,将文件名存储在目录项中还使得文件系统更易于管理和组织文件,因为目录项提供了对文件名的快速访问和操作的接口。
- 总之,在 Linux 文件系统中,每个文件都由 inode 和至少一个 block 组成。inode 存储文件的元数据,而 block 存储文件的实际内容。
用户访问 一个文件的真实流程
- 用户访问文件时,通过文件名找到对应的inode号,通过Inode号获取inode信息,根据inode信息判断用户是否有权限访问文件,有则指向对于的数据block并读取数据,无则拒绝访问。
- 在Unix/Linux系统中,当用户创建一个新文件时,文件系统会为该文件分配一个唯一的inode号。这个inode号用于唯一标识这个文件,并且系统会根据这个inode号来管理和访问文件的元数据以及文件的实际内容。
2、Inode(Index Node,索引节点)的作用
- 唯一标识文件:每个文件在文件系统中都有一个唯一的inode号,这个号码用于唯一地标识文件,使得文件系统能够准确地管理和定位文件。
- 存储文件元数据:Inode存储了文件的元数据,包括但不限于文件的大小、创建时间、修改时间、所有者、权限等信息。这些元数据对于操作系统和用户来说都是非常重要的,因为它们提供了文件的基本属性和特征。
- 指向文件数据的指针:Inode包含了指向存储文件实际内容的数据块的指针。这些指针告诉文件系统在磁盘上如何定位文件的实际数据,从而允许读取和写入文件。通常,这些指针指向直接块、间接块和双重间接块,以支持文件的灵活大小。
- 跟踪文件链接数量:Inode还跟踪与文件相关联的链接数量。链接是指文件系统中将文件名映射到inode号的关系。通过跟踪链接数量,文件系统可以知道一个文件被多少个目录条目引用,从而确保在文件被删除时适当地释放资源。
- 提高文件系统性能:Inode的设计能够提高文件系统的性能。通过将文件的元数据和数据分开存储,文件系统可以更高效地管理和访问文件,减少了对磁盘的访问次数,提高了文件系统的性能。
- inode表保存文件的元信息,这些元信息包括但不限于以下内容
- 文件类型:指示文件类型的标识,如普通文件、目录、符号链接等。
- 文件大小:指示文件所占用的空间大小,以字节为单位。
- 访问权限:定义了文件对于各种用户(所有者、所属组、其他用户)的访问权限,包括读、写、执行权限。
- 所有者ID:指示文件所有者的用户ID。
- 所属组ID:指示文件所属组的组ID。
- 创建时间:记录文件创建的时间戳。
- 修改时间:记录文件内容或元数据上一次被修改的时间戳。
- 访问时间:记录文件上一次被访问的时间戳。
- 链接数量:指示指向该inode的硬链接的数量。
- 指向数据块的指针:包括直接块指针、间接块指针、双重间接块指针等,用于指示文件数据存储的位置。
- 文件状态标志:记录了文件的当前状态,如是否为只读、是否为隐藏文件等。
- 文件系统相关信息:包括inode所在的文件系统信息等。
3、查看inode号的命令
ls -i
stat 文件路径
df -i #查看可用inode号
df -h #查看可用空间
stat 显示文件 时间调整信息
atime(access time):最近访问
最后一次访问文件的时间
mtime(modify):最近更改
最后一次更改文件内容的时间
ctime(change time):最近改动
最后一次改变文件元信息的时间
# 示例
[root@yun02 local]# stat apps
文件:"apps"
大小:78 块:0 IO 块:4096 目录
设备:fd00h/64768d Inode:102276727 硬链接:7
权限:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2024-03-28 14:55:33.303918059 +0800
最近更改:2024-03-27 14:45:11.011116782 +0800
最近改动:2024-03-27 14:45:11.011116782 +0800
创建时间:-
[root@yun02 local]#
0
4、执行文件命令对inode号的影响
-
cp **命令:**分配一个空闲的inode号,在inode表中生成新条目在目录中创建一个目录项,将名称与inode编号关联拷贝数据生成新的文件。
-
rm **命令:**硬链接数递减,从而释放的inode号可以被重用,块放在空闲列表中,删除目录项数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖。
-
**mv命令:**如果mv命令的目标和源在同一设备,不影响inode表(除时间戳)或磁盘上的数据位置;系统会删除旧的目录对应关系,新建目录对应关系。
-
**vim编辑器 :**vim编辑器改变文件内容,是先创建一个新的swp文件,编辑的内容也是在swp文件中进行,当用户保存时,swp文件就会替换当前文件,因此inode号会发生改变。
-
**利用echo命令往文件中加内容 :**对原文件进行操作,只改变原文件的内容,其他没有任何影响,inode号不发生改变
5、inode号的运用———链接
硬链接与软链接的区别:
- 硬链接:
-
硬链接是指通过文件系统中文件的 inode 来创建的链接关系。当你创建一个硬链接时,实际上是在文件系统中创建了另一个文件名与相同的 inode 关联。
-
硬链接与原始文件共享相同的 inode 和数据块,因此无论哪个文件名被用来访问文件,其内容都是相同的。
-
删除原始文件不会影响硬链接文件,因为它们共享相同的 inode 和数据块。
- 软链接(符号链接):
-
软链接是一种特殊的文件,其中包含了指向另一个文件的路径。它实际上是一个指向目标文件名的符号链接。
-
软链接与硬链接不同,它指向目标文件的路径而不是共享相同的 inode 和数据块。如果原始文件被删除,那么软链接将变为失效的“死链接”。
6、通过inode号删除rm常规方法删除不掉的文件
# 创建文件时特殊字符或空格作为文件名可能会引起问题
touch '#abc123'
find /opt -inum 67320322 -delete
find /opt -inum 67320322 -exec rm -rf {} \;
find /opt -inum 67320322| xargs rm -rf
二、日志分析
1、日志的作用(包括但不限于)
- 故障排查与故障恢复:日志记录系统运行过程中的各种事件、错误、警告和异常情况,帮助系统管理员或开发人员快速定位和解决问题。当系统出现故障或异常时,通过分析日志可以追踪到问题发生的原因,加快故障排查和恢复的速度。
- 性能监控与优化:日志可以记录系统的运行状态、资源利用情况、响应时间等性能指标,帮助管理员监控系统的性能表现,及时发现性能瓶颈和优化空间,以提高系统的效率和稳定性。
- 安全审计与追踪:日志可以记录用户的登录行为、文件访问记录、系统配置变更等安全相关的操作,有助于审计系统的安全性和合规性,及时发现潜在的安全威胁和非法行为,并追踪责任人。
- 数据恢复与备份:通过定期备份系统日志,可以保留系统运行状态的历史记录,以便在系统损坏或数据丢失时进行数据恢复和重建,减少数据损失和业务中断的风险。
- 业务分析与决策支持:日志记录了系统中的各种操作和交易信息,可以作为业务分析和决策的重要依据。通过分析用户行为、交易流程、产品销售情况等数据,可以洞察市场趋势,优化业务流程,提高服务质量和用户满意度。
2、日志文件的分类及其说明
- Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下。
日志种类 | 位置 | 功能描述 |
---|---|---|
内核及公共消息日志 | /var/log/messages | 记录Linux内核消息及各种应用程序的公共日志信息,包括启动、Io错误、网络错误、程序故障等,对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。 |
计划任务日志 | /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/ulm | 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用 vi 查看,而要使用w、who、users等命令查看。 |
3、日志主要配置文件
- 内核及系统日志由系统服务 rsyslog 统一管理,主配置文件为/etc/rsyslog.conf
vim /etc/rsyslog.conf #查看rsyslog.conf配置文件
4、连接符号
连接符号可以识别为:
”*“代表所有日志等级,比如:“authpriv.*”代表authpriv认证信息服务产生的日志,所有的日志等级
都记录
“.”代表只要比后面的等级高的(包含该等级)日志都记录下来。比如:“cron.info”代表cron服务产生的
日志,只要日 志等级大于等于info级别,就记录
“.=”代表只记录所需等级的日志,其他等级的都不记录。比 如:“*.=emerg”代表人和日志服务产生的
日志,只要等级是 emerg等级就记录。这种用法及少见,了解就好
“.!”代表不等于,也就是除了该等级的日志外,其他等级的 日志都记录。
5、日志等级
- 注意:数字等级越小,优先级越高,消息越重要
-
指定日志级别:
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
中;“-”代表异步模式。
-
日志记录位置:
- 日志文件的绝对路径,如
/var/log/secure
。 - 系统设备文件,如
/dev/lp0
。 - 转发给远程主机,如
@192.168.0.210:514
。 - 用户名,如
root
。 - 忽略或丢弃日志,如
~
。
- 日志文件的绝对路径,如
6、日志分析工具的引入
- users:查看当前登录系统的用户名列表。
- who:查看当前登录系统的用户信息,包括用户名、终端、登录时间、IP地址等。
- w:显示当前登录系统的用户信息,包括用户名、终端、IP地址、登录时间、占用CPU的情况、进程等。
- last:查询成功登录到系统的用户记录,显示最近登录的用户信息,包括用户名、登录时间、登录IP地址等。
- lastb:查询登录失败的用户记录,显示最近登录失败的用户信息,包括用户名、登录失败时间、登录失败的终端等。
7、程序日志分析:由相应的应用程序独立进行管理
Web服务:/var/log/httpd/
access_log ——记录客户访问事件
error_log ——记录错误事件
代理服务:/var/log/squid/
access.log、cache.log
三、 日志轮替
1、概念
-
在 CentOS 7 中,日志轮替(log rotation)是一种管理日志文件的方法,旨在限制日志文件的大小并确保系统日志的持续记录和管理。日志轮替通过定期将现有日志文件重命名、压缩和/或移动,并创建新的空日志文件来实现。
-
日志轮替通常由系统日志记录工具(如rsyslogd、syslog-ng等)或专用的日志轮替工具(如logrotate)负责管理。其主要目的包括:
- 限制日志文件大小:通过定期轮替日志文件,可以避免日志文件无限增长而耗尽磁盘空间,确保系统存储资源的有效利用。
- 避免日志文件过大:大型日志文件不仅会消耗大量磁盘空间,还可能导致日志文件的处理和分析变得困难。日志轮替可以将大型日志文件分割成更小的片段,便于管理和分析。
- 保留历史日志:通过轮替日志文件并备份旧日志文件,可以保留历史日志记录,以供日后审计、故障排查和安全审计等目的使用。
- 提高日志访问效率:通过定期清理和归档日志文件,可以提高系统日志的访问效率,加快日志检索和分析的速度。
- 降低系统负载:较小的日志文件和更有效的日志管理可以降低系统的负载,提高系统的性能和稳定性。
2、日志文件命名规范
- 日志文件的命名规则通常由系统或应用程序决定,并且可以根据特定的需求和偏好进行配置。一般来说,日志文件的命名规则可能遵循以下几种常见的方式:
-
基于应用程序或服务名称:日志文件的命名可能会包含应用程序或服务的名称,以便识别不同应用程序或服务生成的日志。例如,Apache Web 服务器的访问日志可能命名为
access_log
,错误日志可能命名为error_log
。 -
基于日期和时间:日志文件的命名可能包含日期和时间信息,以便轻松识别日志文件的创建时间。通常,日期和时间会以特定的格式呈现,如年-月-日或年-月-日-时-分-秒。
-
基于事件类型:日志文件的命名可能会根据记录的事件类型进行命名。例如,系统日志可能会分为系统启动日志、安全日志、应用程序日志等,每种类型的日志可能会有不同的命名。
-
基于日志级别:某些日志系统可能会根据日志消息的级别进行命名。例如,错误日志文件可能命名为
error_log
,警告日志文件可能命名为warning_log
。 -
基于环境或用途:日志文件的命名可能会根据应用程序运行的环境或日志的用途进行命名。例如,测试环境的日志文件可能会带有
test
或dev
等标识。
3、logrotate介绍
-
logrotate
是 Linux 系统中用于管理日志文件的工具之一。它通过周期性地旋转、压缩和删除日志文件来控制日志文件的大小和数量,从而避免日志文件过大导致的磁盘空间耗尽,保持系统的正常运行。 -
以下是
logrotate
的一些主要功能和特点:
-
周期性轮替日志文件:
logrotate
可以按照预先定义的时间间隔(如每天、每周、每月)轮替日志文件,将旧的日志文件重命名或移动到备份目录,并创建新的空日志文件,以便继续记录最新的日志信息。 -
压缩旧的日志文件:
logrotate
在轮替日志文件时通常会对旧的日志文件进行压缩,以节省磁盘空间。压缩后的日志文件通常会以.gz
或.bz2
等格式保存。 -
自定义配置:
logrotate
允许用户通过配置文件来定义日志文件的轮替策略,包括日志文件的路径、轮替频率、保存的备份数量、压缩选项等,以满足不同的需求和场景。 -
支持 post-rotate 和 pre-rotate 脚本:
logrotate
允许用户在轮替日志文件前后执行自定义的脚本,以便在轮替过程中执行一些额外的操作,如重启服务、发送通知等。 -
与系统日志工具集成:
logrotate
通常与系统的日志记录工具(如 rsyslog、syslog-ng 等)配合使用,以确保日志文件的正确管理和轮替。
4、logrotate配置文件
- /etc/logrotate.conf
- 在/etc/logrotate.conf 配置文件里修改轮替规则,下面大括号外面的变量相当于全部变量,而大括号里面的相当于局部变量,只有大括号里面没有声明,外面的才生效,一旦大括号声明了,大括号里面的优先级高于外面,优先生效
-
后面大括号内日志规则优先级较高
-
logrotate的配置文件是**/etc/logrotate.conf**,通常不需要对它进行修改。
-
可以针对特定应用程序或服务日志文件的轮循设置在独立的配置文件中,放在**/etc/logrotate.d/**目录下
5、logrotate命令
-
logrotate [选项] 配置文件名
-
如果此命令没有选项,则会按照配置文件中的条件进行
-
排障过程中的最佳选择是使用‘-d’选项以预演方式运行logrotate
logrotate -d /etc/logrotate.d/apache
-
即使轮循条件没有满足,我们也可以通过使用‘-f’选项来强制logrotate轮循日志文件,‘-v’参数提供了详细的输出
-
-v:显示日志轮替过程。加了-v选项,会显示日志的轮 替的过程
-
-f: 强制进行日志轮替。不管日志轮替的条件是否已经符合,强制配置文件中所有的日志进行轮替
logrotate -vf /etc/logrotate.d/nginx
四、journalctl日志管理工具
1、简介
journalctl
是 Linux 系统中用于管理 systemd 日志的工具。Systemd 是许多现代 Linux 发行版中的初始化系统和系统管理器,它负责启动系统中的各种服务,并管理系统中的进程。Systemd 也负责收集和记录系统日志信息,而journalctl
则是用来查看和管理这些日志信息的工具。
2、命令
- 查看所有日志
journalctl
journalctl -r #-r表示倒序,从尾部看(推荐),可以看最新的
- 查看某个服务的日志
journalctl -u firewalld.service
- 查看指定进程的日志
journalctl _PID=1
- 查看指定用户的日志
journalctl _UID=0 --since today
日期格式:可以指定具体的日期和时间,如 --since “2024-03-26 09:00:00”。
相对时间:可以使用相对于当前时间的时间单位,如 --since “1 hour ago”(1小时前)、–since "2
days ago"(2天前)等。
时间段:可以指定一个时间段,如 --since “10 minutes ago” --until “5 minutes ago”,表示从10分钟前
到5分钟前的时间段内。
特定时间标记:也可以使用特定的时间标记,比如 yesterday(昨天)、today(今天)、now(当前时
间)等。
- 显示详细的错误信息
journalctl -xe # -x 显示详细的错误信息。会显示出错信息的更多细节,例如:附加解决问题的网址
# -e pager-end 从末尾看
- journalctl其他选项的作用
#查看系统本次启动的日志
journalctl -b [-0]
#查看上一次启动的日志(需更改设置,如上次系统崩溃,需要查看日志时,就要看上一次的启动日志)
journalctl -b -1
#显示尾部指定行数的日志 查看的是/var/log/messages的日志,但是格式上有所调整,如主机名格式不一
样而已
journalctl -n 20 [-f] # -f 实时动态追踪
#日志默认分页输出,--no-pager 改为正常的标准输出
journalctl --no-pager
#以 JSON 格式(单行)输出
journalctl -b -u nginx.service -o json
#以 JSON 格式(多行)输出,可读性更好
journalctl -b -u nginx.service -o json-pretty
#显示日志占据的硬盘空间
journalctl --disk-usage
#指定日志文件占据的最大空间
journalctl --vacuum-size=1G
#指定日志文件保存多久
journalctl --vacuum-time=1years