Linux文件系统与日志分析

Linux文件系统与日志分析

1、inode表结构

inode号存在inode表中

文件数据包括,元信息与实际数据

文件存储在硬盘,硬盘最小存储单位是扇区,每个扇区存512字节。

  • 连续八个扇区组成一个block(块),一块是文件存取的最小单位

  • inode(索引节点)也称i节点,用于存储文件的元信息

一个文件必须占用一个inode,但至少占用一个block。可以用du查看。

元信息:文件的属性信息,比如:文件的大小,时间,类型,权限等,

 
复制代码
[root@31yml opt]#stat nginx-1.18.0#详细查看stat
   文件:"nginx-1.18.0"
   大小:186        块:0          IO 块:4096   目录
 设备:fd00h/64768d Inode:167780918   硬链接:9
 权限:(0755/drwxr-xr-x)  Uid:( 1001/ UNKNOWN)   Gid:( 1001/ UNKNOWN)
 环境:unconfined_u:object_r:usr_t:s0
 最近访问:2023-07-30 00:02:04.549937345 +0800#atime
 最近更改:2023-07-30 00:01:50.769172502 +0800#mtime
 最近改动:2023-07-30 00:01:50.769172502 +0800#ctime
 创建时间:-
 #有3个时间:
 #最近访问atime:最后一次访问文件或目录的时间
 #最近更改mtime:最近更改文件内容的时间,注意:更改完内容之后,ctime也会改变
 #最近改动ctime:最近更改文件元信息的时间,比如改变权限等
 #查看inode号
 [root@31yml opt]#ls -i nginx-1.18.0
      1083 auto        167780919 configure  167780943 Makefile  100853026 src
 167780924 CHANGES      69007858 contrib    167780922 man
 167780923 CHANGES.ru  134219472 html        34437954 objs
  33568594 conf        167780920 LICENSE    167780921 README
View Code
复制代码

论证,为何常用“mtime”选项(不重要)

复制代码
 [root@31yml data]#touch test
 [root@31yml data]#stat test
   文件:"test"
   大小:0          块:0          IO 块:4096   普通空文件
 设备:fd00h/64768d Inode:34437998    硬链接:1
 权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
 环境:unconfined_u:object_r:usr_t:s0
 最近访问:2023-07-31 12:01:48.312654135 +0800
 最近更改:2023-07-31 12:01:48.312654135 +0800
 最近改动:2023-07-31 12:01:48.312654135 +0800
 创建时间:-
 [root@31yml data]#vim test
 [root@31yml data]#stat test
   文件:"test"
   大小:0          块:0          IO 块:4096   普通空文件
 设备:fd00h/64768d Inode:34437998    硬链接:1
 权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
 环境:unconfined_u:object_r:usr_t:s0
 最近访问:2023-07-31 12:02:05.881547803 +0800
 最近更改:2023-07-31 12:01:48.312654135 +0800
 最近改动:2023-07-31 12:01:48.312654135 +0800
 创建时间:-
 [root@31yml data]#echo " " > test
 [root@31yml data]#stat test
   文件:"test"
   大小:2          块:8          IO 块:4096   普通文件
 设备:fd00h/64768d Inode:34437998    硬链接:1
 权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
 环境:unconfined_u:object_r:usr_t:s0
 最近访问:2023-07-31 12:02:05.881547803 +0800
 最近更改:2023-07-31 12:02:31.510393780 +0800
 最近改动:2023-07-31 12:02:31.510393780 +0800
 创建时间:-
 #不打开文件修改内容,只有mtime、ctime改变,ctime因为权限变化而变化,权限里涉及文件大小,大小改变,权限也变
View Code
复制代码

每一个inode表记录对应的保存了以下信息:

  • inode number 节点号

  • 文件类型

  • 权限

  • UID

  • GID

  • 链接数(指向这个文件名路径名称个数)

  • 该文件的大小和不同的时间戳

  • 指向磁盘上文件的数据块指针

  • 有关文件的其他数据

文件夹存放文件与inode表,表中存放文件名与对应inode号,所有inode号是可被用完的资源。用完就没法再创文件了。

linux中“df -i”可以看到可分配inode号的数量(数量与分配硬盘大小有关),展示的数量不是全部,还有部分隐藏的inode号数量。

硬盘有剩余空间却无法创建文件,解决方案:删除空文件或者扩容

  • 找空文件“find -empty”

  • 文件调用流程:

  1. 通过文件名找到对应inode号

  2. 通过inode号获取inode信息

  3. 根据inode信息找到数据所在block,读出数据

文件名——>inode号——>inode信息—— >真实数据

  • 查看inode号“ls -i 文件名”、“stat 文件名”

inode表中通过指针指向数据块block

读取数据是8个连续扇区一起读,8*512=4096字节=4k,这是存取文件的最小单位。

直接指针默认为12个直接指针,最大文件为4*12=48k。

文件过大时需要多个块存储,要用到间接指针,间接指针指向指针,指针数为4k/4=1024个,每个指针4字节。

