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

目录

一、inode和block概述

1、block(块)

2、inode(索引节点)

3、inode的内容

4、cp和inode

5、mv和inode

6、硬盘分区后的结构

 7、访问文件的简单流程

 8、inode的大小

 9、inode的特殊作用

二、硬链接与软链接

1、硬链接

2、软链接

3、两者的区别

 三、恢复误删除的文件

四、恢复xfs类型文件

1、xfsdump命令格式

2、xfsdump备份级别

3、常用选项

4、xfsrestore命令格式

5、xfsdump 使用 限制

6、操作过程

五、日志文件

1、日志的功能

2、日志文件的分类

3、日志保存的位置

4、主要日志文件介绍

5、日志文件的格式

六、内核及系统日志

1、日志消息的级别

2、程序日志分析

3、日志管理策略

七、总结


 

一、inode和block概述

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

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

1、block(块)

连续的八个扇区组成一个block

是文件存取的最小单位

2、inode(索引节点)

中文译名为“索引节点”,也叫i节点

用于存储文件元信息

3、inode的内容

inode包含很多的文件云信息,但不包括文件名

每一个inode表记录对应的保存了以下信息:

inode number 节点号

文件类型

权限

UID

GID

链接数(指向这个文件名路径名称个数)

该文件的大小和不同的时间戳

指向磁盘上文件的数据块指针

有关文件的其他数据

使用stat命令可以查看文件的inode信息

[root@localhost ~]#stat anaconda-ks.cfg
  文件:"anaconda-ks.cfg"
  大小:1766      	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:100663365   硬链接:1
权限:(0600/-rw-------)  Uid:(    0/    root)   Gid:(    0/    root)
环境:system_u:object_r:admin_home_t:s0
最近访问:2021-09-10 01:14:01.995561720 +0800
最近更改:2021-09-10 01:10:07.338972865 +0800
最近改动:2021-09-10 01:10:07.338972865 +0800
创建时间:-
[root@localhost ~]#

Linux系统文件有三个主要的时间属性,分别是最近访问时间、最近更改时间、最近改动时间,新建文件的时候,三种状态时间是一样的

写内容(echo没打开),最好两种变

修改权限,只有最后一种变--最近改动

vim打开,只有第一种变

Linux系统中一切皆文件,因此目录也是文件的一种

目录文件的结构

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

 Linux系统内部不使用文件名,而使用inode号码来识别文件,对于用户,文件名只是inode号码便于识别的别称

4、cp和inode

cp 命令:

分配一个空闲的inode号,在inode表中生成新条目

在目录中创建一个目录项,将名称与inode编号关联

拷贝数据生成新的文件

rm 命令:

硬链接数递减,从而释放的inode号可以被重用

把数据块放在空闲列表中

删除目录项

数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖

5、mv和inode

如果mv命令的目标和源在同一设备,

不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!

删除旧的目录对应关系新建目录对应关系

6、硬盘分区后的结构

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

 7、访问文件的简单流程

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

 8、inode的大小

inode也会消耗硬盘空间

每个inode的大小一般是128字节或256字节

格式化文件系统时确定inode总数

使用df -i 命令可以查看每个硬盘分区的inode总数和已使用的数量

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

 9、inode的特殊作用

由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象

当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件

移动或重命名文件时,只改变文件名,不影响inode号码

打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名

二、硬链接与软链接

1、硬链接

同一个文件取不同的名或者叫多个名字,不支持文件夹,创建一个连接数加一,多路径访问。

命令进本格式:ln 

2、软链接

软链接就是在创立一个文件,而这个文件会让数据的读取指向它连接的那个文件名

命令进本格式:ln  [-s]  源文件或目录… 链接文件或目标位置

3、两者的区别

对比项 硬链接 软链接
本质 本质是同一个文件夹 不是同一个文件夹
inode 相同 不相同
连接数 创建新的硬链接,链接数会增加,删除硬链接,链接数会减少 删除新建不会改变
文件夹 不支持 支持
删除源文件 只是链接数减一,但链接的访问不受影响 无法访问链接文件
文件类型 和源文件相同 链接文件,和源文件无关
文件大小 和源文件相同 源文件路径的长度

 三、恢复误删除的文件

