1、inode与block详解

inode 和block 概述

inode:i节点 xfs文件系统512字节,ext4文件系统256字节

block:块 xfs文件系统:4096 磁盘IO:1024 扇区IO:512

inode包含很多的文件元信息,但不包含文件名,例如:

文件的字节数,文件拥有者的UserID,文件的GroupID,文件的读、写、执行权限,文件的时间戳等。

使用stat命令可查看某个文件的inode信息。例如:

Linux文件系统与日志分析_vim

Linux系统文件有三个主要的时间属性,分别是ctime(change time),atime(access time),mtime(modify time)

ctime(change time):是最后一次改变文件或目录(属性)的时间,例如执行:chmod,chown等命令。

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

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

inode号码:

用户在访问文件时,表面上是用户通过文件名来打开文件,而实际系统内部的过程分成以下三步:

系统找到这个文件名对应的 inode 号码;

通过 inode 号码,获取 inode 信息;

根据 inode 信息,找到文件数据所在的 block,并读出数据。

常见的查看 inode 号码的方式有两种:

Is-i命令:直接查看文件名所对应的inode 号码:

stat 命令:通过査看文件inode 信息而査看到 inode 号码。

例如:

Linux文件系统与日志分析_vim_02

inode的大小

inode也会消耗磁盘空间,每个Inode的大小一般是128字节或256字节。通常情况下不需要关注单个inode的大小,而是重点关注inode的总数。

执行“df -i”命令即可查看每个分区对应的inode总数和已经使用的inode数量。

Linux文件系统与日志分析_vim_03

如何查看和更改inode和block大小

首先为主机添加一块硬盘,并分区进行格式化和挂载(格式化为ext4和xfs类型):

Linux文件系统与日志分析_日志文件_04

Linux文件系统与日志分析_文件名_05

Linux文件系统与日志分析_vim_06

接着使用“dumpe2fs -h /dev/sdb1”去查看分区信息,例如:

Linux文件系统与日志分析_vim_07

处于挂载状态的话,先取消挂载,然后再进行更改:

Linux文件系统与日志分析_文件名_08

"mkfs -t ext4 -b 2048 /dev/sdb1" "mkfs -t ext4 -I 512 /dev/sdb1"可以修改块大小和inode大小。同样使用”dumpe2fs -h /dev/sdb1“来查看。

接着格式化/dev/sdb2为xfs:

Linux文件系统与日志分析_文件名_09

使用“mkfs -t xfs -f /dev/sdb2 -b size=2048 -i size=1024“可以更改block和inode的大小。例如:

Linux文件系统与日志分析_日志文件_10

接着进行挂载并查看挂载信息:

Linux文件系统与日志分析_日志文件_11

还可以通过”xfs_growfs -m 30 /dev/sdb2“设置inode在该分区所占比例,例如设置为占比30%:

Linux文件系统与日志分析_vim_12

硬链接和软连接

硬链接

一般情况下,文件名和 inode 号码是一一对应关系,每个inode 号码对应一个文件名。但是 Linux 系统允许多个文件名指向同一个inode 号码。这意味着,可以用不同的文件名访问同样的内容。In 命令可以创建硬链接,命令的基本格式为:

ln 源文件 目标

运行该命令以后,源文件与目标文件的inode 号码相同,都指向同一个inode。inode信息中的“链接数”这时就会增加1。

硬链接通过索引节点来连接,相当于文件的”复制“,不支持跨分区链接,且链接源文件与目标文件共用一个inode值。

连接文件的时候都要用绝对路径

软链接

软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。例如,文件A和文件 B的inode 号码虽然不一样,但是文件A的,内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件 B。这时,文件A就称为文件B的“软链接”(soft link)或者“符号链接(symbolic link)。

软连接的创建命令的基本格式为:

ln -s 源文件或目录 目标文件或目录

软连接通过路径来连接,类似于“快捷方式”,支持跨分区链接,且软链接文件与目标文件inode不相同。此外如果源文件丢失,硬链接目标文件内容不会丢失,而软链接的目标文件内容会丢失。

EXT类型文件恢复

1、编译安装extundelete

首先需要安装依赖包e2fsprogs-devel,e2fsprogs-libs,gcc,使用yum命令进行安装,

安装完成后即可将提前上传的extundelete软件包解压,配置,编译,安装。

Linux文件系统与日志分析_vim_13

Linux文件系统与日志分析_日志文件_14

Linux文件系统与日志分析_vim_15

Linux文件系统与日志分析_文件名_16

创建软连接:

Linux文件系统与日志分析_文件名_17

将/devsdb1格式化成ext3类型,然后进行挂载

Linux文件系统与日志分析_文件名_18

2、模拟删除并执行恢复操

创建测试用的文件

Linux文件系统与日志分析_vim_19

3、查看统计信息

