Linux文件系统与日志分析

文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。
一般连续八个扇区组成一个"块"(block),一个块是4K大小,是文件存取的最小单位。
操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。

文件数据包括实际数据与元信息(类似文件属性)。
文件数据存储在“块”中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode。
因此,一个文件必须占用一个 inode,并且至少占用一个 block。

inode不包含文件名。文件名是存放在目录当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
Linux系统内部不使用文件名,而使用inode号码来识别文件。
对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,
每个inode号码对应一个文件名。
所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码;
通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;
如果有,就指向相对应的数据block,并读取数据。

一个文件必须占用一个inode,但至少占用一个block

每个inode对应一个文件,文件的所有信息都存储在对应的inode中,
包括文件的名称、大小、访问权限等等。然而,文件的实际数据存储在存储设备的块中,
每个块通常有一定的大小(如4KB)。因此,一个文件需要占用至少一个块,即使它很小。

当一个文件创建时,文件系统会分配一个空闲的inode给它,并分配至少一个空闲块来存储文件的数据。
文件的所有数据都存储在这些块中,而inode则存储文件的元数据信息,包括文件的大小、块地址、权限等等。

因此,一个文件必须占用一个inode,但至少占用一个块,即使文件非常小,也要占用至少一个块。

查看文件名对应的 inode 号码有两种方式:
ls -i 文件名
stat 文件名