我们删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录 里面的 block 中,删除这个文件的名字。Linux 是通过 Link 的数量来控制文件删除的,只有 当一个文件不存在任何 Link 的时候,这个文件才会被删除。

在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情 况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过“回收 站”找回的情况,比如使用“rm -rf”来删除数据。针对 Linux 下的 EXT 文件系统,可用的恢复 工具有 debugfs、ext3grep、extundelete 等。 其中 extundelete 是一个开源的 Linux 数据 恢复工具,支持 ext3 文件系统。 

1、使用 extundelete 工具恢复误删除的文件

1.编译安装extundelete

在编译安装 extundelete 之前需要先安装两个依赖包 e2fsprogs-libs 和 e2fsprogs-devel,这两个包在系统安装光盘的/Package 目录下就有,使用 rpm 或 yum 命令将其安装。

[root@localhost ~]#yum -y install e2fsprogs-devel e2fsprogs-libs  
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
rh
[root@localhost opt]#rm -rf *
[root@localhost opt]#ls
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
extundelete-0.2.4.tar.bz2
[root@localhost opt]#tar jxvf extundelete-0.2.4.tar.bz2 
[root@localhost opt]#ls
extundelete-0.2.4  extundelete-0.2.4.tar.bz2
[root@localhost opt]#cd extundelete-0.2.4/
[root@localhost extundelete-0.2.4]#
[root@localhost extundelete-0.2.4]#./configure 
Configuring extundelete 0.2.4
Writing generated files to disk
[root@localhost extundelete-0.2.4]#make
make -s all-recursive
Making all in src
extundelete.cc: 在函数‘ext2_ino_t find_inode(ext2_filsys, ext2_filsys, ext2_inode*, std::string, int)’中:
extundelete.cc:1272:29: 警告:在 {} 内将‘search_flags’从‘int’转换为较窄的类型‘ext2_ino_t {aka unsigned int}’ [-Wnarrowing]
    buf, match_name2, priv, 0};
                             ^
[root@localhost extundelete-0.2.4]#make install
Making install in src
  /usr/bin/install -c extundelete '/usr/local/bin'

2.模拟删除并执行恢复操作

1)使用fdisk命令创建新分区,将其挂载到/tmp目录下,往该目录下新建一些文件或目录

[root@localhost ~]#echo "- - -"> /sys/class/scsi_host/host0/scan 
[root@localhost ~]#echo "- - -"> /sys/class/scsi_host/host1/scan 
[root@localhost ~]#fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x84abcb2e 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):   
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+10G
分区 1 已设置为 Linux 类型,大小设为 10 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x84abcb2e

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

[root@localhost ~]#mkfs.ext3 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

[root@localhost ~]#mount /dev/sdb1 /tmp
[root@localhost ~]#df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G  3.7G   47G    8% /
devtmpfs                devtmpfs  4.1G     0  4.1G    0% /dev
tmpfs                   tmpfs     4.1G     0  4.1G    0% /dev/shm
tmpfs                   tmpfs     4.1G  9.2M  4.1G    1% /run
tmpfs                   tmpfs     4.1G     0  4.1G    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  179M  836M   18% /boot
/dev/mapper/centos-home xfs        45G   33M   45G    1% /home
tmpfs                   tmpfs     839M   52K  839M    1% /run/user/0
/dev/sr0                iso9660   4.3G  4.3G     0  100% /run/media/root/CentOS 7 x86_64
/dev/sdb1               ext3      9.8G   23M  9.2G    1% /tmp
[root@localhost ~]#cd /tmp
[root@localhost tmp]#echo a>a
[root@localhost tmp]#echo a>b
[root@localhost tmp]#echo a>c
[root@localhost tmp]#echo a>d
[root@localhost tmp]#ls
a  b  c  d  lost+found

 可以使用extundelete /dev/sdb1 --inode 2查看文件系统/dev/sdb1 下存在哪些文件,具体的使用情况。其中--inode 2 代表从 i 节点为 2 的文件开始查看,一般文件系统格式化挂载之后,i 节点是从 2 开始的,2 代表该文件系统最开始的目录。