cp和inode

cp 命令:

  • 分配一个空闲的inode号,在inode表中生成新条目

  • 在目录中创建一个目录项,将名称与inode编号关联

  • 拷贝数据生成新的文件

rm 命令:

  • 硬链接数递减,从而释放的inode号可以被重用

  • 把数据块放在空闲列表中

  • 删除目录项

  • 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖

mv和inode

  • 如果mv命令的目标和源在同一设备,

  • 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!

  • 删除旧的目录对应关系新建目录对应关系

删除文件空间不释放,空文件覆盖,停止其它用户占用

1.1 硬链接与软连接

硬连接:不支持文件夹,不能跨区,同一个inode号,创建一个连接数加一,多路径访问。

软连接:类似于windows里快捷方式,符号连接,创建新文件存放路径。

ln [-s] 源文件或目录… 链接文件或目标位置

加s是软连接 符号连接

2、文件恢复extundelete

删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录 里面的 block 中,删除这个文件的名字。

Linux 是通过 Link 的数量来控制文件删除的,只有 当一个文件不存在任何 Link 的时候,这个文件才会被删除。

2.1 恢复文件

在编译安装 extundelete 之前需要先安装两个依赖包 e2fsprogs-libs 和 e2fsprogs-devel,

这两个包在系统安装光盘的/Package 目录下就有,使用 rpm 或 yum 命令将其安装。

e2fsprogs-devel 安装依赖于 libcom_err-devel 包

复制代码
 [root@localhost ~]#yum -y install e2fsprogs-devel e2fsprogs-libs
 #安装依赖软件
 [root@localhost ~]# tar -jxvf extundelete-0.2.4.tar.bz2 -C /opt
 #解压软件
 [root@localhost ~]# cd /opt/extundelete-0.2.4
 #切换到目录下
 [root@localhost extundelete-0.2.4]# ./configure  
 #编译安装
 [root@localhost extundelete-0.2.4]#make
 [root@localhost extundelete-0.2.4]#make install
 [root@localhost extundelete-0.2.4]#cd /usr/local/bin/
 [root@localhost bin]#ls
 extundelete  you-get
 ​
 #验证恢复,目前使用版本只对ext3 有效,分区略
 [root@localhost ~]# mkfs.ext3 /dev/sdb1
 [root@localhost ~]# mkdir /test/ 
 [root@localhost ~]# mount /dev/sdb1 /test/ 
 [root@localhost ~]# cd /test/
 [root@localhost test]# echo a>a 
 [root@localhost test]# echo a>b 
 [root@localhost test]# echo a>c 
 [root@localhost test]# echo a>d
View Code
复制代码

2.2 模拟删除并恢复

可以使用extundelete /dev/sdb1 --inode 2

查看文件系统/dev/sdb1 下存在哪些文件,

具体的使用情况。其中--inode 2 代表从 i 节点为 2 的文件开始查看,一般文件系统格式化挂

载之后,i 节点是从 2 开始的,2 代表该文件系统最开始的目录。

在恢复前需要先解挂载

复制代码
 [root@localhost test]# rm -rf a b
 #模拟删除
 [root@localhost test]# ls c d lost+foun
 [root@localhost test]# cd 
 [root@localhost ~]# umount /test/
 #解挂载
 [root@localhost ~]#extundelete /dev/sdb1 --inode 2
 #                  命令          查看的分区   从2节点开始
 #查看该分区下的存在哪些文件
 ​
 [root@localhost ~]# extundelete /dev/sdb1 --restore-all
 #                     命令      需要恢复的分区设备    恢复选项,全都要
 #使用恢复
执行完恢复的命令后,在当前目录下会出现一个/RECOVERED_FILES/目录,里面保存了已经恢复的文件

 [root@localhost ~]# ls
 anaconda-ks.cfg extundelete-0.2.4 extundelete-0.2.4.tar.bz2 RECOVERED_FILES 
 [root@localhost ~]# cd RECOVERED_FILES/
 [root@localhost RECOVERED_FILES]# ls
 a b 
 ​
 ext3文件类型
View Code
复制代码

3、xfs类型备份和恢复

CentOS 7 系统默认采用 xfs 类型的文件。针对 xfs 文件系统目前也没有比较成熟的文件恢复工具,所以建议提前做好数 据备份以避免数据丢失

xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。

若系统中未安装 xfsdump与xfsrestore工具,可

以通过yum install -y xfsdump命令安装。

xfsdump 按照inode 顺序备份一个 xfs 文件系统。xfsdump 的备份级别有两种:

  • 0 表示完全备份

  • 1-9 表示增量 备份

  • xfsdump 的备份级别默认为 0

xfsdump 的命令格式为:

xfsdump -f 备份存放位置 要备份路径或设备文件。

常用的备份参数包括以下几种:

  • -f:指定备份文件目录

  • -L:指定标签 session label

  • -M:指定设备标签 media label

  • -s:备份单个文件,-s 后面不能直接跟路径

     

