掘金 后端 ( ) • 2024-04-26 16:44

Inode概述

什么是inode

  • inode用于表示文件或目录的数据结构

  • 每个inode都是唯一的,文件系统通过inode来查找和访问文件

    • 文件名和inode之间建立了映射关系,通过文件系统的目录结构可以将文件名与相应的inode关联起来,从而可以通过文件名来访问文件
  • 当文件被删除时,只删除了文件名相关联的inode,而文件的实际数据并没有立即被清除。只有当文件没有任何指向它的inode时,系统才会释放文件的存储空间 (另外一种说法:当磁盘或分区空间显示还有剩余时,而无法创建新的文件,说明该磁盘或分区的inode已被使用完,这时需要查找磁盘或分区中无用的文件将其删除后才能释放更多的inode来创建新的文件)

inode和block的区别

  • inode时用于标识和管理文件的唯一索引节点的标识符,inode表包含文件的元数据
  • block块是文件系统中用于存储文件实际数据的最小单位,由文件系统进行分配和管理,并通过inode号中的指针关联到对应的文件

inode表

存储文件元信息的区域叫做inode表

元信息一般包含文件的创建者,创建时间,文件大小,文件权限等

inode表内容

  • inode number 节点号
  • 文件类型
  • 权限 UID
  • GID
  • 链接数(指向这个文件名路径名称个数)
  • 该文件的大小和不同的时间戳
  • 指向磁盘上文件的数据块指针
  • 有关文件的其他数据

inode号

什么是inode号

每个inode都有一个号码、文件名和inode号是一 一对应的关系,操作系统用inode号来识别不同的文件

特征:

  • 同一设备下,inode号不可以相同

    • 当在同一块磁盘或分区下创建两个文件,其inode号不可能相同
  • 不同设备下,inode可以相同

    • 挡在不同磁盘和分区下创建两个文件,其inode号可能相同
  • 硬链接的inode号相同

  • 软连接的inode号不相同

如何查看inode号

  • stat+文件名:查看文件的inode号
[root@localhost data]# stat test
  文件:"test"
  大小:0          块:0          IO 块:4096   普通空文件
设备:fd00h/64768d Inode:102022092   硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:default_t:s0
最近访问:2024-04-24 16:16:26.699981529 +0800
最近更改:2024-04-24 16:16:26.699981529 +0800
最近改动:2024-04-24 16:16:26.699981529 +0800
创建时间:-
  • df -i:查看文件系统的inode号
[root@localhost data]# df -i
文件系统                   Inode 已用(I)  可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 24414208  145377 24268831       1% /
devtmpfs                  250009     422   249587       1% /dev
tmpfs                     253989       1   253988       1% /dev/shm
tmpfs                     253989     599   253390       1% /run
tmpfs                     253989      16   253973       1% /sys/fs/cgroup
/dev/sda1                1952768     327  1952441       1% /boot
tmpfs                     253989       9   253980       1% /run/user/42
tmpfs                     253989       1   253988       1% /run/user/0
  • ls -i+文件名/目录 :查看inode号

    • 这里的目录要用绝对路径
    • ls -i默认查看当前目录下所有文件的inode号
[root@localhost data]# ls -i test
102022092 test
#查看文件的inode号
​
[root@localhost /]# ls -i /
    34434 bin    33554497 etc           83 media   67156609 root          1 sys
       64 boot  100664480 home    33555653 mnt         1160 run    33554504 tmp
102022079 data         80 lib     67167840 opt        34438 sbin   67167783 usr
     1025 dev          82 lib64          1 proc   100664481 srv   100663361 var
#查看目录的inode号
  • 三个时间戳

    • atime:最后一次查看文件的时间
    • mtime:最近更改文件内容的时间,更改完内容后,ctime也会改变
    • ctime:最近更改文件元信息的时间,比如改变权限等

日志概述

日志的功能

  1. 用于记录系统、程序运行中发生的各种事件
  2. 通过阅读日志,有助于诊断和解决系统故障

日志的分类

  • 内核及系统日志

    • 由系统服务rsyslog统一进行管理,日志格式基本相似
  • 用户日志

    • 记录系统用户登录及退出系统的相关信息
  • 程序日志

    • 由各种应用程序独立管理的日志文件,记录格式不统一

日志文件格式

日志一般保存在/var/log目录下

