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 READMEView 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”
-
文件调用流程:
-
通过文件名找到对应inode号
-
通过inode号获取inode信息
-
根据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>dView 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:日志记录相关的规则配置
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=1yearsView Code
好玩的
-
systemctl status 某服务——查看服务状态信息,但不分页显示,信息不全
解决方案:
1、将状态信息导入另一文件,cat 文件就能看。
2、journalctl -xe --no-pager,分页查看所有日志。
-
journalctl --since "2017-01-10" --until "2017-01-11 03:00"
通过时间筛选日志
标签:文件,00,--,文件系统,Linux,日志,root,localhost From: https://www.cnblogs.com/bacolate/p/17594174.html