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
注意:
删除文件前,一定要确认清除的该文件是否为有效文件。
四、访问文件的简单流程
用户通过文件名打开文件时,系统内部的过程:
-
用户访问文件时,系统先去查找文件所属目录中的目录项,根据文件名找到对应的inode号码。
-
通过inode号码,获取inode信息。
-
根据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等命令查看。
示例:
- users:查询最近三次登录的用户信息。
- who:查看当前登录的用户、终端、登录时间、IP地址。
- w:查看当前登录的用户、终端、IP地址、登录时间、占用CPU的情况、进程等。
- last: 读取 /var/log/wtmp 文件,显示登录系统的用户信息。
- 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
九、日志管理策略
及时做好备份和归档
延长日志保存期限
控制日志访问权限
- 日志中可能会包含各类敏感信息,如账户和口令等。
集中管理日志
-
将服务器的日志文件发到统一的日志文件服务器;
-
便于日志信息的统一收集、 整理和分析;
-
杜绝日志信息的意外丢失、恶意篡改或删除。