Linux系统inode与日志管理

目录

一、Inode表

1.1、inode的结构

1.2、inode表

1.3、inode的工作原理

1.4、软链接与硬链接的区别

1.5、查看inode

二、日志文件

2.1、常见日志

2.2、查看用户及用户日志的命令

2.2.1、w,who

 2.2.2、last,lastb,lastlog

三、系统日志管理之rsyslog

3.1、日志优先级

 3.2、rsyslog

3.1、rsyslog配置文件格式

 3.2、rsyslog日志规则

 3.3、示例:将ssh服务的日志输出到指定文件

 3.3.1、修改ssh服务配置文件

3.3.2、修改rsyslog配置文件

3.3.3、关闭selinux安全策略,重启相关服务

3.4、示例:实现远程传输日志功能

3.4.1、修改服务端rsyslog配置文件

 3.4.2、修改客户端rsyslog配置文件

3.4.3、通过客户端查看服务端日志信息

四、journalctl日志管理工具


一、Inode表

Inode时一种数据结构,用于存储文件或目录的元数据。每个文件或目录都有一个唯一的inode,用于存储元数据和指向文件实际数据块的指针。而inode表则是文件系统中所有inode的集合,记录了文件系统中所有文件的元信息。

1.1、inode的结构
  • inode节点号
  • 文件类型:普通文件、目录、符号链接等。
  • 文件权限:r、w、x。
  • 文件所有者(UID)和所属组(GID)
  • 文件大小:以字节为单位。
  • 时间戳:创建时间、最后访问时间、最后修改时间。
  • 文件的数据块指针:直接指针、间接指针等。
  • 链接计数:文件的链接数量 
1.2、inode表

inode表存储了所有文件和目录的inode,文件系统在创建时会分配一个inode表,并在其中为文件系统中的每个文件分配一个inode。

  • 硬盘的最小存储单位是“扇区(sector)”,每个扇区存储512字节。连续八个扇区组成“块(block)”,一个块为4kb,是文件存储的最小单位。操作系统读取硬盘时,一次性连续读取多个扇区,即每次读取一个块。
  • 文件数据存储在“块”中,存储文件元信息的区域就是inode表。一个文件占用一个inode,同时至少占用一个“块(block)”。
  • linux系统中一切皆文件,而inode不包含文件名。文件名存放在目录文件夹当中,而目录也是一种文件。
  • 目录是一个特殊文件,目录文件保存了此目录中文件的列表及inode号对应关系。
  • 操作系统通过inode号识别不同的文件,而文件名只是inode号便于识别的别称,即每个inude号对应一个或多个文件名。
  • 文件系统在创建时会分配一块空间来存储inode表,而inode表的数量通常是固定的,无法动态增长。即文件系统中能创建的文件数量是有限的,而inode用尽时,即使磁盘空间尚有余量,文件系统也无法创建新的文件。
1.3、inode的工作原理
  • 创建文件时,操作系统会为该文件分配一个inode,保存文件的元数据,并为文件分配数据块。
  • 读取文件时,操作系统通过inode找到文件的数据块,并从中读取数据。
  • 删除文件时,文件的inode会被标记为未使用,而文件占用的数据块会被标记为可用,等待被新的inode覆盖标记。
1.4、软链接与硬链接的区别
特性 硬链接 软链接
本质 直接指向文件的inode,是同一个文件的另一个文件名 独立的文件,存储目标文件的路径(类似快捷方式)
inode 与源文件共享相同的inode 独立的inode,与目标文件不同
链接数 创建或删除的硬链接,链接数随之增加减少 链接数不会改变
文件夹 不支持 支持
删除源文件 链接文件的访问不受影响,链接数减一 无法访问链接文件
文件类型 与源文件相同 独立于源文件
文件大小 与源文件相同 源文件的路径长度为其大小
1.5、查看inode
[root@localhost data]# df -i
文件系统                  Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs                 228606     391  228215       1% /dev
tmpfs                    232875       1  232874       1% /dev/shm
tmpfs                    232875     893  231982       1% /run
tmpfs                    232875      16  232859       1% /sys/fs/cgroup
/dev/mapper/centos-root 5242880  162616 5080264       4% /
/dev/sda1                524288     341  523947       1% /boot
tmpfs                    232875       9  232866       1% /run/user/42
tmpfs                    232875       1  232874       1% /run/user/0
[root@localhost /]# ls -i
   72110 apps  26796625 data  25165939 home         84 media         1 proc     74282 sbin   8388680 tmp
   74278 bin          3 dev         81 lib     8388814 mnt    16797761 root  25165940 srv   16816383 usr
      64 boot   8388673 etc         83 lib64  16816446 opt        8917 run          1 sys   25165889 var