使用 xfsdump 时,需要注意以下的几个限制:

  • 不支持没有挂载的文件系统备份,所以只能备份已挂载的;

  • 必须使用 root 的权限才能操作;

  • 只能备份 XFS 文件系统;

  • 备份下来的数据只能让 xfsrestore 解析;

  • 不能备份两个具有相同 UUID 的文件系统(可使用blkid查看)。

具体过程

复制代码
 ##########前期准备
 [root@localhost opt]#mkfs.xfs -f /dev/sdb1
 #-f强制格式化
 [root@localhost ~]# fdisk /dev/sdb
 #分区略
 [root@localhost data]#partprobe /dev/sdb
 #刷新分区
 [root@localhost ~]# mkfs.xfs /dev/sdb1
 #格式化
 [root@localhost ~]# mkdir /date 
 [root@localhost ~]# mount /dev/sdb1 /date/
 #挂载
 [root@localhost ~]# cd /date 
 [root@localhost date]# cp /etc/passwd ./ 
 #将passwd文件拷入
 [root@localhost date]# mkdir test 
 [root@localhost date]# touch test/a
 ​
 ############备份
 [root@localhost data]#rpm -qa |grep xfsdump
 #查看是否已安装
 xfsdump-3.1.4-1.el7.x86_64
 [root@localhost data]#yum install xfsdump -y
 #未安装可以使用yum安装
 ​
 [root@localhost ~]# xfsdump -f /opt/dump_sdb2        /dev/sdb2           [-L dump_sdb1 -M sdb1]
 #                    命令   指定备份目录路径和文件名      分区                 打上标记 现在不打后面也要输入
 #使用 xfsdump 命令备份整个分区  并打上标记
 ​
 ​
 [root@localhost ~]#xfsdump -f /opt/dump_sdb2 /dev/sdb2
 xfsdump: using file dump (drive_simple) strategy
 xfsdump: version 3.1.4 (dump format 3.0) - type ^C for status and control
 ​
  ============================= dump label dialog ==============================
 ​
 please enter label for this dump session (timeout in 300 sec)
  -> dump_sdb2   (文件标签)
  
  
 please enter label for media in drive 0 (timeout in 300 sec)
  -> sdb2(设备标签)
 media label entered: "sdb2"
View Code
复制代码

模拟数据丢失后恢复

复制代码
[root@localhost data]#cd /data/
 [root@localhost data]#rm -rf /*
 [root@localhost data]#ls
 ​
 #恢复
 [root@localhost opt]#xfsrestore -f /opt/dump_sdb1 /data/
 # 使用 bak文件 将数据恢复到 /data 下
 [root@localhost opt]#ls /data/
 passwd  test
 ​
 [root@localhost opt]#xfsdump -l 1 -f /backup/dump_sdb1_level_1 /sdb1 -L dump_sdb1_level_1 -M sdb1
 #设定级别
View Code
复制代码

4、日志服务管理

解决问题主要手段,查看日志

4.1 日志介绍

日志记录的内容包括:

  • 历史事件:时间,地点,人物,事件

  • 日志级别:事件的关键性程度,Loglevel

内核及系统日志由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf

Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/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等命令查看

日志文件的格式:

日志文件的格式包含以下 4 列:

  • 事件产生的时间。

  • 产生事件的服务器的主机名。

  • 产生事件的服务名或程序名。

  • 事件的具体信息。

日志级别:事件的关键性程度,loglevel,描述事件重要性程度

4.1.1 sysklogd系统日志服务

CentOS 5 之前版本采用的日志管理系统服务

  • syslogd: system application 记录应用日志

  • klogd: linux kernel 记录内核日志

事件记录格式:

日期时间 主机 进程[pid]: 事件内容

C/S架构:通过TCP或UDP协议的服务完成日志记录传送,将分布在不同主机的日志实现集中管理

4.1.2 rsyslog系统日志服务

rsyslog是CentOS 6以后版本的系统管理服务:它提供了高性能,出色的安全性和模块化设计。

[root@31yml data]#rpm -q rsyslog #收集、管理、记录日志
 rsyslog-8.24.0-12.el7.x86_64#单机使用,接受50台服务器数据量

rsyslog 特性

  • 多线程

  • UDP, TCP, SSL, TLS, RELP

  • MySQL, PGSQL, Oracle实现日志存储

  • 强大的过滤器,可实现过滤记录日志信息中任意部分

  • 自定义输出格式 可以日志

  • 适用于企业级

日志:系统日志、软件日志......

4.1.3 ELK

ELK:由Elasticsearch, Logstash, Kibana三个软件组成

  • 非关系型分布式数据库基于apache软件基金会jakarta项目组的项目lucene

  • Elasticsearch是个开源分布式搜索引擎,可以处理大规模日志数据,比如:Nginx、Tomcat、系统日志等功能

  • Logstash对日志进行收集、分析过滤,并将其存储供以后使用

  • Kibana 可以提供的日志分析友好的 Web 界面

4.2 rsyslog管理