2.模拟误操作并恢复

在恢复前需要先解挂载

使用“rm -rf a b”命令删除/tmp/下的a文件和b文件,当出现误操作时,立刻卸载该系统,然后使用“extundelete /dev/sdb1 --restore-all”恢复/dev/sdb1文件系统下的所有内容

执行完恢复的命令后,在当前目录下会出现一个/RECOVERED_FILES/目录,里面保存了已经恢复的文件。

[root@localhost tmp]#rm -rf a b
[root@localhost tmp]#ls
c  d  lost+found
[root@localhost tmp]#cd
[root@localhost ~]#umount /tmp/
[root@localhost ~]#extundelete /dev/sdb1 --restore-all
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 80 groups loaded.
Loading journal descriptors ... 56 descriptors loaded.
Searching for recoverable inodes in directory / ... 
2 recoverable inodes found.
Looking through the directory structure for deleted files ... 
0 recoverable inodes still lost.
[root@localhost ~]#ls
anaconda-ks.cfg       RECOVERED_FILES  模板  图片  下载  桌面
initial-setup-ks.cfg  公共             视频  文档  音乐
[root@localhost ~]#cd RECOVERED_FILES
[root@localhost RECOVERED_FILES]#ls
a  b
[root@localhost RECOVERED_FILES]#

四、恢复xfs类型文件

1、xfsdump命令格式

xfsdump -f 备份存放的位置 要备份的路径或设备文件

2、xfsdump备份级别

默认为0

0:完全备份

1-9:增量备份

3、常用选项

-f:指定备份文件目录

-L:指定标签 session label

-M:指定设备标签 media label

-s:备份单个文件,-s 后面不能直接跟路径

4、xfsrestore命令格式

xfsrestore -f 恢复文件的位置 存放恢复后文件的位置

5、xfsdump 使用 限制

不支持没有挂载的文件系统备份,所以只能备份已挂载的;

必须使用 root 的权限才能操作;

只能备份 XFS 文件系统;

备份下来的数据只能让 xfsrestore 解析;

不能备份两个具有相同 UUID 的文件系统(可使用blkid查看)

6、操作过程

先添加一块磁盘

[root@localhost ~]#echo "- - -"> /sys/class/scsi_host/host0/scan 
[root@localhost ~]#echo "- - -"> /sys/class/scsi_host/host1/scan 
[root@localhost ~]#echo "- - -"> /sys/class/scsi_host/host2/scan 
[root@localhost ~]#fdisk -l

查看 xfsdump 是否安装,未安装可以使用yum安装

[root@localhost ~]#rpm -q xfsdump 
xfsdump-3.1.4-1.el7.x86_64

新建分区,格式化成xfs格式,挂载,把文件拷入,备份分区,并打上标记

[root@localhost ~]#fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xbaaa9001 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+10G
分区 1 已设置为 Linux 类型,大小设为 10 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xbaaa9001

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]#mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]#mkdir /ding
[root@localhost ~]#mount /dev/sdb1 /ding
[root@localhost ~]#df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G  3.6G   47G    8% /
devtmpfs                devtmpfs  4.1G     0  4.1G    0% /dev
tmpfs                   tmpfs     4.1G     0  4.1G    0% /dev/shm
tmpfs                   tmpfs     4.1G  9.2M  4.1G    1% /run
tmpfs                   tmpfs     4.1G     0  4.1G    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  179M  836M   18% /boot
/dev/mapper/centos-home xfs        45G   33M   45G    1% /home
tmpfs                   tmpfs     839M   52K  839M    1% /run/user/0
/dev/sr0                iso9660   4.3G  4.3G     0  100% /run/media/root/CentOS 7 x86_64
/dev/sdb1               xfs        10G   33M   10G    1% /ding
[root@localhost ~]#cd /ding
[root@localhost ding]#cp /etc/passwd ./
[root@localhost ding]#ls
passwd
[root@localhost ding]#xfsdump -f /opt/dump_sdb1 /dev/sdb1  -L dump_sdb1 -M sdb1
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.4 (dump format 3.0) - type ^C for status and control
xfsdump: level 0 dump of localhost.localdomain:/ding
xfsdump: dump date: Sat Sep 25 12:27:41 2021
xfsdump: session id: 1fb2ce51-54e9-4d4f-93b0-3c29a985a6bb
xfsdump: session label: "dump_sdb1"
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 25216 bytes
xfsdump: /var/lib/xfsdump/inventory created
xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 24264 bytes
xfsdump: dump size (non-dir files) : 2592 bytes
xfsdump: dump complete: 0 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /opt/dump_sdb1 OK (success)
xfsdump: Dump Status: SUCCESS
[root@localhost ding]#ls /opt/
dump_sdb1  rh

