Llinxu 文件系统与日志分析

 

一:Linux 中的文件

1.1 文件的组成与存储

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

一般连续的 8 个扇区组成一个“块(block)”,一个块大小是4k 。这是文件存取的最小单位

inode(索引节点/ i 节点) ,用于存放文件元数据

 

文件分为文件名和文件数据,文件名和文件数据分开存放文件数据包括实际数据与元数据(元数据:描述数据的数据,如文件按创建者,创建日期,文件大小,文件权限等)。

  • 文件名存放在目录中,即,上一级的文件数据中。
  • 文件实际数据存放在“块” 中
  • 存放元数据的区域就做 inode。

1.2 文件的读取

每个inode区域都有一个号码,操作系统用inode 号码来识别。

Linux系统内部不使用文件名,而使用inode号码来识别文件。

对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。

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

 

 

系统通过inode查找文件

 

 

假设,某文件的元数据存放在inode 4 位置,它记录了文件的描述信息,以及对应的 块 block 。实际存储文件数据的 块有 block 1 ,block 6 , block 12 。

系统查找文件 ,找到 inode 4 区域后,调用其 对应的 块 block 

 

1.3 查看文件的inode 信息

stat  文件名

 1 [root@promote opt]# stat abc.txt   #查看文件abc.txt 的属性   
 2   文件:"abc.txt"
 3   大小:4             块:8          IO 块:4096   普通文件
 4 设备:803h/2051d    Inode:67355544    硬链接:1             #inode 号
 5 权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
 6 环境:unconfined_u:object_r:usr_t:s0
 7 最近访问:2021-06-27 15:58:41.832261630 +0800    
 8 最近更改:2021-06-27 15:58:50.927505264 +0800
 9 最近改动:2021-06-27 15:58:50.927505264 +0800

 

atime (accesstime)(最近访问):
当使用这个文件的时候就会更新这个时间。当我们使用touch 刷新时间戳时,刷新的就是atime
 
mtime (modification time)(最近更改):
当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性, mtime不会改变,这就是和ctime的区别。
 
ctime (status time)(最近改动):
当修改文件的权限或者属性的时候,就会更新这个时间, ctime并不是create time,更像是change time,只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间。

# ls -i 文件名    也可以快速查看文件的inode 号

 

1.4  inode 的大小与特殊作用

inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。每个inode的大小,一般是128字节或256字节。
通常情况下不需要关注单个inode的大小,而是需要重点关注inode总数。
inode的总数在格式化时就给定了,执行"df -i"命令即可查看每个硬盘分区对应的的inode总数和已经使用的inode数量

[root@promote opt]# df -i /dev/sda  查看硬盘/dev/sda 的inodo号总数和使用情况
文件系统 Inode 已用(I) 可用(I) 已用(I)
% 挂载点 devtmpfs 250316 391 249925 1% /dev

 

 

特殊作用

由于inode号码与文件名分离,导致Linux系统具备以下几种特有的现象:
  1. 文件名包含特殊字符,可能无法正常删除。这时直接删除inode,能够起到删除文件的作用;
  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码;
  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。
  4. vim 修改文件数据被修改保存后,会生成一个新的inode号码。
  5.  重定向方式修改文件数据,不会改变inode 号

 

1.4.1 通过inode 号删除文件

使用find 命令查找inode 号,然后删除

使用find 命令,三种通过 inode 号删除文件的方法
[root@promote opt]# ls abc.txt rh [root@promote opt]# ls
-i 67355544 abc.txt 69088815 rh [root@promote opt]# find /opt/ -inum 67355544 -delete [root@promote opt]# ls rh [root@promote opt]# ls rh test.txt [root@promote opt]# ls -i test.txt 67355544 test.txt [root@promote opt]# find /opt/ -inum 67355544 -exec rm -rf {} \; [root@promote opt]# ls rh [root@promote opt]# ls 123.txt rh [root@promote opt]# ls -i 123.txt 67355544 123.txt [root@promote opt]# find /opt/ -inum 67355544 | xargs rm -rf [root@promote opt]# ls rh

 

1.4.2 对文件操作,查看inode 号变化

移动文件,重命名文件,复制文件,vim修改文件数据  ,重定向写入