Linux文件系统与日志分析_日志文件_20

4、模拟误操作并恢复

Linux文件系统与日志分析_vim_21


Linux文件系统与日志分析_文件名_22

Linux文件系统与日志分析_日志文件_23

恢复的文件会放在当前目录下的RECOVERED_FILES目录下。

xfs 类型文件备份和恢复

1:安装xfsdump工具

[root@localhost ~]# yum install -y xfsdump

2:将分区格式化为xfs

[root@localhost ~]# mkfs.xfs -f /dev/sdb1

[root@localhost ~]# mount /dev/sdb1 /data

[root@localhost ~]# cd /data

3:创建测试文件

[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

4:备份数据(将/data目录中的文件备份到/opt/dump_sdb1文件中)

[root@localhost ~]# xfsdump -f /opt/dump_sdb1 /data

5:模拟删除动作

[root@localhost ~]# rm -rf /data/*

6:恢复数据

[root@localhost ~]# xfsrestore -f /opt/dump_sdb1 /data/

2、分析日志文件

主要日志文件:

内核及系统日志:这种日志数据由系统服务rsyslog 统一管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置。系统中有相当一部分程序会把自己的日志文件交由rsyslog 管理,因而这些程序使用的日志记录也具有相似的格式。

用户日志:这种日志数据用于记录 Linux 操作系统用户登录及退出系统的相关信息包括用户名、登录的终端、录时间、来源主机、正在使用的进程操作等。

程序日志:有些应用程序会选择由自己独立管理一份日志文件(而不是交给rsyslog服务管理),用于记录本程序运行过程中的各种事件信息。由于这些程序只负责管理自己的日志文件,因此不同程序所使用的日志记录格式可能会存在较大的差异。

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

/var/log/cron:记录 crond 计划任务产生的事件信息。

/var/log/dmesg:记录 Linux 操作系统在引导过程中的各种事件信息。

/var/log/mailog:记录进入或发出系统的电子邮件活动。

/var/log/lastlog:记录每个用户最近的登录事件。

/var/log/secure:记录用户认证相关的安全事件信息。

/var/log/wtmp:记录每个用户登录、注销及系统启动和停机事件。

/var/log/btmp:记录失败的、错误的登录尝试及验证事件。

一、日志服务器实验步骤

打开三台主机

系统

主机名

IP地址

软件

Centos7.9

master

192.168.10.101

rsyslog

Centos7.9

mode1

192.168.10.102

rsyslog

Centos7.9

node2

192.168.10.103

rsyslog

1、检查软件包

[root@localhost ~]# systemctl stop firewalld   关闭防火墙

[root@localhost ~]# setenforce 0   关闭内核安全机制

[root@localhost ~]# rsyslogd -version  查看当前系统服务

rsyslogd 8.24.0-55.el7, compiled with:

PLATFORM: x86_64-redhat-linux-gnu

PLATFORM (lsb_release -d):

FEATURE_REGEXP: Yes

GSSAPI Kerberos 5 support: Yes

FEATURE_DEBUG (debug build, slow code): No

32bit Atomic operations supported: Yes

64bit Atomic operations supported: Yes

memory allocator: system default

Runtime Instrumentation (slow code): No

uuid support: Yes

Number of Bits in RainerScript integers: 64

为三台主机编辑/etc/hosts文件;

Linux文件系统与日志分析_日志文件_24

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

保存并退出。

[root@server ~]# mkdir -p /data/log  创建目录

[root@server ~]# systemctl restart 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 ~]# systemctl restart rsyslog   node1重启该服务

[root@node2 ~]# systemctl restart rsyslog   node2重启该服务

4、测试

在两个node节点生成一个日志,观察master端的日志数据

日志放在master主机的 /data/log/目录下 cd到/data/log下查看

二、自定义日志

1、自定义ssh服务的日志

(1)修改rsyslog配置文件

[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 AUTH     修改为 SyslogFacility 0  将注释符去掉,然后“AUTH”改为“0”

(3)启动rsyslog和sshd服务

rystemctl  restart rsyslog

systemctl  restart sshd

三、日志切割

       为了防止日志文件过大或占用过多的存储空间,通常需要对日志文件进行定期地归档和压缩,以防止日志内容将包含/var/log的文件系统填满。即日志切割(又叫日志轮转)。在Linux系统中,logrotate是一个常用的日志轮转工具。通过配置logrotate,可以指定要轮转的日志文件、轮转的时间间隔和保留的轮转文件数量等参数。

Linux文件系统与日志分析_日志文件_25

以/opt下的sshd.log为例。

[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:记录失败的、错误的登录尝试及验证事件。

[root@localhost ~]# systemctl restart rsyslog   重启该服务

手动强制分割的命令:

[root@localhost ~]# logrotate -vf /etc/logrotate.conf   “f”选项为指定配置文件