[root@localhost /]# stat /etc/passwd
  文件:"/etc/passwd"
  大小:2355      	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:8396702     硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:system_u:object_r:passwd_file_t:s0
最近访问:2025-02-22 17:20:01.508625054 +0800
最近更改:2025-02-21 17:12:08.337766159 +0800
最近改动:2025-02-21 17:12:08.337766159 +0800
创建时间:-

二、日志文件

2.1、常见日志
日志文件位置 日志文件说明

/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等命令查看
2.2、查看用户及用户日志的命令
2.2.1、w,who

w命令:who的缩写,显示已登录用户及其正在执行的进程。

who命令:显示当前登录用户的基本信息,比w命令更简洁。

[root@localhost /]# w
 22:23:36 up  9:20,  1 user,  load average: 0.07, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.153.1    21:13    0.00s  0.09s  0.00s w
[root@localhost /]# who
root     pts/0        2025-02-22 21:13 (192.168.153.1)
 2.2.2、last,lastb,lastlog

last命令:显示用户历史登录情况。

lastb命令:显示用户错误的登录列表,用于发现系统的登陆异常。

lastlog命令:lastlog文件在每次由用户登录时被查询,通过lastlog命令显示系统中所有用户最近一次登录信息。

[root@localhost /]# last
root     pts/0        192.168.153.1    Sat Feb 22 21:13   still logged in   
root     pts/1        192.168.153.1    Fri Feb 21 16:58 - 17:16  (00:18)    
root     pts/0        192.168.153.1    Fri Feb 21 16:56 - 17:16  (00:20)    
reboot   system boot  3.10.0-1160.el7. Fri Feb 21 16:55 - 22:32 (1+05:36)   
[root@localhost ~]# lastb
root     pts/0                         Sat Feb 22 22:32 - 22:32  (00:00)    

btmp begins Sat Feb 22 22:32:50 2025
[root@localhost ~]# lastlog
用户名           端口     来自             最后登陆时间
root             pts/0                     六 2月 22 22:32:57 +0800 2025
bin                                        **从未登录过**
daemon                                     **从未登录过**
adm                                        **从未登录过**

三、系统日志管理之rsyslog

3.1、日志优先级

日志系统中,优先级是用于分类和过滤日志消息的机制

优先级 含义
0(EMERG) 紧急情况,系统不可用级别
1(ALERT) 需要立即采取行动
2(CRIT) 严重错误
3(ERR) 一般错误,不影响系统运行
4(WARNING) 警告信息,存在潜在问题
5(NOTICE) 不影响正常功能,需要注意的重要事件
6(INFO)

一般消息

7(DEBUG) 调试信息
 3.2、rsyslog

rsyslog是syslog协议的扩展,它在标准syslog的基础上增加了许多功能,支持更复杂的日志管理、日志的多种传输方式(如TCP、UDP、Relp等)、日志的分类过滤和更灵活的配置。rsyslog支持高性能日志传输,还可以将日志发送到远程服务器、数据库或其他系统,并能够根据日志内容进行动态过滤和处理。

3.1、rsyslog配置文件格式

rsyslog配置文件的基本结构通常由以下几个部分组成:

MODULES(模块加载):加载输入、输出和处理模块。

GLOBAL DIRECTIVES(全局配置):设置全局参数,控制rsyslog的行为。

RULES(日志规则):定义如何处理不同来源和不同类型的日志。

[root@localhost ~]# cat /etc/rsyslog.conf 
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####                                        //模块加载

# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)

#### GLOBAL DIRECTIVES ####                              //全局配置

# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

#### RULES ####                                          //日志规则
# 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


# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
# ### end of the forwarding rule ###
 3.2、rsyslog日志规则

日志规则由三部分组成:

  • Facility(设施):日志的来源
