深入理解Linux文件系统与日志分析

处理 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的号码

  1. 用户在访问文件时,表面上是用户通过文件名来打开文件,而实际系统内部的过程分成三步:
    1. 系统找到这个文件名对应的 inode 号码
    2. 通过 inode 号码,获取 inode 信息
    3. 根据 inode 信息,找到文件数据所在的 block,并读出数据
  2. 常见的查看 inode 号码的方式有两种:
    1. ls-i命令:直接查看文件名所对应的inode 号码
    2. 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操作系统中内核、用户认证、电子邮件、计划任务等基本的系统消息
    • 分为不同的优先级别(数字等级越小,优先级越高,消息越重要)
  1. 0 EMERG(紧急):会导致主机系统不可用的情况。
  2. 1 ALERT(警报):必须马上采取措施解决的问题。
  3. 2 CRIT(严重):比较严重的情况
  4. 3 ERR(错误):运行出现错误
  5. 4 WARNING(警告):可能影响系统功能,需要提醒用户的重要事件
  6. 5 NOTICE(注意):不会影响正常功能,但是需要注意的事件
  7. 6 INFO(信息):一般信息
  8. 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:记录失败的、错误的登录尝试及验证事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值