三包含:设施、级别、文件位置

  • facility:设施,从功能或程序上对日志进行归类

 #内置分类
 auth(验证), authpriv(登录验证), cron(定时任务), daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, syslog
 #自定义的分类
 local0-local7
  • Priority 优先级别,从低到高排序

 debug(7调试), info(6信息), notice(5注意), warn(warning)(4提醒), err(error)(3错误), crit(critical)(2严重), alert(1警告), emerg(panic)(0紧急)
  • 文件位置

 文件路径:通常在/var/log/,文件路径前的-表示异步写入
 用户:将日志事件通知给指定的用户,* 表示登录的所有用户
 日志服务器:@host,把日志送往至指定的远程UDP日志服务器 @@host 将日志发送到远程TCP日志服务器
 管道: | COMMAND,转发给其它命令处理
4.2.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.2 rsyslog配置文件

文件默认路径/etc/rsyslog.conf 配置文件格式:由三部分组成

  • MODULES:相关模块配置

  • GLOBAL DIRECTIVES:全局配置

  • RULES:日志记录相关的规则配置

image-20230731164856560

image-20230731165136562

image-20230731171403853

local0-local7属于自定义,用于放入自己装入的程序的日志

日志文件

_日志功能:

  • 记录系统程序运行中发生的各种事件

  • 通过阅读日志,有助于诊断故障

_日志的分类:

  • 内核及系统日志:由系统服务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等命令查看
  • /var/log/secure:系统安全日志,文本格式,应周期性分析

  • /var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行查看

  • /var/log/wtmp:当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查看

  • /var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看

  • /var/log/dmesg:CentOS7 之前版本系统引导过程中的日志信息,文本格式,开机后的硬件变化将不再记录专用命令dmesg查看,可持续记录硬件变化的情况

  • /var/log/boot.log 系统服务启动的相关信息,文本格式

  • /var/log/messages :系统中大部分的信息

  • /var/log/anaconda : anaconda的日志操作系统安装时安装的软件信息