[root@localhost data]# cd /var/log
[root@localhost log]# ls
anaconda           firewalld           ppp                tuned
audit              gdm                 qemu-ga            vmware-vgauthsvc.log.0
boot.log           glusterfs           rhsm               vmware-vmsvc.log
boot.log-20240415  grubby_prune_debug  sa                 vmware-vmusr.log
boot.log-20240423  lastlog             samba              wpa_supplicant.log
boot.log-20240424  libvirt             secure             wtmp
btmp               maillog             secure-20240415    Xorg.0.log
chrony             maillog-20240415    secure-20240423    Xorg.0.log.old
cron               maillog-20240423    speech-dispatcher  Xorg.1.log
cron-20240415      messages            spooler            Xorg.9.log
cron-20240423      messages-20240415   spooler-20240415   Xorg.9.log.old
cups               messages-20240423   spooler-20240423   yum.log
dmesg              ntpstats            sssd
dmesg.old          pluto               tallylog

用户日志

  • /var/log/lastlog:记录系统中所有用户最后一次的登录时间的曰志。这个文件也是二进制文件.不能直接用Vi 查看。而要使用lastlog命令查看
  • /var/log/secure :记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
  • /var/log/wtmp :永久记录所有用户的登陆、注销信息,同时记录系统的启动、重启、关机事件。同样,这个文件也是二进制文件.不能直接用Vi查看,而要使用last命令查看
  • /var/tun/ulmp :记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用Vi查看,而要使用w、who、users等命令查看

查询当前登录用户

  • users:仅显示登录的用户名
[root@localhost log]# users
root
​
  • w [选项]:显示当前系统上登陆的用户以及活动情况
[root@localhost log]# w 16:38:29 up  2:31,  1 user,  load average: 0.00, 0.01, 0.03USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHATroot     pts/0    192.168.137.100  15:08    5.00s  0.12s  0.02s w•
  • 表头含义

    • USER:登录的用户名。
    • TTY:用户当前所使用的终端。
    • FROM:登录用户的IP地址或主机名。
    • LOGIN@:登录时间。
    • IDLE:用户在终端处于空闲状态的时间。
    • JCPU:用户所有进程的累计CPU时间。
    • PCPU:当前正在运行的进程的CPU时间。
    • WHAT:用户正在做的事情(命令或程序的简短描述)。
  • who:当前登录用户的信息,包括用户名、登录终端和登录时间等
[root@localhost log]# who
root     pts/0        2024-04-24 15:08 (192.168.137.100)
​

内容含义

root:登录的用户名

pts/0:用户所使用的终端

2024-04-24 15:08:登录时间和日期

192.168.137.100:登录用户的IP地址或主机名

查询历史登录用户

  • last:查询成功登录到系统的用户记录
[root@localhost log]# last
root     pts/1        192.168.137.100  Wed Apr 24 15:22 - 15:27  (00:05)    
root     pts/0        192.168.137.100  Wed Apr 24 15:08   still logged in   
reboot   system boot  3.10.0-693.el7.x Wed Apr 24 22:07 - 16:59  (-5:-8)    
root     pts/0        192.168.137.100  Wed Apr 24 08:53 - 12:30  (03:36)    
reboot   system boot  3.10.0-693.el7.x Wed Apr 24 16:51 - 13:12  (-3:-39)   
​
  • lastb:查询登录失败的用户记录
[root@localhost log]# lastb
​
btmp begins Wed Apr 24 14:07:21 2024
#这里没有登录失败的用户信息,所以内容为空

系统日志管理 rsyslog

日志优先级/等级

在 Linux 内核中,根据日志消息的重要程度不同,将其分为不同 的优先级别 (数字等级越小,优先级越高,消息越重要)

0 EMERG(紧急):会导致主机系统不可用的情况。

1 ALERT(警告):必须马上采取措施解决的问题。

2 CRIT(严重):比较严重的情况。

3 ERR(错误):运行出现错误。

4 WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。

5 NOTICE(注意):不会影响正常功能,但是需要注意的事件。

6 INFO(信息):一般信息。

7 DEBUG(调试):程序或系统调试信息等

rsyslog配置文件

配置文件位置/etc/rsyslog.conf

#### 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)
#$ModLoad immark  # provides --MARK-- message capability
​
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
​
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
​

MODULES:相关模块配置

#### GLOBAL DIRECTIVES ####
​
# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog
​
# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
​
# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on
​
# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf
​
# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on
​
# File to store the position in the journal
$IMJournalStateFile imjournal.state
​

GLOBAL DIRECTIVES:全局配置,相当于通用配置

全局配置没有局部配置的优先级高,所以没有局部配置时,才会使用全局配置

#### 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
​
# 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
​

RULES:局部配置

rsyslog实验一

配置ssh单一服务的日志

  • 准备工作
[root@localhost log]# systemctl disable firewalld
[root@localhost log]# setenforce 0
#关闭防火墙和安全限制
  • 编辑rsyslog配置文件
