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

结构

inode与block

硬链接与软连接

恢复误删除的文件

分析日志文件

inode和block概述

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

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

block(块):1.连续的八个扇区组成一个block(4k);2.是文件存取的最小单位

inode(索引节点):1.索引节点,也叫i节点;2.用于存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)

操作系统读取硬盘是一次性连续读取多个扇区,即一个块一个块的读取的;一个文件必须占用一个inode,且至少占用一个block

inode不包含文件名,文件名是存放在目录当中的,Linux 系统中一切皆文件,因此目录也是一种文件。

Linux系统内部不使用文件名,而使用inode号码来识别文件。文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码;通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。

新建文件进行修改后,其inode号会改变,因为块发生改变

inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。
一个是数据区,存放文件数据;另一个是 inode 区,存放 inode 所包含的信息。
每个 inode 的大小,一般是 128 字节或 256 字节。

通常情况下不需要关注单个 inode 的大小,而是需要重点关注 inode 总数。
inode 的总数在格式化时就给定了

查看文件名对应的 inode 号码有两种方式:
ls -i 文件名  【只能看到文件对应的inode号】
stat 文件名   【可以查看到文件inode号以及其它详细信息】

df -i     【可以查看inode号的总量,已使用量和剩余可使用量】

linux系统文件三个主要的时间属性

ctime(change time):最后一次改变文件或目录属性的时间

atime(access time):最后一次访问文件或目录的时间

mtime(modify time):最后一次修改文件或目录内容的时间
 

由于 inode 号码与文件名分离,导致Linux 系统具备以下几种特有的现象:
*1.文件名包含特殊字符,可能无法正常删除。这时直接删除 inode,能够起到删除文件的作用;【可以删除乱码不能正常删除的文件】

2.移动文件或重命名文件,只是改变文件名,不影响 inode 号码;复制文件改变inode号
3.打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。
4.使用 vi 编辑器修改文件数据保存后,会生成一个新的 inode 号码。

例:模拟inode号满了,硬盘还有空间,但是不能用

[root@localhost ~]# fdisk /dev/sdb                【创建磁盘分区并给sdb1大小4M】
[root@localhost ~]# mkfs.ext4 /dev/sdb1     【sdb1给4M,xfs格式不能格式化太小的硬盘】

[root@localhost ~]# mount /dev/sdb1 /opt/aa     【挂载】

[root@localhost ~]# df -i    【查看inode详细信息:剩余1013个】

[root@localhost ~]# cd /opt/aa                           【到挂载目录aa下】
[root@localhost aa]# touch {1..1013}.txt     【在挂载目录下创建1013个文件】

[root@localhost aa]# df -i      【查看inode详细信息 ,inode号已经用完】

 [root@localhost aa]# touch a            【创建文件a】
touch: cannot touch ‘a’: No space left on device            【提示失败,没有空间】       

*例:删除无法删除的乱码文件

方法一: 1.查看乱码文件的inode号[root@localhost ~]#ls -i

2.在乱码文件的目录opt下输入删除命令:find /opt -inum  inode号  -exec rm -f {}  \;   【在乱码文件所在opt目录下,找到其inode号,{}表示把前面的内容作为它的参数】

方法二:1.查看乱码文件的inode号[root@localhost ~]#ls -i

2.在乱码文件的目录opt下输入删除命令:find /opt -inum inode号 -delete  【此方法只可以删文件,不可以删目录】

硬链接和软连接

恢复误删除的文件(centos7 中extundelete只能恢复ext3文件)

1.EXT 类型文件恢复(extundelete 是一个开源的 Linux 数据恢复工具,centos7 只能恢复ext3文件)

例:

1.使用fdisk创建分区/dev/sdb2,格式化ext3文件系统,并挂载

[root@localhost opt]# fdisk /dev/sdb

[root@localhost opt]# mkfs.ext3 /dev/sdb2

[root@localhost opt]# mount /dev/sdb2 /opt/aa

2.安装依赖包

[root@localhost ~]# cd /etc/yum.repos.d     【安装本地yum源】
[root@localhost yum.repos.d]# ls
backup
[root@localhost yum.repos.d]# vim test.repo
[root@localhost yum.repos.d]# yum clean all && yum makecache