stat testfile #输入命令
File: `testfile’
Size: 102 Blocks: 8 IO Block: 4096 regular file
Device: 807h/2055d Inode: 1265161 Links: 1
Access: (0644/-rw-r–r–) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2014-08-13 14:07:20.000000000 +0800
Modify: 2014-08-13 14:07:07.000000000 +0800
Change: 2014-08-13 14:07:07.000000000 +0800

atime(accesstime):
当使用这个文件的时候就会更新这个时间。

mtime(modification time):
当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,ctime不会改变,mtime会变。

ctime(status time):
当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,更像是change time,
只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间。

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

通常情况下不需要关注单个 inode 的大小,而是需要重点关注 inode 总数。
inode 的总数在格式化时就给定了,
执行 “df -i” 命令即可查看每个硬盘分区对应的的 inode 总数和已经使用的inode 数量。

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

find ./ -inum 52305140 -exec rm -i {} ; —查找inode删除
find /opt -inum 34376268 -exec rm -rf {} ;
find ./ -inum 50464299 -delete —同上

inode节点耗尽故障处理
#使用fdisk创建分区/dev/sdb1,分区大小4M即可 创建一个ext4的
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkdir /test
mount /dev/sdb1 /mnt
df -i
#模拟inode节点耗尽故障
for ((i=1; i<=7680; i++));do touch /test/file$i;done touch {1…7680}.txt
df -i
df -hT
#删除文件恢复
rm -rf /test/*
df -i
df -hT

EXT 类型文件恢复
extundelete 是一个开源的 Linux 数据恢复工具,支持 ext3、ext4文件系统。(ext4只能在centos6版本恢复)
#使用fdisk创建分区/dev/sdc1,格式化ext3文件系统
fdisk /dev/sdb

partprobe /dev/sdb

mkfs.ext3 /dev/sdb1

mkdir /test

mount /dev/sdb1 /test

df -hT

#安装依赖包
yum -y install e2fsprogs-devel e2fsprogs-libs
#编译安装 extundelete
cd /test
wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
tar -jxvf extundelete-0.2.4.tar.bz2
cd extundelete-0.2.4/
yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
./configure --prefix=/usr/local/extundelete && make && make install
ln -s /usr/local/extundelete/bin/* /usr/bin/

#模拟删除并执行恢复操作
cd /test
echo a>a
echo a>b
echo a>c
echo a>d
ls
extundelete /dev/sdb1 --inode 2 #查看文件系统/dev/sdb1下存在哪些文件,
i 节点是从 2 开始的,2 代表该文件系统最开始的目录。

rm -rf a b
extundelete /dev/sdb1 --inode 2 #再次查看文件系统的存储文件
cd ~
umount /test #先解挂载
extundelete /dev/sdb1 --restore-all #恢复/dev/sdb1 文件系统下的所有内容
#在当前目录下会出现一个RECOVERED_FILES/目录,里面保存了已经恢复的文件
ls RECOVERED_FILES/

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命令查看)

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

fdisk /dev/sdb

partprobe /dev/sdb

mkfs.xfs [-f] /dev/sdb1

mkdir /data

mount /dev/sdb1 /data/

cd /data

cp /etc/passwd ./ #./就是复制到当面目录

mkdir test

touch test/a

#使用 xfsdump 命令备份整个分区
rpm -qa | grep xfsdump
yum install -y xfsdump
xfsdump -f /opt/backup /dev/sdb1 [-L backup -M sdb1] #把整个分区的文件备份到指定的文件目录

#模拟数据丢失并使用 xfsrestore 命令恢复文件
cd /data/
rm -rf ./*
ls

xfsrestore -f /opt/backup /data/

内核及系统日志由系统服务 rsyslog 统一管理,主配置文件为/etc/rsyslog.conf

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

rsyslog.conf 是 rsyslog 服务的配置文件,用于配置系统的日志记录。
该文件中包含了 rsyslog 的全局配置选项和指示 rsyslog 日志收集、处理和存储方式的规则。
在 /etc/rsyslog.conf 中可以指定将哪些日志写入哪个文件、将哪些日志转发给远程 syslog 服务器等等。
这个文件是 rsyslog 服务的核心配置文件之一,通过修改它可以控制系统的日志记录方式和行为。

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

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

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

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

#用户登录日志:
/var/log/secure:记录用户认证相关的安全事件信息。
/var/log/lastlog:记录每个用户最近的登录事件。二进制格式
/var/log/wtmp:记录每个用户登录、注销及系统启动和停机事件。二进制格式
/var/run/btmp:记录失败的、错误的登录尝试及验证事件。二进制格式

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

#MODULES //相关模块配置

Provides UDP syslog reception

#KaTeX parse error: Expected 'EOF', got '#' at position 36: …/使用UDP协议传输日志数据 #̲UDPServerRun 514 //端口为514端口

Provides TCP syslog reception

#KaTeX parse error: Expected 'EOF', got '#' at position 36: …/使用TDP协议传输日志数据 #̲InputTCPServerRun 514 //端口为514端口

GLOBAL DIRECTIVES #### //全局配置不常用省略
RULES #### //日志记录相关的规则配置

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

authpriv.* /var/log/secure
//authpriv:所有等级日志记录到/var/log/secure文件中,文件可以自定义路径和文件名
//可以使用1个@或者2@加ip的形式将日志传到其他相通的服务器上

mail.* -/var/log/maillog
//mail所有等级日志记录到-/var/log/maillog文件中,文件可以自定义路径和文件名
//可以使用1个@或者2@加ip的形式将日志传到其他相通的服务器上

cron.* /var/log/cron
//cron所有等级日志记录到/var/log/cron文件中,文件可以自定义路径和文件名
//可以使用1个@或者2@加ip的形式将日志传到其他相通的服务器上

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

设备字段说明:
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:没有优先级,不记录任何日志消息。

这个优先级由开发者自行定义,也就是你想要那部分的信息内容,可以自行添加修改。


在Linux系统中,设施(facility)是指消息源的分类。每个消息都来自于一个特定的设施,
如内核、邮件、用户等。在日志记录中,可以根据设施进行过滤,以便查看特定的设施生成的消息。

举例:
mail.info /var/log/maillog :比指定级别更高的日志级别,包括指定级别自身,
保存到/var/log/maillog中

mail.=info /var/log/maillog :明确指定日志级别为info,保存至/var/log/maillog

mail.!info /var/log/maillog :除了指定的日志级别(info)所有日志级别信息,
保存至/var/log/maillog

*.info /var/log/maillog :所有facility的info级别,保存至/var/log/maillog

mail.* /var/log/maillog :mail的所有日志级别信息,都保存至/var/log/maillog

mail.notice;news.info /var/log/maillog :mail的notice以上记得日志级别

和news的info以上的级别保存至/var/log/maillog

mail,news.crit -/var/log/maillog :mail和news的crit以上的日志级别保存/var/log/maillog中;“-”代表异步模式

异步模式和同步模式都是指程序处理数据时的方式。

异步模式下,程序会启动一个或多个线程来处理数据,主线程在处理完任务后不必等待子线程的处理结果,
可以立即返回并继续处理其他任务,子线程在处理完数据后会把处理结果返回给主线程,由主线程进行下一步操作。
异步模式可以提高程序的并发处理能力,适用于处理一些需要等待时间较长的操作,例如网络请求、I/O 操作等。

同步模式下,程序在处理完一个任务之后,必须等待处理结果返回后才能进行下一步操作。
同步模式下程序的处理是按顺序进行的,不能并发处理多个任务。同步模式适用于一些需要同步处理的任务,
例如一些计算任务、数据处理任务等。

在日志系统中,异步模式和同步模式也可以用来描述日志的处理方式。异步模式下,日志信息会先缓存到内存中,
然后再批量写入磁盘,可以提高日志处理的效率。而同步模式下,日志信息必须即时写入磁盘,
会对程序的性能产生一定影响,但可以确保日志信息的实时性和完整性。

分析工具
users、 who、w 、last、lastb
last命令用于查询成功登录到系统的用户记录
lastb命令用于查询登录失败的用户记录

users #显示当前登录系统的所有用户的用户列表。
[root@localhost opt]# users
root root

w #显示目前登入系统的用户信息
[root@localhost ~]# w
13:17:21 up 1:45, 4 users, load average: 0.13, 0.22, 0.13
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.233.1 六20 16:26m 0.60s 0.60s -bash
root pts/1 192.168.233.1 13:12 1.00s 0.05s 0.02s w
root pts/2 192.168.233.1 13:13 3:49 0.03s 0.01s -bash
dn :0 :0 13:14 ?xdm? 44.88s 0.11s /usr/libexec/gnome-session-binary

last #列出截止目前登录过系统的用户信息
[root@localhost ~]# last
dn :0 :0 Sun Feb 26 13:14 still logged in
root pts/2 192.168.233.1 Sun Feb 26 13:13 still logged in
root pts/1 192.168.233.1 Sun Feb 26 13:12 still logged in
root pts/2 192.168.233.1 Sun Feb 26 13:10 - 13:10 (00:00)
root pts/1 192.168.233.1 Sun Feb 26 11:44 - 13:12 (01:28)

lastb #查询登录失败的用户记录
[root@localhost ~]# lastb
dn :0 :0 Sun Feb 26 13:13 - 13:13 (00:00)

btmp begins Sun Feb 26 13:13:58 2023

公共日志/var/log/messages 文件的记录格式
时间标签:消息发出的日期和时间。
主机名:生成消息的计算机的名称。
子系统名称:发出消息的应用程序的名称。
消息:消息的具体内容。
Feb 26 12:50:01 localhost systemd: Started Session 11 of user root.
Feb 26 12:50:01 localhost systemd: Starting Session 11 of user root.
Feb 26 13:00:01 localhost systemd: Started Session 12 of user root.
时间标签 主机名 子系统名称 消息的具体内容

程序自己维护日志记录,httpd 网站服务程序使用两个日志文件:
access_log #记录客户访问事件
error_log #记录错误事件。

-------------实验一:将ssh服务日志单独存放------------

第一步:关闭服务端和客户端防火墙、selinux
[root@localhost logs]# setenforce 0
[root@localhost logs]# systemctl stop firewalld
[root@localhost logs]# vim /etc/rsyslog.conf
72 # Save boot messages also to boot.log
73 local7.* /var/log/boot.log
74 local6.* /var/log/ssh.log
[root@localhost logs]# vim /etc/ssh/sshd_config
30 # Logging
31 #SyslogFacility AUTH
32 #SyslogFacility AUTHPRIV #注释掉
33 SyslogFacility LOCAL6 #添加这一行,可以复制粘贴,必须要大写

重启服务
[root@localhost logs]# systemctl restart sshd
[root@localhost logs]# systemctl restart rsyslog

验证:
另一台:ssh root@192.168.233.21
在192.168.233.21上查看日志 /var/log/ssh.log

---------- 配置日志服务器来收集日志 ----------

rsyslog是一个C/S架构,可以通过套接字来进行监听记录工作,
可以基于TCP和UDP工作,默认的监听端口是514,只需要在MODULES打开即可。

发送服务器:客户端 192.168.233.10
收集服务器:服务端 192.168.233.20

//关闭服务端和客户端防火墙、selinux
setenforce 0
systemctl stop firewalld
systemctl disable firewalld

配置发送方:
//修改客户端配置文件,并启动服务
vim /etc/rsyslog.conf

MODULES

#将下面注释取消
$ModLoad imtcp
$InputTCPServerRun 514

RULES

#*.info;mail.none;authpriv.none;cron.none /var/log/messages --这一行必须注释,
注释的意义在于,否则还会向本机的/var/log/messages继续发消息

*.info;mail.none;authpriv.none;cron.none @@192.168.233.10

*.info 表示所有等级为 info 及以上的日志都会被发送,
其中 * 代表所有设施 (facility),如 auth、daemon、syslog、kern 等。

mail.none 表示邮件相关的日志不会被发送,其中 none 代表不包含指定的设施。

authpriv.none 表示安全和权限相关的日志不会被发送,
其中 authpriv 代表包括 auth 和 priv 两个设施。

cron.none 表示计划任务相关的日志不会被发送,其中 cron 代表计划任务的设施。

@@192.168.233.21 表示将符合条件的日志通过TCP协议发送到远程主机 192.168.233.21 上的 rsyslog 服务。
其中,@@ 表示强制使用tcp协议,单个 @ 表示使用udp协议。

systemctl restart rsyslog
netstat -antp | grep 514 #查看端口情况

配置接收方:
//修改服务端配置文件,并启动服务
vim /etc/rsyslog.conf
#将下面四行前的注释取消掉
$ModLoad imtcp
$InputTCPServerRun 514

systemctl restart rsyslog
netstat -antp | grep 514 #查看端口情况

logger “this is ky32”

---------- journalctl 日志管理工具 ----------

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

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

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

#查看系统本次启动的日志
journalctl -b [-0] #默认就是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
查看systemd journal中的所有错误信息,包括启动过程中的错误和系统运行期间的错误。
-x选项显示更加详细的错误信息,
-e选项跳转到日志的末尾,从而查看最新的错误信息。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值