[root@localhost ~]# vim /etc/rsyslog.conf
​
# Provides TCP syslog reception             #模块一定要打开!
$ModLoad imtcp
$InputTCPServerRun 514
​
72 # Save boot messages also to boot.log
73 local7.*                                /var/log/boot.log
74 local6.*                                /var/log/ssh.log
​
  • 编辑ssh服务的配置文件
[root@localhost ~]# vim /etc/ssh/sshd_config 
 30 # Logging
 31 #SyslogFacility AUTH
 32 #SyslogFacility AUTHPRIV
 33 SyslogFacility LOCAL6
:wq
  • 重启rsyslog和ssh服务
[root@localhost log]# systemctl restart rsyslog.service sshd
  • 远程登录其他主机
[root@localhost ~]# ssh 192.168.137.200
[email protected]'s password: 
Last login: Fri Apr 26 14:59:47 2024 from 192.168.137.101
​
  • 查看ssh服务的日志是否独立出来
[root@localhost /]# cat var/log/ssh.log 
Apr 26 15:03:03 localhost sshd[7085]: Server listening on 0.0.0.0 port 22.
Apr 26 15:03:03 localhost sshd[7085]: Server listening on :: port 22.
​

rsyslog实验二

将远程主机的日志备份到主机

  • 准备工作
[root@localhost log]# systemctl disable firewalld
[root@localhost log]# setenforce 0
#主机A和B均须要关闭防火墙和安全限制
  • 主机A编辑rsyslog配置文件
[root@localhost ~]# vim /etc/rsyslog.conf
​
# Provides TCP syslog reception             #模块一定要打开!
$ModLoad imtcp
$InputTCPServerRun 514
​
# 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;mail.none;authpriv.none;cron.none              @@192.168.137.200             #主机B的IP地址
:wq
[root@localhost log]# systemctl restart rsyslog.service
  • 主机B编辑rsyslog配置文件
[root@localhost ~]# vim /etc/rsyslog.conf 
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
:wq
[root@localhost log]# systemctl restart rsyslog.service
  • 主机B实时监测日志信息
[root@localhost ~]# tail -f -n2 /var/log/messages
Apr 26 16:03:04 localhost rsyslogd: action 'action 1' resumed (module 'builtin:omfwd') [v8.24.0 try http://www.rsyslog.com/e/2359 ]
Apr 26 16:03:04 localhost rsyslogd: action 'action 1' resumed (module 'builtin:omfwd') [v8.24.0 try http://www.rsyslog.com/e/2359 ]
Apr 26 16:03:23 localhost root: hello boy from 192.168.137.101
​
  • 发送日志给B主机
[root@localhost /]# logger 'hello boy from 192.168.137.101'

journalcrl 日志管理工具

[root@localhost ~]# journalctl --help
journalctl [OPTIONS...] [MATCHES...]
              选项            
-U --until=DATE          Show entries not newer than the specified date
#仅显示特定系统服务或单元的日志消息
-b --boot[=ID]           Show current boot or the specified boot
   --list-boots          Show terse information about recorded boots
#仅显示特定引导过程的日志消息  
-p --priority=RANGE      Show entries with the specified priority
#仅显示特定优先级的日志消息
-n --lines[=INTEGER]     Number of journal entries to show
   --no-tail             Show all lines, even in follow mode
#实时跟踪日志,持续显示新的日志消息
-f --follow              Follow the journal
--since=/--until="年-月-日 时间"
#查看从某个具体时间开始的日志
--since""/--until""
#查看某个时间段的日志
​
[root@localhost ~]# journalctl --since "yesterday"
-- Logs begin at 四 2024-04-25 16:26:19 CST, end at 五 2024-04-26 16:10:01 CST. --
4月 25 16:26:19 localhost.localdomain systemd-journal[105]: Runtime journal is using 8.
4月 25 16:26:19 localhost.localdomain kernel: Initializing cgroup subsys cpuset
4月 25 16:26:19 localhost.localdomain kernel: Initializing cgroup subsys cpu
#查看昨天的日志
​
[root@localhost ~]# journalctl --since "10 min ago"
-- Logs begin at 四 2024-04-25 16:26:19 CST, end at 五 2024-04-26 16:20:01 CST. --
4月 26 16:20:01 localhost.localdomain systemd[1]: Started Session 22 of user root.
4月 26 16:20:01 localhost.localdomain systemd[1]: Starting Session 22 of user root.
4月 26 16:20:01 localhost.localdomain CROND[7515]: (root) CMD (/usr/lib64/sa/sa1 1 1)
#查看10分钟之前的日志
​
[root@localhost ~]# journalctl --since="2024.4.25 10:00:00"
#查看2024年4月25日10点之后的日志