模拟数据丢失后恢复

[root@localhost ding]#rm -rf *
[root@localhost ding]#ls
[root@localhost ding]#cd
[root@localhost ~]# xfsrestore -f /opt/dump_sdb1 /ding/
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.4 (dump format 3.0) - type ^C for status and control
xfsrestore: searching media for dump
xfsrestore: examining media file 0
xfsrestore: dump description: 
xfsrestore: hostname: localhost.localdomain
xfsrestore: mount point: /ding
xfsrestore: volume: /dev/sdb1
xfsrestore: session time: Sat Sep 25 12:27:41 2021
xfsrestore: level: 0
xfsrestore: session label: "dump_sdb1"
xfsrestore: media label: "sdb1"
xfsrestore: file system id: 3861965d-3e3b-479c-a486-66693a430767
xfsrestore: session id: 1fb2ce51-54e9-4d4f-93b0-3c29a985a6bb
xfsrestore: media id: 9a80fb47-47c0-478f-b64d-7dc714ddb2f3
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 1 directories and 1 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /opt/dump_sdb1 OK (success)
xfsrestore: Restore Status: SUCCESS
[root@localhost ~]#ls /ding/
passwd

五、日志文件

1、日志的功能

用于记录系统、乘车运行中发生的各种事件

通过阅读日志,有助于诊断和解决系统故障

2、日志文件的分类

1.内核及系统日志

由系统服务rsyslog同一管理,日志格式基本相似

2.用户日志

记录系统用户登录及退出系统的相关信息

3.程序日志

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

3、日志保存的位置

默认位于:/var/log目录下

4、主要日志文件介绍

日志文件位置 日志文件说明
/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等命令查看

5、日志文件的格式

日志文件的格式包括以下四列:

1.事件产生的时间

2.产生事件的服务器的主机名

3.产生事件的服务名或程序名

4.事件的具体信息

六、内核及系统日志

由系统服务rsyslog统一管理

日志的配置文件 位置在 /etc/rsyslog.conf

1、日志消息的级别

Linux 内核中,根据日志消息的重要程度不同,将其分为不同 的优先级别(数字等级越小,优先级越高,消息越重要)。

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

2、程序日志分析

由相应的应用程序独立进程管理

web服务:/var/log/httpd/

access_log、error_log

代理服务:/var/log/squid/

access_log、cache_log

FTP服务:/var/logxferlog/

分析工具

1.文件查看、grep过滤检索、webmin管理套件中查看

2.awk、sed等文本过滤、格式化编辑工具

3.webalizer、awstats等专用日志分析工具

3、日志管理策略

1.及时做好备份和归档

2.延长日志保存期限

3.控制日志访问权限

日志中可能会包含各类敏感信息,如账户、口令等

4.集中管理日志

将服务器的日志文件发到统一的日志文件服务器

便于日志信息的统一收集、整理和分析

杜绝日志信息的意外丢失、恶意篡改或删除

七、总结

掌握误删恢复的方法

 

上一篇:Linux文件系统与日志分析


下一篇:Linux 系统结构详解