设施名称 说 明
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) 为本地使用预留的服务 某软件 无记录日志的功能,他又支持rsyslog 可以使用 此项来 定义日志
lpr (LOG_LPR) 打印产生的日志
mail (LOG_MAIL) 邮件收发信息
news (LOG_NEWS) 与新闻服务器相关的日志
syslog (LOG_SYSLOG) 存syslogd服务产生的曰志信息(虽然服务名称己经改为reyslogd,但是很多配罝依然沿用了 syslogd服务的,所以这里并没有修改服务名称)
user (LOG_USER) 用户等级类别的日志信息
uucp (LOG_UUCP> uucp子系统的日志信息,uucp是早期Linux系统进行数据传递的协议,后来 也常用在新闻组服务中
  • Severity(严重性):日志的严重性等级。
等级名称 说 明
debug (LOG_DEBUG) 一般的调试信息说明
info (LOG_INFO) 基本的通知信息
notice (LOG_NOTICE) 普通信息,但是有一定的重要性
warning(LOG_WARNING) 警吿信息,但是还不会影响到服务或系统的运行
error(LOG_ERR) 错误信息, 一般达到err等级的信息已经可以影响到服务成系统的运行了
crit (LOG_CRIT) 临界状况信思,比err等级还要严®
alert (LOG_ALERT) 状态信息,比crit等级还要严重,必须立即采取行动
emerg (LOG_EMERG) 疼痛等级信息,系统已经无法使用了
* 代表所有日志等级。比如,“authpriv.*”代表amhpriv认证信息服务产生的日志,所有的日志等级都记录
  • Action(动作):指定对日志的处理动作。

示例:

# 将 auth 设施的所有日志(所有严重性)保存到 /var/log/auth.log
auth.*    /var/log/auth.log

# 将所有日志(所有设施、所有严重性)保存到 /var/log/syslog
*.*       /var/log/syslog

# 只保存 cron 设施的警告及以上级别日志到 /var/log/cron.log
cron.warning    /var/log/cron.log
 3.3、示例:将ssh服务的日志输出到指定文件
  • ssh服务没有独立的日志文件,日志文件存放在/var/log/secure。
  • 为了将ssh服务的日志信息输出到指定文件,需要修改两个配置文件
    • ssh服务的配置文件:/etc/ssh/sshd_config
    • rsyslog日志系统的配置文件:/etc/rsyslog.conf
 3.3.1、修改ssh服务配置文件
[root@localhost ~]# rpm -qc openssh-server            //找到ssh服务配置文件位置
/etc/pam.d/sshd
/etc/ssh/sshd_config
/etc/sysconfig/sshd
[root@localhost ~]# vim /etc/ssh/sshd_config          //打开配置文件
 30 # Logging
 31 #SyslogFacility AUTH
 32 SyslogFacility local6                             //将日志的设施改为local6
 33 #LogLevel INFO
3.3.2、修改rsyslog配置文件
[root@localhost ~]# vim /etc/rsyslog.conf                 //打开rsyslog配置文件
 71 
 72 # Save boot messages also to boot.log
 73 local7.*           /var/log/boot.log
 74 local6.*           /opt/ssh.log                       //新增一条规则,将local6输出到指定文件
 75 
3.3.3、关闭selinux安全策略,重启相关服务
[root@localhost ~]# setenforce 0                               //关闭selinux
[root@localhost ~]# systemctl restart rsyslog.service sshd     //重启服务
[root@localhost ~]# ssh 192.168.153.23                         //连接本机,产生日志信息
[email protected]'s password: 
Last login: Sun Feb 23 13:40:59 2025
[root@localhost ~]# cd /opt
[root@localhost opt]# ls    
ssh.log
localhost opt]# cat ssh.log                                    //查看日志信息
Feb 23 13:43:13 localhost sshd[122058]: Received signal 15; terminating.
Feb 23 13:43:13 localhost sshd[122516]: Server listening on 0.0.0.0 port 22.
Feb 23 13:43:13 localhost sshd[122516]: Server listening on :: port 22.
Feb 23 13:43:34 localhost sshd[122645]: Address 192.168.153.23 maps to localhost.localdomain, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
Feb 23 13:43:36 localhost sshd[122645]: Accepted password for root from 192.168.153.23 port 37588 ssh2
3.4、示例:实现远程传输日志功能

为了实现传输日志共享,将服务端的日志通过tcp或udp协议存储到客户端。

修改两台主机的rsyslog配置文件打开514端口,重启rsyslog服务使配置生效。

  • 192.168.153.23作为服务端
  • 192.168.153.233作为客户端