移动文件和重名名文件,inode 号不变
[root@promote opt]# touch abc.txt [root@promote opt]# ls
-i abc.txt 67355544 abc.txt [root@promote opt]# mv abc.txt /root/ #移动文件 [root@promote opt]# ls -i /root/abc.txt #查看发现 文件 inode 号没有改变 67355544 /root/abc.txt [root@promote opt]# mv /root/abc.txt /root/test.txt #重命名文件 [root@promote opt]# ls -i /root/test.txt #查看发现文件 inode 号没有改变 67355544 /root/test.txt

 

 

复制文件,vim 写入文件, 新文件的inode 号改变
[root@promote ~]# ls -i test.txt 67355544 test.txt [root@promote ~]# cp test.txt /opt/ #复制文件 [root@promote ~]# ls /opt/test.txt /opt/test.txt [root@promote ~]# ls -i /opt/test.txt #新文件的inode 号改变 68335094 /opt/test.txt [root@promote ~]# ls -i test.txt 67355544 test.txt [root@promote ~]# cat test.txt [root@promote ~]# vim test.txt #vim修改文件内容 abc "test.txt" 1L, 4C 已写入 [root@promote ~]# cat test.txt abc [root@promote ~]# ls -i test.txt #inode 号改变 67355545 test.txt

 

使用重定向写入的方式修改文件内容,inode 号不变
[root@promote opt]# ls rh test.txt [root@promote opt]# ls
-i test.txt 68335094 test.txt [root@promote opt]# cat test.txt abc [root@promote opt]# echo "123" >> test.txt #追加重定向的方式改变文件内容

  [root@promote opt]# cat test.txt
  abc
  123

[root@promote opt]# ls -i test.txt         #查看inode 号没有改变  
68335094 test.txt
[root@promote opt]# echo
"hahaha" > test.txt #覆盖重定向的 方式改变文件内容 [root@promote opt]# cat test.txt hahaha
[root@promote opt]# ls
-i test.txt #文件的inode 号没有改变 68335094 test.txt

 

 

二: 节点耗尽 与恢复文件

2.1 inode 节点耗尽

在格式化文件系统时,会分配固定的inode号 。在存储文件时,每个文件都会消耗一个inode 号。当inode 号被消耗完,即使磁盘依旧有剩余空间,也无法写入数据

 

2.1.1 fdisk 创建分区,格式化为 ext  文件系统, 挂载使用

[root@promote opt]# fdisk /dev/sdb
[root@promote opt]# partprobe /dev/sdb1
[root@promote opt]# mkfs.ext4 /dev/sdb1
oot@promote opt]# mkdir /test
[root@promote opt]# mount /dev/sdb1 /test
[root@promote opt]# df -i /dev/sdb1v                    #查看磁盘 /dev/sdb1 的inode 节点
文件系统       Inode    已用(I)   可用(I)  已用(I)%  挂载点
/dev/sdb1       2560      11    2549       1%     /test

 

2.1.2 模拟 inode 节点耗尽

[root@promote opt]# for ((i=1;i<=2549;i++))
> do
> touch /test/file$i
> done                               #创建2549 个文件,耗尽inode 号

[root@promote opt]# df -i /dev/sdb1    #查看发现可用 inode 为0
文件系统       Inode    已用(I)   可用(I)  已用(I)%    挂载点
/dev/sdb1       2560    2560       0     100%      /test

[root@promote test]# df -h /dev/sdb1 #查看发现可用空间还剩 7.8 M 文件系统 容量 已用 可用 已用
% 挂载点 /dev/sdb1 8.7M 230K 7.8M 3% /
test
[root@promote test]# touch a.txt touch: 无法创建
"a.txt": 设备上没有空间 #无法写入文件

 

2.1.3 删除文件后inode 号恢复

[root@promote test]# rm -rf /test/*   #删除文件

  [root@promote test]# df -i /dev/sdb1   #inode 节点恢复
  文件系统   Inode   已用(I) 可用(I) 已用(I)% 挂载点
 /dev/sdb1   2560   10     2550    1%       /tes


[root@promote test]# touch a.txt   #成功创建新文件
[root@promote test]# ls
a.txt

 

2.2 恢复 ext文件类型

使用extundelete 工具恢复

(1) 使用fdisk创建分区,格式化为 ext3 文件系统

[root@promote test]# fdisk /dev/sdb
[root@promote test]# partprobe  /dev/sdb2
[root@promote test]# mkfs.ext3 /dev/sdb2
[root@promote test]# mkdir /data/
[root@promote test]# mount /dev/sdb2 /data
[root@promote test]# df -hT /dev/sdb2
文件系统       类型     容量  已用  可用 已用% 挂载点
/dev/sdb2      ext3  4.8G   11M  4.6G  1% /data

 