复制代码
 oot@31yml data]#lastb
 #btmp 无法查看需要使用 lastb  来查看
 ​
 btmp begins Sat Jul 29 21:18:35 2023
 [root@31yml data]#last#上一次成功登录包括重启
 root     pts/2        192.168.177.1    Sun Jul 30 00:00 - 00:30  (00:30)    
 root     pts/0        192.168.177.1    Sat Jul 29 21:36 - 11:58 (1+14:21)   
 root     pts/0        192.168.177.1    Sat Jul 29 21:34 - 21:36  (00:02)    
 root     pts/0        192.168.177.1    Sat Jul 29 21:25 - 21:34  (00:09)    
 root     pts/1        :0               Sat Jul 29 21:22   still logged in   
 root     :0           :0               Sat Jul 29 21:22   still logged in   
 root     pts/0        192.168.177.1    Sat Jul 29 21:18 - 21:25  (00:06)    
 reboot   system boot  3.10.0-693.el7.x Sat Jul 29 21:18 - 15:56 (1+18:38)   
 root     pts/1        192.168.177.1    Sat Jul 29 21:02 - crash  (00:15)    
 root     pts/0        :0               Thu Jul 27 08:50 - 21:18 (2+12:27)   
 root     :0           :0               Wed Jul 26 19:52 - crash (3+01:26)   
 reboot   system boot  3.10.0-693.el7.x Wed Jul 26 19:51 - 15:56 (4+20:04)   
 reboot   system boot  3.10.0-693.el7.x Wed Jul 26 19:51 - 15:56 (4+20:05)   
 reboot   system boot  3.10.0-693.el7.x Wed Jul 26 19:36 - 19:36  (00:00)    
 root     :0           :0               Wed Jul 26 19:32 - 19:36  (00:03)    
 reboot   system boot  3.10.0-693.el7.x Wed Jul 26 19:32 - 19:36  (00:04)    
 reboot   system boot  3.10.0-693.el7.x Wed Jul 26 19:31 - 19:36  (00:04)    
 reboot   system boot  3.10.0-693.el7.x Wed Jul 26 19:18 - 19:19  (00:01)    
 root     pts/1        192.168.177.1    Wed Jul 26 19:08 - down   (00:10)    
 root     pts/0        :0               Tue Jul 25 19:31 - 19:18  (23:46)    
 root     :0           :0               Tue Jul 25 19:31 - 19:18  (23:46)    
 reboot   system boot  3.10.0-693.el7.x Tue Jul 25 19:31 - 19:18  (23:47)    
 root     pts/0        :0               Mon Jul 24 18:54 - 19:30 (1+00:36)   
 root     :0           :0               Mon Jul 24 18:54 - down  (1+00:36)   
 reboot   system boot  3.10.0-693.el7.x Mon Jul 24 18:54 - 19:30 (1+00:36)   
 root     pts/0        :0               Mon Jul 24 18:52 - 18:53  (00:01)    
 root     :0           :0               Mon Jul 24 18:49 - down   (00:03)    
 reboot   system boot  3.10.0-693.el7.x Mon Jul 24 18:49 - 18:53  (00:04)    
 root     pts/0        :0               Wed Jul 19 18:30 - crash (5+00:19)   
 root     :0           :0               Wed Jul 19 16:24 - crash (5+02:25)   
 reboot   system boot  3.10.0-693.el7.x Wed Jul 19 16:23 - 18:53 (5+02:30)   
 root     pts/0        :0               Tue Jul 18 21:50 - 16:23  (18:32)    
 root     pts/0        :0               Tue Jul 18 21:49 - 21:50  (00:01)    
 root     pts/0        :0               Tue Jul 18 19:28 - 19:29  (00:00)    
 root     :0           :0               Tue Jul 18 19:28 - 16:23  (20:54)    
 reboot   system boot  3.10.0-693.el7.x Tue Jul 18 19:28 - 18:53 (5+23:25)   
 root     pts/1        :0               Tue Jul 18 19:21 - 19:25  (00:04)    
 root     pts/1        :0               Fri Jul 14 10:11 - 10:13  (00:02)    
 root     pts/0        192.168.177.1    Thu Jun 29 15:28 - 15:34  (00:06)    
 root     pts/2        192.168.177.1    Thu Jun 29 13:41 - 15:27  (01:46)    
 root     pts/0        192.168.177.1    Wed Jun 28 19:45 - 19:57  (00:12)    
 root     pts/1        192.168.177.1    Wed Jun 28 08:41 - 19:40  (10:58)    
 root     pts/1        192.168.177.1    Mon Jun 26 16:35 - 17:40  (01:05)    
 root     pts/0        :0               Mon Jun 26 20:27 - 16:40 (1+20:12)   
 root     pts/0        :0               Mon Jun 26 20:10 - 20:27  (00:17)    
 root     :0           :0               Mon Jun 26 20:09 - down  (21+23:18)  
 reboot   system boot  3.10.0-693.el7.x Mon Jun 26 20:07 - 19:27 (21+23:19)  
 ​
 wtmp begins Mon Jun 26 20:07:56 2023
 [root@31yml data]#lastlog#最后一次登录
 用户名           端口     来自             最后登陆时间
 root             pts/2    192.168.177.1    日 7月 30 00:00:07 +0800 2023
 bin                                        **从未登录过**
 daemon                                     **从未登录过**
 adm                                        **从未登录过**
 lp                                         **从未登录过**
 sync                                       **从未登录过**
 shutdown                                   **从未登录过**
 halt                                       **从未登录过**
 mail                                       **从未登录过**
 operator                                   **从未登录过**
 games                                      **从未登录过**
 ftp                                        **从未登录过**
 nobody                                     **从未登录过**
 systemd-network                            **从未登录过**
 dbus                                       **从未登录过**
 polkitd                                    **从未登录过**
 abrt                                       **从未登录过**
 libstoragemgmt                             **从未登录过**
 rpc                                        **从未登录过**
 colord                                     **从未登录过**
 saslauth                                   **从未登录过**
 setroubleshoot                             **从未登录过**
 rtkit                                      **从未登录过**
 pulse                                      **从未登录过**
 qemu                                       **从未登录过**
 ntp                                        **从未登录过**
 radvd                                      **从未登录过**
 chrony                                     **从未登录过**
 tss                                        **从未登录过**
 usbmuxd                                    **从未登录过**
 geoclue                                    **从未登录过**
 sssd                                       **从未登录过**
 gdm              :0                        六 7月 29 21:18:36 +0800 2023
 rpcuser                                    **从未登录过**
 nfsnobody                                  **从未登录过**
 gnome-initial-setup                           **从未登录过**
 avahi                                      **从未登录过**
 postfix                                    **从未登录过**
 sshd                                       **从未登录过**
 tcpdump                                    **从未登录过**
 xiaoyu                                     **从未登录过**
View Code
复制代码

4.3 日志管理工具 journalctl

CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。

配置文件位置:”/etc/systemd/journald.conf“

journalctl命令格式:“journalctl [OPTIONS...] [MATCHES...]”

选项说明:

复制代码
--no-full, --full, -l
    如果字段内容超长则以省略号(...)截断以适应列宽。
    默认显示完整的字段内容(超长的部分换行显示或者被分页工具截断)。
    老旧的 -l/--full 选项 仅用于撤销已有的 --no-full 选项,除此之外没有其他用处。
 -a, --all
    完整显示所有字段内容, 即使其中包含不可打印字符或者字段内容超长。
 -f, --follow
    只显示最新的日志项,并且不断显示新生成的日志项。 此选项隐含了 -n 选项。
 -e, --pager-end
    在分页工具内立即跳转到日志的尾部。 此选项隐含了 -n1000
    以确保分页工具不必缓存太多的日志行。 不过这个隐含的行数可以被明确设置的 -n
    选项覆盖。 注意,此选项仅可用于 less(1) 分页器。
 -n, --lines=
    限制显示最新的日志行数。 --pager-end 与 --follow 隐含了此选项。
    此选项的参数:若为正整数则表示最大行数; 若为 "all" 则表示不限制行数;
    若不设参数则表示默认值10行。
 --no-tail
    显示所有日志行, 也就是用于撤销已有的 --lines= 选项(即使与 -f 连用)。
 -r, --reverse
    反转日志行的输出顺序, 也就是最先显示最新的日志。
 -o, --output=
    控制日志的输出格式。 可以使用如下选项:
    short
        这是默认值, 其输出格式与传统的 syslog[1] 文件的格式相似, 每条日志一行。
    short-iso
        与 short 类似,只是将时间戳字段以 ISO 8601 格式显示。
    short-precise
        与 short 类似,只是将时间戳字段的秒数精确到微秒级别。
    short-monotonic
        与 short 类似,只是将时间戳字段的零值从内核启动时开始计算。
    short-unix
        与 short 类似,只是将时间戳字段显示为从"UNIX时间原点"(1970-1-1 00:00:00
        UTC)以来的秒数。 精确到微秒级别。
    verbose
        以结构化的格式显示每条日志的所有字段。
     export
        将日志序列化为二进制字节流(大部分依然是文本) 以适用于备份与网络传输(详见
        Journal Export Format[2] 文档)。
    json
        将日志项按照JSON数据结构格式化, 每条日志一行(详见 Journal JSON Format[3]
        文档)。
    json-pretty
        将日志项按照JSON数据结构格式化, 但是每个字段一行, 以便于人类阅读。
    json-sse
        将日志项按照JSON数据结构格式化,每条日志一行,但是用大括号包围, 以适应
        Server-Sent Events[4] 的要求。
     cat
        仅显示日志的实际内容, 而不显示与此日志相关的任何元数据(包括时间戳)。
 --utc
    以世界统一时间(UTC)表示时间
 --no-hostname
    不显示来源于本机的日志消息的主机名字段。 此选项仅对 short
    系列输出格式(见上文)有效。
 -x, --catalog
    在日志的输出中增加一些解释性的短文本, 以帮助进一步说明日志的含义、
    问题的解决方案、支持论坛、 开发文档、以及其他任何内容。
    并非所有日志都有这些额外的帮助文本, 详见 Message Catalog Developer
    Documentation[5] 文档。
    注意,如果要将日志输出用于bug报告, 请不要使用此选项。
 -q, --quiet
    当以普通用户身份运行时, 不显示任何警告信息与提示信息。 例如:"-- Logs begin at
    ...", "-- Reboot --"
 -m, --merge
    混合显示包括远程日志在内的所有可见日志。
 -b [ID][±offset], --boot=[ID][±offset]
    显示特定于某次启动的日志, 这相当于添加了一个 "_BOOT_ID=" 匹配条件。
    如果参数为空(也就是 ID 与 ±offset 都未指定), 则表示仅显示本次启动的日志。
    如果省略了 ID , 那么当 ±offset 是正数的时候, 将从日志头开始正向查找,
    否则(也就是为负数或零)将从日志尾开始反响查找。 举例来说, "-b
     1"表示按时间顺序排列最早的那次启动, "-b 2"则表示在时间上第二早的那次启动; "-b
     -0"表示最后一次启动, "-b -1"表示在时间上第二近的那次启动, 以此类推。 如果
    ±offset 也省略了, 那么相当于"-b -0", 除非本次启动不是最后一次启动(例如用
     --directory 指定了另外一台主机上的日志目录)。
    如果指定了32字符的 ID , 那么表示以此 ID 所代表的那次启动为基准
    计算偏移量(±offset), 计算方法同上。 换句话说, 省略 ID 表示以本次启动为基准
    计算偏移量(±offset)。
 --list-boots
    列出每次启动的 序号(也就是相对于本次启动的偏移量)、32字符的ID、
    第一条日志的时间戳、最后一条日志的时间戳。
 -k, --dmesg
    仅显示内核日志。隐含了 -b 选项以及 "_TRANSPORT=kernel" 匹配项。
 -t, --identifier=SYSLOG_IDENTIFIER
    仅显示 syslog[1] 识别符为 SYSLOG_IDENTIFIER 的日志项。
    可以多次使用该选项以指定多个识别符。
 -u, --unit=UNIT|PATTERN
    仅显示属于特定单元的日志。 也就是单元名称正好等于 UNIT 或者符合 PATTERN
    模式的单元。 这相当于添加了一个 "_SYSTEMD_UNIT=UNIT" 匹配项(对于 UNIT 来说),
    或一组匹配项(对于 PATTERN 来说)。
    可以多次使用此选项以添加多个并列的匹配条件(相当于用"OR"逻辑连接)。
 --user-unit=
    仅显示属于特定用户会话单元的日志。 相当于同时添加了 "_SYSTEMD_USER_UNIT=""_UID=" 两个匹配条件。
    可以多次使用此选项以添加多个并列的匹配条件(相当于用"OR"逻辑连接)。
 -p, --priority=
    根据日志等级(包括等级范围)过滤输出结果。 日志等级数字与其名称之间的对应关系如下
    (参见 syslog(3)): "emerg" (0), "alert" (1), "crit" (2), "err" (3),
     "warning" (4), "notice" (5), "info" (6), "debug" (7) 。
    若设为一个单独的数字或日志等级名称, 则表示仅显示小于或等于此等级的日志
    (也就是重要程度等于或高于此等级的日志)。 若使用 FROM..TO.. 设置一个范围,
    则表示仅显示指定的等级范围内(含两端)的日志。 此选项相当于添加了 "PRIORITY="
    匹配条件。
 -c, --cursor=
    从指定的游标(cursor)开始显示日志。
    [提示]每条日志都有一个"__CURSOR"字段,类似于该条日志的指纹。
 --after-cursor=
    从指定的游标(cursor)之后开始显示日志。 如果使用了 --show-cursor 选项,
    则也会显示游标本身。
 --show-cursor
    在最后一条日志之后显示游标, 类似下面这样,以"--"开头:
         -- cursor: s=0639...
    游标的具体格式是私有的(也就是没有公开的规范), 并且会变化。
 -S, --since=, -U, --until=
    显示晚于指定时间(--since=)的日志、显示早于指定时间(--until=)的日志。
    参数的格式类似 "2012-10-30 18:17:16" 这样。 如果省略了"时:分:秒"部分,
    则相当于设为 "00:00:00" 。 如果仅省略了""的部分则相当于设为 ":00" 。
    如果省略了"年-月-日"部分, 则相当于设为当前日期。 除了"年-月-日 时:分:秒"格式,
    参数还可以进行如下设置: (1)设为 "yesterday", "today", "tomorrow"
    以表示那一天的零点(00:00:00)。 (2)设为 "now" 以表示当前时间。
    (3)可以在"年-月-日 时:分:秒"前加上 "-"(前移) 或 "+"(后移)
    前缀以表示相对于当前时间的偏移。 关于时间与日期的详细规范, 参见
    systemd.time(7)
 -F, --field=
    显示所有日志中某个字段的所有可能值。 [译者注]类似于SQL语句:"SELECT DISTINCT
    某字段 FROM 全部日志"
 -N, --fields
    输出所有日志字段的名称
 --system, --user
    仅显示系统服务与内核的日志(--system)、 仅显示当前用户的日志(--user)。
    如果两个选项都未指定,则显示当前用户的所有可见日志。
 -M, --machine=
    显示来自于正在运行的、特定名称的本地容器的日志。 参数必须是一个本地容器的名称。
 -D DIR, --directory=DIR
    仅显示来自于特定目录中的日志, 而不是默认的运行时和系统日志目录中的日志。
 --file=GLOB
    GLOB 是一个可以包含"?""*"的文件路径匹配模式。 表示仅显示来自与指定的 GLOB
    模式匹配的文件中的日志, 而不是默认的运行时和系统日志目录中的日志。
    可以多次使用此选项以指定多个匹配模式(多个模式之间用"OR"逻辑连接)。
 --root=ROOT
    在对日志进行操作时, 将 ROOT 视为系统的根目录。 例如 --update-catalog 将会创建
    ROOT/var/lib/systemd/catalog/database
 --new-id128
    此选项并不用于显示日志内容, 而是用于重新生成一个标识日志分类的 128-bit ID 。
    此选项的目的在于 帮助开发者生成易于辨别的日志消息, 以方便调试。
 --header
    此选项并不用于显示日志内容, 而是用于显示日志文件内部的头信息(类似于元数据)。
 --disk-usage
    此选项并不用于显示日志内容,
    而是用于显示所有日志文件(归档文件与活动文件)的磁盘占用总量。
 --vacuum-size=, --vacuum-time=, --vacuum-files=
    这些选项并不用于显示日志内容,
    而是用于清理日志归档文件(并不清理活动的日志文件), 以释放磁盘空间。
     --vacuum-size= 可用于限制归档文件的最大磁盘使用量 (可以使用 "K", "M", "G", "T"
    后缀); --vacuum-time= 可用于清除指定时间之前的归档 (可以使用 "s", "m", "h",
     "days", "weeks", "months", "years" 后缀); --vacuum-files=
    可用于限制日志归档文件的最大数量。 注意,--vacuum-size= 对 --disk-usage
    的输出仅有间接效果, 因为 --disk-usage 输出的是归档日志与活动日志的总量。
    同样,--vacuum-files= 也未必一定会减少日志文件的总数,
    因为它同样仅作用于归档文件而不会删除活动的日志文件。
    此三个选项可以同时使用,以同时从三个维度去限制归档文件。
    若将某选项设为零,则表示取消此选项的限制。
 --list-catalog [128-bit-ID...]
    简要列出日志分类信息, 其中包括对分类信息的简要描述。
    如果明确指定了分类ID(128-bit-ID), 那么仅显示指定的分类。
 --dump-catalog [128-bit-ID...]
    详细列出日志分类信息 (格式与 .catalog 文件相同)。
    如果明确指定了分类ID(128-bit-ID), 那么仅显示指定的分类。
 --update-catalog
    更新日志分类索引二进制文件。
    每当安装、删除、更新了分类文件,都需要执行一次此动作。
 --setup-keys
    此选项并不用于显示日志内容, 而是用于生成一个新的FSS(Forward Secure
    Sealing)密钥对。 此密钥对包含一个"sealing key"与一个"verification key""sealing key"保存在本地日志目录中, 而"verification key"则必须保存在其他地方。
    详见 journald.conf(5) 中的 Seal= 选项。
 --force
    与 --setup-keys 连用, 表示即使已经配置了FSS(Forward Secure Sealing)密钥对,
    也要强制重新生成。
 --interval=--setup-keys 连用,指定"sealing key"的变化间隔。
    较短的时间间隔会导致占用更多的CPU资源, 但是能够减少未检测的日志变化时间。
    默认值是 15min
 --verify
    检查日志文件的内在一致性。 如果日志文件在生成时开启了FSS特性, 并且使用
     --verify-key= 指定了FSS的"verification key",
    那么,同时还将验证日志文件的真实性。
 --verify-key=--verify 选项连用, 指定FSS的"verification key"
 --sync
    要求日志守护进程将所有未写入磁盘的日志数据刷写到磁盘上,
    并且一直阻塞到刷写操作实际完成之后才返回。 因此该命令可以保证当它返回的时候,
    所有在调用此命令的时间点之前的日志, 已经全部安全的刷写到了磁盘中。
 --flush
    要求日志守护进程 将 /run/log/journal 中的日志数据 刷写到 /var/log/journal 中
    (如果持久存储设备当前可用的话)。 此操作会一直阻塞到操作完成之后才会返回,
    因此可以确保在该命令返回时, 数据转移确实已经完成。
    注意,此命令仅执行一个单独的、一次性的转移动作, 若没有数据需要转移,
    则此命令什么也不做, 并且也会返回一个表示操作已正确完成的返回值。
 --rotate
    要求日志守护进程滚动日志文件。 此命令会一直阻塞到滚动完成之后才会返回。
 -h, --help
    显示简短的帮助信息并退出。
 --version
    显示简短的版本信息并退出。
 --no-pager
    不将程序的输出内容管道(pipe)给分页程序