3.4.1、修改服务端rsyslog配置文件
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0                      //关闭防火墙与selinux
[root@localhost ~]# vim /etc/rsyslog.conf             //修改服务端rsyslog配置文件

18 # Provides TCP syslog reception
19 $ModLoad imtcp                                     //取消注释
20 $InputTCPServerRun 514                             //取消注释,开启514端口

[root@localhost ~]# systemctl restart rsyslog.service
[root@localhost ~]# ss -natp |grep 514                //514端口已开启
LISTEN     0      25           *:514                      *:*                   users:(("rsyslogd",pid=125967,fd=3))
LISTEN     0      25        [::]:514                   [::]:*                   users:(("rsyslogd",pid=125967,fd=4))

[root@localhost ~]# vim /etc/rsyslog.conf 

46 #### RULES ####
47 
48 # Log all kernel messages to the console.
49 # Logging much else clutters up the screen.
50 #kern.*                                                 /dev/console
51 
52 # Log anything (except mail) of level info or higher.
53 # Don't log private authentication messages!
54 *.info;mail.none;authpriv.none;cron.none                /var/log/messages
55 *.info;mail.none;authpriv.none;cron.none                @@192.168.153.233    //新增共享日志的客户端地址

[root@localhost ~]# hostname aabb                   //修改服务端主机名,以确认实验是否成功
 3.4.2、修改客户端rsyslog配置文件
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0                       //关闭防火墙与selinux
[root@localhost ~]# vi /etc/rsyslog.conf               //修改客户端rsyslog配置文件

18 # Provides TCP syslog reception
19 $ModLoad imtcp                                      //取消注释
20 $InputTCPServerRun 514                              //取消注释,开启514端口

[root@localhost ~]# systemctl restart rsyslog.service
[root@localhost ~]# ss -natp |grep 514                 //514端口已开启
LISTEN     0      25           *:514                      *:*                   users:(("rsyslogd",pid=125967,fd=3))
LISTEN     0      25        [::]:514                   [::]:*                   users:(("rsyslogd",pid=125967,fd=4))
3.4.3、通过客户端查看服务端日志信息
[root@localhost ~]# tail -f /var/log/messages         //在客户端可以看到服务端日志,实验完成
Feb 24 00:14:58 localhost systemd: Stopped System Logging Service.
Feb 24 00:14:58 localhost systemd: Starting System Logging Service...
Feb 24 00:14:58 localhost rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-55.el7" x-pid="126302" x-info="http://www.rsyslog.com"] start
Feb 24 00:14:58 localhost systemd: Started System Logging Service.
Feb 24 00:16:21 aabb systemd: Stopping System Logging Service...
Feb 24 00:16:21 aabb rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-55.el7" x-pid="126302" x-info="http://www.rsyslog.com"] exiting on signal 15.
Feb 24 00:16:21 aabb systemd: Stopped System Logging Service.
Feb 24 00:16:21 aabb systemd: Starting System Logging Service...
Feb 24 00:16:22 aabb rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-55.el7" x-pid="126403" x-info="http://www.rsyslog.com"] start
Feb 24 00:16:22 aabb systemd: Started System Logging Service.

四、journalctl日志管理工具

在CentOS7版本的Linux系统中,systemd服务统一管理了所有服务的启动日志,其好处则是可以只用journalctl一个命令来查看全部的日志信息。

语法格式:journalctl 参数 对象

-k 显示内核日志 -n 设置日志条数
-b 显示本次系统启动的日志信息 -f 追踪日志内容
-u 显示指定服务的日志 -p 依据优先级筛选

参考示例:

#查看所有日志(默认情况下 ,只保存本次启动的日志)
 journalctl
#查看内核日志(不显示应用日志)
 journalctl -k
#查看系统本次启动的日志
2 实战案例
 journalctl -b
 journalctl -b -0
#查看上一次启动的日志(需更改设置)
 journalctl -b -1
#查看指定时间的日志   -S=since    -U=unit
 journalctl --since="2017-10-30 18:10:30"
 journalctl --since "20 min ago"
 journalctl --since yesterday
 journalctl -S "2023-07-31 2:00" -U "2023-07-31 03:00"
 journalctl --since 09:00 --until "1 hour ago"
#显示尾部的最新10行日志
 journalctl -n
#显示尾部指定行数的日志
 journalctl -n 20
#实时滚动显示最新日志
 journalctl -f

你可能感兴趣的:(linux,运维,服务器)