(2)安装extundelete 

[root@promote test]# yum -y install e2fsprogs-libs e2fsprogs-devel  #安装依赖包
[root@promote opt]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
[root@promote opt]# tar -jxvf extundelete-0.2.4.tar.bz2
[root@promote opt]# cd extundelete-0.2.4/
[root@promote extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete
[root@promote extundelete-0.2.4]# make && make install        #编译安装
[root@promote extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/   #将源码包的命令都设置软连接到 /usr/bin 

 

(3) 模拟删除并恢复

[root@promote opt]# cd /data/
[root@promote data]# for i in {a,b,c,d}
> do
> echo a>$i
> done
[root@promote data]# ls
a  b  c  d
[root@promote data]# extundelete  /dev/sdb2 --inode 2   ##查看文件系统/dev/sdc1下存在哪些文件, i节点是从2开始的, 2代表该文件系统最开始的目录。
#如下图

 

 

[root@promote data]# rm -rf a b  #删除 文件  a  b
[root@promote data]# extundelete /dev/sdb2 --inode 2 #查看 /dev/sdb2 下存在哪些文件

 

 

 

[root@promote data]# cd  /opt
[root@promote opt]# umount /data
[root@promote opt]# extundelete /dev/sdb2 --restore-all    #恢复文件
#恢复/dev/sdc1文件系统下的所有内容#在当前目录下会出现一个RECOVERED FILES/目录,里面保存了已经恢复的文件
[root@promote opt]# ls extundelete
-0.2.4 extundelete-0.2.4.tar.bz2 RECOVERED_FILES rh [root@promote opt]# ls RECOVERED_FILES/ a b

2.3 恢复xfs 文件系统

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

 

xfsdump的命令格式为:
xfsdump   -f   备份存放位置   要备份的路径或设备文件
 
xfsdump命令常用的选项:
-f :指定备份文件目录
-l :指定标签session labe
l-M:指定设备标签media label
-s:备份单个文件, -s后面不能直接跟路径
 
xfsdump使用限制:
1.只能备份已挂载的文件系统
2·必须使用root的权限才能操作
3.只能备份XFS文件系统
4、备份后的数据只能让xfsrestore解析
5,不能备份两个具有相同UUID的文件系统(可用blkid命令查看)

 

2.3.1 使用fdisk创建分区/dev/sdb1,格式化xfs文件系统

[root@promote opt]# fdisk  /dev/sdb
[root@promote opt]# partprobe /dev/sdb
[root@promote opt]# mkfs.xfs /dev/sdb3
[root@promote opt]# mount /dev/sdb3 /data
[root@promote opt]# df -h /data
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb3       5.0G   33M  5.0G    1% /data

[root@promote data]# touch abc.txt
[root@promote data]# mkdir a

 

 

 2.3.2  使用xfsdump命令备份整个分区

[root@promote data]# rpm -qa | grep xfsdump    #查看是否已经安装 xfsdump 软件包
xfsdump-3.1.7-1.el7.x86_64
[root@promote data]# yum -y install xfsdump     #如果没有安装则安装

[root@promote data]# xfsdump  -f /opt/dump_sdb3 /dev/sdb3 -L dump_sdb3 -M sdb3 
#备份 /dev/sdb3 的数据到 /opt/dump_sdb3

 

 

 2.3.3  删除数据并恢复

[root@promote data]# pwd
/data
[root@promote data]# rm -rf *   #删除数据
[root@promote data]# ls
[root@promote data]# xfsrestore -f /opt/dump_sdb3  /data   #从/opt/dump_sdb3 中恢复 /data 中的数据

 

 

 三:日志文件

3.1 日志文件的功能和分类

作用:

  • 用于记录系统,程序运行中发生的各种事件
  • 通过阅读日志,有助于诊断和解决系统故障

 

分类:

  • 内核及系统日志
    • 由系统服务 rsyslog 同一管理,日志格式基本相似
    • 主配置文件 /etc/rsyslog.conf
  • 用户日志
    • 记录系统用户登录及退出系统的相关信息
  • 程序日志
    • 由各种应用程序独立管理的日志文件,记录格式不统一

 

3.2 主要日志文件介绍及保存位置

保存位置:

默认位于 /var/log 目录下

 

主要日志文件介绍

内核及公共消息日志 /var/log/messages
计划任务日志 /var/log/cron
系统引导日志 /var/log/dmesg
邮件系统日志 /var/log/maillog
用户登录日志

/var/log/lastlog

/var/log/secure

/var/log/wtime

/var/log/btime

 

 

 

 

 

 

 

 

 

 

#内核及公共消息日志:
/var/log/messages:记录Linux内核消息及各种应用程序的公共日志信息,包括启动、i/o 读写错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。
 
#计划任务日志:
/var/log/cron:记录crond计划任务产生的事件信息,
 
#系统引导日志:
/var/log/dmesg:记录Linux系统在引导过程中的各种事件信息。
 
#邮件系统日志:
/var/log/maillog  :记录进入或发出系统的电子邮件活动
 
#用户登录日志:
/var/log/secure:记录用户认证相关的安全事件信息。
/var/log/lastlog :记录每个用户最近的登录事件。二进制格式
/var/log/wtmp  :记录每个用户登录、注销及系统启动和停机事件。二进制格式
/var/run/btmp:记录失败的、错误的登录尝试及验证事件。二进制格式

 

3.3  日志的格式与分析

[root@promote ~]# less /var/log/messages

 

 

 
3.3.1公共日志/var/log/messages文件的记录格式
时间标签 :消息发出的日期和时间。
主机名 :生成消息的计算机的名称。
子系统名称:发出消息的应用程序的名称。
消息:消息的具体内容。
 
程序自己维护日志记录, httpd网站服务程序使用两个日志文件:
access_log #记录客户访问事件
error log #记录错误事件。
 

 

3.3.2 分析工具

who,users ,w,last,lastb

查看当前系统登录情况

[root@localhost ~]# who
root     pts/0        2021-06-28 08:12 (192.168.23.1)
[root@localhost ~]# users 
root
[root@localhost ~]# w
 08:12:48 up 4 min,  1 user,  load average: 0.00, 0.03, 0.02
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.23.1     08:12    0.00s  0.02s  0.00s w
[root@localhost ~]# 

 

 

查看登录成功与失败情况

[root@localhost ~]# last    #查看成功登录的情况
root     pts/3        192.168.23.10    Mon Jun 28 08:16   still logged in   
root     pts/2        192.168.23.1     Mon Jun 28 08:14   still logged in   
root     pts/1        192.168.23.1     Mon Jun 28 08:13   still logged in   
root     pts/0        192.168.23.1     Mon Jun 28 08:12   still logged i

[root@localhost ~]# lastb    #查看失败登录的情况
root     ssh:notty    192.168.23.10    Mon Jun 28 08:16 - 08:16  (00:00)    
root     ssh:notty    192.168.23.10    Mon Jun 28 08:16 - 08:16  (00:00)    
root     pts/0                         Fri Jun 25 10:46 - 10:46  (00:00)    
lisi     :1           :1               Fri Jun 25 08:45 - 08:45  (00:00)    
lisi     :1           :1               Fri Jun 25 08:45 - 08:45  (00:00)    
root     pts/0                         Thu Jun 24 14:59 - 14:59  (00:00)    
root     :0           :0               Thu Jun 24 11:18 - 11:18  (00:00)    
root     :0           :0               Sun Jun 20 16:26 - 16:26  (00:00) 

 

 

 3.4 日志的管理策略

及时作好备份和归档
 
延长日志保存期限
 
控制日志访问权限
  • 日志中可能会包含各类敏感信息,如账户、口令等
 
集中管理日志
  • 将服务器的日志文件发到统一的日志文件服务器
  • 便于日志信息的统一收集、整理和分析
  • 杜绝日志信息的意外丢关、恶意篡改或删除

 编写计划任务,将每天的日志备份。并且删除超过30 天的日志

[root@promote httpd]# crontab -e 
30
2 * * * cp -a /var/log/messages /root/messages-log/log-$(date +%F)
#每天2点30将 /var/log/messages 的日志备份到 /root/messages-log/目录下

30 3 * * * fine /root/messages-log/ -mtime +30 -delete
# 每天3点30/root/messages-log/目录下的日志, mtime 超过30 天的日志删除 (mtime,修改时间)
~

 

posted @ 2021-06-27 23:14  知己一语  阅读(229)  评论(0编辑  收藏  举报