View Code
复制代码

例子

复制代码
#查看所有日志(默认情况下 ,只保存本次启动的日志)
  journalctl
 #查看内核日志(不显示应用日志)
  journalctl -k
 #查看系统本次启动的日志
 2 实战案例
  journalctl -b
  journalctl -b -0
 #查看上一次启动的日志(需更改设置)
  journalctl -b -1
 #查看指定时间的日志
  journalctl --since="2017-10-30 18:10:30"
  journalctl --since "20 min ago"
  journalctl --since yesterday
  journalctl --since "2017-01-10" --until "2017-01-11 03:00"
  journalctl --since 09:00 --until "1 hour ago"
 #显示尾部的最新10行日志
  journalctl -n
 #显示尾部指定行数的日志
  journalctl -n 20
 #实时滚动显示最新日志
  journalctl -f
 #查看指定服务的日志
  journalctl /usr/lib/systemd/systemd
 #查看指定进程的日志
  journalctl _PID=1 #查看某个路径的脚本的日志
  journalctl /usr/bin/bash
 #查看指定用户的日志
  journalctl _UID=33 --since today
 #查看某个 Unit 的日志
  journalctl -u nginx.service
  journalctl -u nginx.service --since today
 #实时滚动显示某个 Unit 的最新日志
  journalctl -u nginx.service -f
 #合并显示多个 Unit 的日志
  journalctl -u nginx.service -u php-fpm.service --since today
 #查看指定优先级(及其以上级别)的日志,共有8级 
 0: emerg
 1: alert
 2: crit
 3: err
 4: warning
 5: notice
 6: info
 7: debug
  journalctl -p err -b
 #日志默认分页输出,--no-pager 改为正常的标准输出
  journalctl --no-pager
 #日志管理journalctl
 #以 JSON 格式(单行)输出
  journalctl -b -u nginx.service -o json
 #以 JSON 格式(多行)输出,可读性更好
  journalctl -b -u nginx.serviceqq -o json-pretty
 #显示日志占据的硬盘空间
  journalctl --disk-usage
 #指定日志文件占据的最大空间
  journalctl --vacuum-size=1G
 #指定日志文件保存多久
  journalctl --vacuum-time=1years
View Code
复制代码
好玩的
  • systemctl status 某服务——查看服务状态信息,但不分页显示,信息不全

解决方案:

1、将状态信息导入另一文件,cat 文件就能看。

2、journalctl -xe --no-pager,分页查看所有日志。

  • journalctl --since "2017-01-10" --until "2017-01-11 03:00"

通过时间筛选日志

posted @   Bacolate  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示