处理 Linux 系统出现的各种故障时,故障的症状是最易发现的,而导致这一故障的原因才是最终排除故障的关键,熟悉 Linux 系统中常见的日志文件,了解一般故障的分析与解决办法,将有助于管理员快速定位故障点、“对症下药”、并及时解决各种系统问题
一、inode(索引节点,i节点)与block详解
Linux 操作系统的文件权限(rwx)与文件属性(所有者、群组、时间参数等),文件系统通常会将这两部分内容分别存放在 inode 和 block 中
1、inode和block概述
- 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)
- 这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是 4KB,即连续八个 sector 组成一个 block
文件名 |
目录项 |
目录块 |
元信息 |
inode |
inode表区块 |
数据 |
block |
block数据块 |
xfs的分区,一个inode有512字节,一个block有4096字节
ext4的分区,一个inode有256字节,一个block有4096字节
2、inode的内容
- 使用 stat 命令即可査看某个文件的 inode 信息
- inode 中并不包括文件名,其实文件名是存放在目录当中的。Linux 系统中一切皆文件,因此目录也是一种文件
- 每个inode 都有一个号码,操作系统用inode 号码来识别不同的文件,Linux 系统内部不使用文件名,而使用inode 号码来识别文件
[root@localhost ~]# stat anaconda-ks.cfg
File: 'anaconda-ks.cfg //File:显示文件名
Size: 1424 (Size:显示文件大小) Blocks: 8 (Blocks:文件使用的数据块总数) IO Block: 4096 (IO Block:IO块大小) regular file (regular file:文件类型(常规文件))
Device: fd00h/64768d (Device:设备编号) inode:100663363 (Inode:Inode号) Links:1 (Links:链接数)
Access:(0600-nw-------)Uid:( 0/ root) Gid:( 0/ root) //Access:文件的权限 Gid、Uid:文件所有权的Gid和Uid
Access:2018-11-07 03:28:01.914327950 -0500 //access time:表示我们最后一次访问(仅仅是访问,没有改动)文件的时间
Modify: 2018-11-07 06:45:44.506987401 -0500 //modify time:表示我们最后一次修改文件的时间
Change: 2018-11-07 06:45:44.506987401 -0500 //change time:表示我们最后一次对文件属性改变的时间,包括权限,大小,属性等等
Birth:- //Birth time : 文件创建时间,crtime,不过据查此属性linux已废弃,目前状态显示结果均为 -
3、inode的号码
- 用户在访问文件时,表面上是用户通过文件名来打开文件,而实际系统内部的过程分成三步:
- 系统找到这个文件名对应的 inode 号码
- 通过 inode 号码,获取 inode 信息
- 根据 inode 信息,找到文件数据所在的 block,并读出数据
- 常见的查看 inode 号码的方式有两种:
- ls-i命令:直接查看文件名所对应的inode 号码
- stat 命令:通过查看文件inode 信息而查看到 inode 号码
4、inode的大小
- inode 也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域:一个是数据区,存放文件数据;另一个是inode 区,存放inode 所包含的信息,每个inode 的大小,一般是 128 字节或 256 字节
- 执行“df-i"命令即可查看每个硬盘分区对应的的 inode 总数和已经使用的 inode 数量
[root@localhost ~]# df -i
二、硬链接与软链接
硬链接只能针对文件,不能针对目录,软链接可以针对文件和目录
硬链接不能跨分区,软链接可以跨分区
1、硬链接
- 一般情况下,文件名和 inode 号码是一一对应关系,每个inode 号码对应一个文件名,但是 Linux 系统允许多个文件名指向同一个inode 号码,可以用不同的文件名访问同样的内容,ln命令可以创建硬链接
- 源文件与目标文件的inode 号码相同,都指向同一个inode
- inode信息中的“链接数”这时就会增加1
ln 源文件 目标
2、软链接
- 软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名
- 例:文件A和文件 B的inode 号码虽然不一样,但是文件A的,内容是文件B 的路径,读取文件A时,系统会自动将访问者导向文件 B,文件A就称为文件 B的“软链接”(soft link)或者“符号链接(symbolic link)
- 文件 A依赖于文件 B而存在,如果删除了文件 B,打开文件 A 就会报错。这是软链接与硬链接最大的不同
ln-s 源文件或目录 目标文件或目录
3、ll 命令
[root@localhost ~]# ll -i
134592347 drwxr-xr-x. 2 root root 6 6月 6 14:33 111
268635557 -rw-r--r--. 2 root root 0 6月 6 14:30 aaa
268634190 -rw-r--r--. 1 root root 156 5月 22 19:22 ali
268634178 -rw-------. 1 root root 1683 5月 22 19:04 anaconda-ks.cfg
268635557 -rw-r--r--. 2 root root 0 6月 6 14:30 bbb
268675885 lrwxrwxrwx. 1 root root 3 6月 6 14:32 ccc -> aaa
注意:红色的数字代表文件的硬链接数量,如果是目录,则表示目录内的子目录数量
三、EXT类型文件恢复
删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录里面的 block 中,删除这个文件的名字。Linux 是通过 Link 的数量来控制文件删除的,只有当一个文件不存在任何 Link 的时候,这个文件才会被删除。
在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情况,针对 Linux 下的 EXT 文件系统,可用的恢复工具有 debugfs、ext3grep、extundelete 等,其中 extundelete 是一个开源的 Linux 数据恢复工具,支持 ext3、ext4 文件系统
1:编译安装 extundelete
[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs (wget bzip2 gcc*)
[root@localhost ~]# wget
http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
[root@localhost ~]# tar -xvf extundelete-0.2.4.tar.bz2
[root@localhost ~]# cd extundelete-0.2.4
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete && make && make install
[root@localhost extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/
2:模拟删除并执行恢复操作
(1)创建测试用文件
[root@localhost ~]# cd /data
[root@localhost data]# echo a>a
[root@localhost data]# echo b>b
[root@localhost data]# echo c>c
[root@localhost data]# echo d>d
[root@localhost data]# ls
a b c d lost+found
(1)查看统计信息
[root@localhost data]# extundelete /dev/sdb1
(2)模拟误操作并恢复
[root@localhost data]# rm -rf a b
[root@localhost data]# ls
c d lost+found
[root@localhost data]# cd
[root@localhost ~]# umount /data
[root@localhost ~]# extundelete /dev/sdb1 --restore-all
注意:
恢复的文件会放在当前目录下的RECOVERED_FILES子目录下
四:xfs 类型文件备份和恢复
- extundelete 工具仅可以恢复 EXT 类型的文件,无法恢复 CentOS7 系统默认采用 xfs类型的文件
- xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复
- xfsdump 的备份级别有两种:0表示完全备份;1-9表示增量备份。xfsdump的备份级别默认为0。xfsdump的命令格式为:xfsdump-f备份存放位置要备份路径或设备文件
1、下载xfsdump
[root@localhost ~]# yum install -y xfsdump
- 常用的备份文件目录
- -f:指定备份文件目录:
- -L:指定标签 session label;
- -M:指定设备标签 media label;
- -s:备份单个文件,-s后面不能直接跟路径
2、准备测试文件
//将sdb1分区格式化为xfs,并挂载到/date
[root@localhost ~]# cd /date
[root@localhost date]## cp /etc/passwd ./[root@localhost date]# mkdir test
[root@localhost date]# touch test/a
[root@localhost date]# tree /date
/date
|——passwd
|__test
|___a
1 directory, 2 files
3、备份数据,将整个文件备份到/opt/dump_sdb1文件中
[root@localhost ~]# xfsdump -f /opt/dump_sdb1 /dev/sdb1
4:模拟删除动作
[root@localhost ~]# cd /date/
[root@locahost date]# ls
passwd test
[root@localhost date]# rm -rf ./*
[root@localhost date]# ls
[root@localhost date]#
5:恢复数据
[root@localhost ~]# xfsrestore -f/opt/dump sdb1 /datel/
......
xfsrestore: Restore Status:SUCCESS
[root@localhost ~]# ls /date/
passwd test
- 使用 xfsdump 时,需要注意以下的几个限制
- xfsdump不支持没有挂载的文件系统备份,所以只能备份已挂载的
- xfsdump 必须使用root 的权限才能操作(涉及文件系统的关系)
- xfsdump 只能备份 XFS 文件系统
- xfsdump 备份下来的数据(档案或储存媒体)只能让 xfsrestore 解析
- xfsdump 是透过文件系统的 UUID 来分辨各个备份档的,因此不能备份两个具有相同UUID 的文件系统
五、扩展:主要日志文件
- 内核及系统日志、用户日志、程序日志
- Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下
- /var/log/cron:记录 crond 计划任务产生的事件信息
- /var/log/dmesg:记录 Linux操作系统在引导过程中的各种事件信息
- /var/log/maillog:记录进入或发出系统的电子邮件活动
- /var/log/lastlog:记录每个用户最近的登录事件
- Ivar/log/secure:记录用户认证相关的安全事件信息
- Ivar/log/wtmp:记录每个用户登录、注销及系统启动和停机事件
- Ivar/log/btmp:记录失败的、错误的登录尝试及验证事件
日志文件分析
对于大多数文本格式的日志文件(如内核及系统日志、大多数的程序日志),只要使用tail、more、less、cat 等文本处理工具就可以查看日志内容。而对于一些二进制格式的日志文件(如用户日志),则需要使用特定的查询命令
1、内核及系统日志
[root@localhost ~]# grep -v"^$" /etc/rsyslog.conf //过滤掉空行
......
......
......
- 受 rsyslogd 服务管理的日志文件都是 Linux操作系统中主要的日志文件,它们记录了 Linux操作系统中内核、用户认证、电子邮件、计划任务等基本的系统消息
- 分为不同的优先级别(数字等级越小,优先级越高,消息越重要)
- 0 EMERG(紧急):会导致主机系统不可用的情况。
- 1 ALERT(警报):必须马上采取措施解决的问题。
- 2 CRIT(严重):比较严重的情况
- 3 ERR(错误):运行出现错误
- 4 WARNING(警告):可能影响系统功能,需要提醒用户的重要事件
- 5 NOTICE(注意):不会影响正常功能,但是需要注意的事件
- 6 INFO(信息):一般信息
- 7 DEBUG(调试):程序或系统调试信息等
- 内核及大多数系统消息被记录到公共日志文件ar/log/messages 中,而其他一些程序消息被记录到各自独立的日志文件中
- 对于rsyslog 服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的
[root@localhost ~]# more /var/log/messages
May 28 05:50:58 localhost kernel: Initializing cgroup subsys cpuset
- 大概分为四个字段
- 时间标签:消息发出的日期和时间
- 主机名:生成消息的计算机的名称
- 子系统名称:发出消息的应用程序的名称
- 消息:消息的具体内容
2、用户日志
在 wtmp、btmp、lastlog 等日志文件中,保存了系统用户登录、退出等相关的事件消息但是这些文件都是二进制的数据文件,不能直接使用tail、less 等文本查看工具进行浏览,需要使用 who、w、users、last 和 lastb 等用户查询命令来获取日志信息
(1)查询当前登录的用户情况--users、who、w 命令
[root@localhost ~]# users //users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话
[root@localhost ~]# who //who 命令用于报告当前登录到系统中的每个用户的信息
[root@localhost ~]# w //w命令用于显示当前系统中的每个用户及其所运行的进程信息,比users、who 命令的输出内容要丰富一些
(2)查询用户登录的历史记录--last、lastb 命令
[root@localhost ~]# last //last 命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面
[root@localhost ~]# lastb //lastb 命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都将记录在案
或
[root@localhost ~]# tail /var/log/secure
3、程序日志
在 Linux操作系统中,还有相当一部分应用程序没有使用rsyslog 服务来管理日志,而是由程序自己维护日志记录
六.(一)、日志服务器
1、环境及检查
系统 |
主机名 |
IP地址 |
软件 |
centos7.9 |
master |
192.168.10.101 |
rsyslog |
centos7.9 |
node1 |
192.168.10.102 |
rsyslog |
[root@localhost ~]# systemctl stop firewalld //关闭防火墙
[root@localhost ~]# setenforce 0 //临时关闭
[root@localhost ~]# rsyslogd -version //检查rsyslogd版本
2、master端设置
[root@server ~]# vim /etc/rsyslog.conf
找到如下一行,不用动他,保证有这一行(默认就有)
$IncludeConfig /etc/rsyslog.d/*.conf
[root@localhost ~]# cd /etc/rsyslog.d
[root@localhost rsyslog.d]# vim mylog.conf
$ModLoad immark ##支持日志标记
$ModLoad imudp ## imupd是模块名,支持udp协议
$UDPServerRun 514 ##允许514端口接收使用UDP协议转发过来的日志
$ModLoad imtcp ##支持udp协议
$InputTCPServerRun 514 ##允许514端口接收使用TCP协议转发过来的日志
$AllowedSender tcp, 192.168.10.0/24 #允许指定主机以tcp协议来传输
$template Remote,"/data/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
:fromhost-ip, !isequal, "127.0.0.1" ?Remote #过滤server 本机的日志,排除本机,记录远程
*.info;mail.none;authpriv.none;cron.none /data/log/messages
//将代码输入
备注:
(1)$AllowedSender tcp, 192.168.10.0/24
允许 30.0网段内的主机以tcp协议来传输
(2)$template Remote,"/data/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
定义模板,接受日志文件路径,区分了不同主机的日志
(3):fromhost-ip, !isequal, "127.0.0.1" ?Remote
过滤server 本机的日志。
(4)$InputTCPServerRun 514
开启tcp,tcp和udp 可以共存的
[root@server ~]# mkdir -p /data/log //创建父子目录/data/log
[root@server ~]# systemctl restart rsyslog //重启rsyslog服务
3:两台node节点的设置
[root@server ~]# vim /etc/rsyslog.conf
找到如下一行,不用动他,保证有这一行(默认就有)
$IncludeConfig /etc/rsyslog.d/*.conf
[root@localhost ~]# cd /etc/rsyslog.d
[root@localhost rsyslog.d]# vim mylog.conf
$template myFormat,"%timestamp% %fromhost-ip% %msg%"
*.info;mail.none;authpriv.none;cron.none @@192.168.10.101
[root@node1 ~]# scp /etc/rsyslog.d/mylog.conf 192.168.10.102:/etc/rsyslog.d/
[root@node1 ~]# systemctl restart rsyslog
[root@node2 ~]# systemctl restart rsyslog
六.(二)、自定义日志
1:自定义ssh 服务的日志
(1)编辑rsyslog的配置文件
[root@localhost opt]# setenforce 0
[root@localhost ~]# vim /etc/rsyslog.conf
# Save boot messages also to boot.log
local7.* /var/log/boot.log
local0.* /opt/sshd.log //添加这一行
(2)定义ssh服务的日志级别
[root@localhost ~]# vim /etc/ssh/sshd_config
修改如下内容:
SyslogFacility local0
(3)启动rsyslog和sshd服务
systemctl restart rsyslog
systemctl restart sshd
2:日志切割
[root@localhost ~]# cd /etc/cron.daily/
[root@localhost cron.daily]# ls
logrotate man-db.cron
logrotate的执行由crond服务实现。在/etc/cron.daily目录中,有个文logrotate,它实际上是个shell script,用来启动logrotate
[root@localhost cron.daily]# vim /etc/logrotate.conf
在末尾添加:
/opt/sshd.log { // 指定的是要切割的日志文件
missingok //如果文件丢失不报错
monthly //每月轮换一次
create 0664 root utmp //设置sshd.log这个文件的属主和属组
minsize 10M 文件超过10M进行回滚
rotate 2 日志进行分割后,保留两份历史数据
}
/var/log/wtmp:记录每个用户登录、注销及系统启动和停机事件。
/var/log/btmp:记录失败的、错误的登录尝试及验证事件。