[root@localhost yum.repos.d]# yum -y install e2fsprogs-devel e2fsprogs-libs【安装依赖环境】

[root@localhost yum.repos.d]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2

【在线获取extundelete-0.2.4.tar.bz2安装包】

[root@localhost yum.repos.d]# mv extundelete-0.2.4.tar.bz2 /opt 【移动到opt下】
[root@localhost yum.repos.d]# cd /opt
[root@localhost opt]# ls
aa  extundelete-0.2.4.tar.bz2  httpd-2.4.29  httpd-2.4.29.tar.bz2  rh
[root@localhost opt]# tar -jxvf extundelete-0.2.4.tar.bz2     【解压extundelete-0.2.4.tar.bz2安装包】

[root@localhost opt]# ls
aa                 extundelete-0.2.4.tar.bz2  httpd-2.4.29.tar.bz2
extundelete-0.2.4  httpd-2.4.29               rh

[root@localhost opt]# cd extundelete-0.2.4/   
[root@localhost extundelete-0.2.4]# yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl            【安装编译安装的依赖环境】
[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/ 【创立软链接,让系统能识别到extundelete命令】

[root@localhost extundelete-0.2.4]# cd /opt/aa     【在挂载目录下创建文件并写入内容】
[root@localhost aa]# touch 123 456
[root@localhost aa]# echo 123 > 123
[root@localhost aa]# echo 456 > 456

[root@localhost aa]# extundelete /dev/sdb2 --inode 2【查看文件系统/dev/sdb2下存在哪些文件,i 节点是从 2 开始的,2 代表该文件系统最开始的目录】

 [root@localhost aa]# rm -rf 123 456       【模拟删除文件123,456】

[root@localhost aa]# extundelete /dev/sdb2 --inode 2

【查看文件系统/dev/sdb2下存在哪些文件,i 节点是从 2 开始的,2 代表该文件系统最开始的目录】

 [root@localhost ~]# umount /dev/sdb2  /opt/aa    【解挂载】
umount: /opt/aa: not mounted

[root@localhost ~]# extundelete /dev/sdb2 --restore-all【恢复/dev/sdb2 文件系统下的所有内容】

【在当前目录下会出现一个RECOVERED_FILES/目录,里面保存了已经恢复的文件】

[root@localhost ~]# cd RECOVERED_FILES/                       【进入恢复文件目录】
[root@localhost RECOVERED_FILES]# ls                                【查看内容】
123  456
[root@localhost RECOVERED_FILES]# cat 123
123
[root@localhost RECOVERED_FILES]# cat 456
456                                                             【此时文件123,456及文件下的内容都已经恢复】
 

*恢复XFS类型的文件

CentOS 7 系统默认采用 xfs类型的文件,xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。
xfsdump 的备份级别有两种:0 表示完全备份;1-9 表示增量备份。xfsdump 的备份级别默认为 0

xfsdump 的命令格式为:xfsdump -f 备份存放位置 要备份的路径或设备文件

xfsdump 命令常用的选项:
-f:指定备份文件目录
-L:指定标签 session label
-M:指定设备标签 media label
-s:备份单个文件,-s 后面不能直接跟路径

xfsdump使用限制:
1.只能备份已挂载的文件系统
2.必须使用root的权限才能操作
3.只能备份XFS文件系统
4.备份后的数据只能让xfsrestore解析
5.不能备份两个具有相同UUID的文件系统(可用 blkid命令查看)

例:恢复xfs类型文件

[root@localhost ~]# fdisk /dev/sdb   【创建新的sdb4】

[root@localhost ~]# mkfs.xfs /dev/sdb4     【xfs  格式化】

[root@localhost ~]# mkdir /opt/cc
[root@localhost ~]# mount /dev/sdb4 /opt/cc    【挂载到cc】

[root@localhost cc]# touch 11 22                  【在挂载目录下创建文件并写入内容】
[root@localhost cc]# echo 123 > 11
[root@localhost cc]# echo 123 > 22
 

[root@localhost cc]# rpm -q xfsdump        【检查是否有备份工具】
xfsdump-3.1.4-1.el7.x86_64

[root@localhost cc]# xfsdump -f /opt/dump_sdb4 /dev/sdb4 [-L dump_sdb4 -M sdb4]

【把整个分区的文件备份到指定的目录。-f指定备份文件要到的目录;要备份的设备是sdb4;-L指定标签,与前面指定目录对应;-M指定设备的标签,与前面指定设备对应】

[root@localhost cc]# ls 
11  22
[root@localhost cc]# rm -rf *    【删除挂载目录下 11  22】
[root@localhost cc]# xfsrestore -f /opt/dump_sdb4 /opt/cc   【备份的文件 恢复到目录cc】

[root@localhost cc]# ls                                       【查看文件已经恢复】
11  22
 

日志文件

Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下

日志功能:1.用于记录系统、程序运行中发生的各种事件;2.有助于诊断和解决系统故障

日志文件分类:

1.内核及系统日志(由系统服务rsyslog统一管理,日志格式基本相似);主配置文件/etc/rsyslog.conf ;软件包rsyslog-7.4.7-16.el7.x86_64  主要程序/sbin/rsyslogd

2.用户日志:记录系统用户登录及退出系统的相关信息

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

常见的一些日志文件
内核及公共消息日志:/var/log/messages:记录Linux内核消息及各种应用程序的公共日志信息,
包括启动、IO错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息

计划任务日志:/var/log/cron:记录crond计划任务产生的事件信息
系统引导日志:/var/log/dmesg:记录Linux系统在引导过程中的各种事件信息
邮件系统日志:/var/log/maillog:记录进入或发出系统的电子邮件活动

vim /etc/rsyslog.conf   【查看rsyslog.conf配置文件,规则配置格式:设备的级别和动作】

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

【*表示所有 *.info表示所有级别,分号隔开none表示没有级别,即不记录
本行中表示不记录mail、authpriv、cron。其他所有记录到/var/log/messages文件中】

local7.*                                                /var/log/boot.log

【local7表示自定义服务,范围为0-7都可以使用,在支持的服务配置文件中也要写对应的local等级// /var/log/boot.log表示存到此目录下的文件中,文件可以自定义路径和文件名
//可以使用1个@或者2@加ip的形式将日志传到其他相通的服务器上】

$WorkDirectory /var/lib/rsyslog      【这是服务自身的工作日志】
 

设备字段说明:
auth                用户认证时产生的日志
authpriv            ssh、ftp等登录信息的验证信息
daemon                一些守护进程产生的日志
ftp                    FTP产生的日志
lpr                    打印相关活动
mark                rsyslog服务内部的信息,时间标识
news                网络新闻传输协议(nntp)产生的消息。
syslog                系统日志
uucp                Unix-to-Unix Copy 两个unix之间的相关通信
console                针对系统控制台的消息。
cron                系统执行定时任务产生的日志。
kern                系统内核日志
local0~local7        自定义程序使用
mail                邮件日志
user                用户进程

Linux系统内核日志消息的优先级别(数字等级越小,优先级越高,消息越重要):
0    EMERG(紧急):会导致主机系统不可用的情况。如系统崩溃
1    ALERT(警告):必须马上采取措施解决的问题。如数据库被破坏
2    CRIT(严重) :比较严重的情况。如硬盘错误,可能会阻碍程序的部分功能
3    ERR(错误):运行出现错误。不是非常紧急,尽快修复的
4    WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。不是错误,如磁盘用了85%等
5    NOTICE(注意):不会影响正常功能,但是需要注意的事件。无需处理
6    INFO(信息):一般信息。正常的系统信息
7    DEBUG(调试):程序或系统调试信息等。包含详细开发的信息,调试程序时使用
    none:没有优先级,不记录任何日志消息

日志记录的一般格式

Feb 26 13:00:01 localhost systemd: Started Session 12 of user root.
       时间标签       主机名   子系统名称      消息的具体内容

时间标签:消息发出的日期和时间
主机名:生成消息的计算机的名称
子系统名称:发出消息的应用程序的名称

日志的分析工具:

users:显示目前登录系统的用户信息

w:显示目前登入系统的用户的详细信息

last:列出截止目前登陆过系统的用户信息

lastb:用于查询登录失败的用户记录

 日志管理策略

1.及时做好备份和归档

2.延长日志保存期限

3.控制日志访问权限:日志中可能包含各类敏感信息,如账户、口令等

4.集中管理日志:1.将服务器的日志文件发送到统一的日志文件服务器;便于日志信息的统一收集、整理和分析;3.杜绝日志信息以外丢失、恶意篡改或删除

例:将ssh服务日志单独存放

1.关闭服务端和客户端防火墙、setenforce 0

[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld

2.[root@localhost ~]# vim /etc/rsyslog.conf   【修改配置文件】

 [root@localhost ~]# vim /etc/ssh/sshd_config

【将上一行注释掉;然后下一行插入SyslogFacilty LOCAL6】 

[root@localhost log]# systemctl restart rsyslog.service 
[root@localhost log]# systemctl restart sshd                【将修改的两个服务重启】

在另一台用户上测试

[root@localhost ~]# ssh root@192.168.126.1
root@192.168.126.1's password: 
Last login: Thu Mar  2 20:31:44 2023 from 192.168.126.1

此时生成ssh服务日志,查看日志/var/log/sshd.log

[root@localhost log]# ll ssh*
-rw-------. 1 root root 248 Mar  2 20:34 sshd.log
[root@localhost log]# cat sshd.log 
Mar  2 20:34:03 localhost sshd[61271]: Server listening on 0.0.0.0 port 22.
Mar  2 20:34:03 localhost sshd[61271]: Server listening on :: port 22.
Mar  2 20:34:51 localhost sshd[61289]: Accepted password for root from 192.168.126.1 port 48924 ssh2
 

例:日志服务器来收集日志  【把其他服务器上的日志只想到另一台服务器上】

zy001上的日志,指向收集到zy002上

1.先配置传输方zy001

[root@localhost ~]# systemctl stop firewalld.service     【关闭防火墙】
[root@localhost ~]# setenforce 0                            【关闭检验机制】

[root@localhost ~]# vim /etc/rsyslog.conf                    【修改配置文件】

 

 最后保存退出wq!

[root@localhost ~]# systemctl restart rsyslog.service   【配置完重启服务】

 2.配置接收方zy002

[root@localhost ~]# systemctl stop firewalld.service     【关闭防火墙】
[root@localhost ~]# setenforce 0                            【关闭检验机制】

[root@localhost ~]# vim /etc/rsyslog.conf                    【进入日志管理系统修改配置文件】

 重启服务  systemctl restart rsyslog.service

[root@localhost ~]# tail -f /var/log/messages                【查看实时日志】

3.在传输方zy001输入

[root@localhost ~]# logger "123456"
[root@localhost ~]# logger "123456"
[root@localhost ~]# logger "123456"

4.接收方zy002实时日志就可以显示zy001的日志:

 

日志管理工具  journalctl

日志管理工具journalctl是centos7上专有的日志管理工具,该工具是从messages这个文件里读取信息。Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。
日志的配置文件是  /etc/systemd/journald.conf

#查看所有日志(默认情况下,只保存本次启动的日志)
journalctl
journalctl -r                #-r表示倒序,从尾部看(推荐)

#查看内核日志(不显示应用日志)
journalctl -k

#查看系统本次启动的日志    
journalctl -b  [-0]

#查看上一次启动的日志(需更改设置,如上次系统崩溃,需要查看日志时,就要看上一次的启动日志)
journalctl -b -1

#显示尾部指定行数的日志
查看的是/var/log/messages的日志,但是格式上有所调整,如主机名格式不一样而已
journalctl -n 20

#查看某个服务的日志
journalctl -u nginx.service

#查看指定进程的日志 
journalctl _PID=1

#查看指定用户的日志
journalctl _UID=0  --since today
journalctl _UID=0  --since yesterday 昨天开始的日志,不能看明天的日志

journalctl -xe
# -x 是目录(catalog)的意思,在报错的信息下会,附加解决问题的网址
#-e  pager-end 从末尾开始看 
   
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值