一、inode和block
-
文件数据包括元信息与真实数据。
-
文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节。
-
block(块)
- 连续的八个扇区组成一个block
- 是文件存取的最小单位
-
inode(索引节点)
- 中文译名为“索引节点”,也叫 i 节点
- 用于存储文件元信息
-
一个文件必须占用一个inode ,至少占用一个block
inode和block关系
- 文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。
- 一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。
- 文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在“块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode。 因此,一个文件必须占用一个inode,并且至少占用一个block。
- inode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
- 每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个或多个文件名。
- 所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找自己文件夹中的目录项,之后找到对应的inode号码;通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。
inode介绍
inode 表结构
每个文件的属性信息,比如:文件的大小,时间,类型,权限等,称为文件的元数据(meta data)
元数据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个
文件的元数据信息。
每一个inode表记录对应的保存了以下信息:
- inode number 节点号
- 文件类型
- 权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
inode的号码
用户通过文件名打开文件时,系统内部的过程:
-
用户访问文件时,系统先去查找文件所属目录中的目录项,根据文件名找到对应的inode号码。
-
通过inode号码,获取inode信息。
-
根据inode信息,判断用户是否具备访问权限。
- 如果有访问权限,则利用指针去指向实际数据所在的block,读出数据。
- 如果没有访问权限,则返回Permission denied。根据inode信息,利用指针去指向实际数据所在的block,读出数据。
inode 的大小
-
inode也会消耗硬盘空间
- 每个inode的大小一般是128字节或256字节
-
格式化文件系统时确定inode的总数
- 如果磁盘还有空间,但inode号被全部占用,也无法创建新文件。
- inode号在同一个文件系统内唯一,在不同的文件系统中可以重复。
-
使用 "df -i" 命令可以查看每个硬盘分区的inode总数和已经使用的数量
在同一设备中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
Linux系统文件三个主要的时间属性
-
atime(access time):最近访问
最后一次(最近一次)访问文件的时间,必须要打开文件才能更改。
-
mtime(modify):最近更改
最后一次(最近一次)更改文件内容的时间,文件内容有更改就会改变该时间。
-
ctime(change time):最近改动
最后一次(最近一次)改变文件元信息的时间,包括权限、 属主、属组、大小。会随着mtime更改而更改。
注意:
- 不打开文件的话,atime不变。例如使用echo追加内容,atime不会变,因为文件没有被打开访问。
- 修改文件内容的话,mtime会变,ctime也会变。
- 如果只修改文件的权限,ctime变,mtime不变。
通过观察,在使用find查找文件时间时(尤其是查找日志文件)建议使用mtime。
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号来删除该文件
日志
日志文件介绍与分析
日志的功能:
- 用于记录系统、程序运行中发生的各种事件
- 通过阅读日志,有助于诊断和解决系统故障
日志文件的分类:
-
内核及系统日志:
这种日志数据由系统服务
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
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
日志消息的级别:
描述事件的严重程度,日志消息级号越小优先级越高代表级别越紧急。
| 级号 | 消息 | 级别 | 说明 |
|---|---|---|---|
| 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、w、last、lastb
演示:
1.users:查询最近三次登录的用户信息。
users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。 如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。
2.who:查看当前登录的用户、终端、登录时间、IP地址。
who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可 以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用 户名、终端类型、登录日期及远程主机。
3.w:查看当前登录的用户、终端、IP地址、登录时间、占用CPU的情况、进程等。
w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的 输出内容要丰富一些。
程序日志分析
由相应的应用程序独立进行管理:
-
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等专用日志分析工具
日志管理
日志管理策略
-
及时做好备份和归档
-
延长日志保存期限
-
控制日志访问权限
- 日志中可能会包含各类敏感信息,如账户、口令等。
-
集中管理日志(专门抽调出一个服务器进行管理日志文件)
- 将服务器的日志文件发到统一的日志文件服务器
- 便于日志信息的统一收集、整理和分析
- 杜绝日志信息的意外丢失、恶意篡改或删除
系统日志相关服务
sysklogd 系统日志服务介绍
CentOS 5 之前版本采用的日志管理系统服务
- syslogd: system application 记录应用日志
- klogd: linux kernel 记录内核日志
事件记录格式:
- 日期时间 主机 进程[pid]: 事件内容
C/S架构:
- 通过TCP或UDP协议的服务完成日志记录传送,将分布在不同主机的日志实现集中管理
rsyslog 系统日志服务
rsyslog是CentOS 6以后版本的系统管理服务:它提供了高性能,出色的安全性和模块化设计。尽管rsyslog最初是常规的syslogd,但发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地。
当应用有限的处理时,RSYSLOG每秒可以将超过一百万的消息传递到本地目的地。即使在远程的目的地和更精细的处理中,性能通常也被认为是惊人的”。
官网:
rsyslog 特性:
- 多线程
- 适配UDP, TCP, SSL, TLS, RELP协议。
- MySQL, PGSQL, Oracle实现日志存储。
- 强大的过滤器,可实现过滤记录日志信息中任意部分。
- 自定义输出格式。
- 适用于企业级中继。
- 支持Windows系统。
rsyslog 工具的详细信息:
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对应的日志路径。
2.修改ssh服务的配置文件/etc/ssh/sshd_config,将ssh的日志修改为记录在LOCAL6对应的路径下。
- 注意:ssh服务的日志默认放在authpriv服务对应的路径下,需先将该行注释掉。
3.重启 rsyslog 服务和 ssh 服务。
实验2:网络日志(远程日志功能)
远程日志,即通过网络,将本地的日志远程备份到另一台机器,这样,就算本机系统崩溃,我们可以查看另一台机器备份的日志,来排查故障。
实验思路:
假设服务器A需要将日志备份到服务器B,那么A是发送方(客户端),B是接收方(服务器端)。
双方开启TCP功能(或UDP功能)和514接口;发送方还需填写想要传输的日志和接收方的地址。
实验步骤:
客户端(发送方)设置:
开始之前一定要关防火墙!!!
1. 关闭防火墙
2. 编辑配置文件,开启TCP功能和514端口(去掉这两行原有的#号)
3.编辑规则信息需要传输的日志和接收方地址;(@@代表使用tcp @代表udp)
4.重启日志服务
服务器(接收方)设置:编辑rsyslog的配置文件 /etc/rsyslog.conf(接收方开启TCP功能和514端口)。
1.关闭防火墙
2.编辑对应的配置文件,开启TCP功能和514端口(去掉这两行原有的#号)
![]()
3.重启rsyslog 服务并检查514端口是否开启。
4.测试打印日志查看接收方能否收到日志记录
日志管理工具 journalctl
CentOS 7 以后,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核及系统日志和应用日志)。
日志的配置文件:/etc/systemd/journald.conf
journalctl命令格式:journalctl [选项] [匹配项]
1.查看所有日志。 默认情况下,只保存本次启动的日志:journalctl
- 只查看内核日志(不显示应用日志):journalctl -k
- 查看本次启动的日志:journalctl -b
4.查看上一次启动的日志:journalctl -b | head -10
5.journalctl -f,实时滚动显示最新日志(显示最新10行)
6.只看某个服务的日志
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