linux文件系统和日志分析
Posted kiroct
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux文件系统和日志分析相关的知识,希望对你有一定的参考价值。
inode和block概述一:
1、文件数据包括源信息与实际数据
文件存储在硬盘上,硬盘最小存储单位是“扇区。每个扇区存储512字节”
block (块):
连续的八个扇区组成一个block(4k)
!是文件存取的最小单位,扇区是最小的存储单位
2、inode:
(索引节点,也叫i节点)
用于存储文件元信息
备注:一个文件必须占用一个inode,但是至少占用一个block(就是说只能同时拥有一个inode号,可以拥有多个block)
3、目录文件的结构:
目录也是一种文件,此外目录文件的结构如下图所示
4、重点:
每个文件都有一个inode号码,操作系统使用inode号码来识别不同的文件
linux系统内部不使用文件名,而是使用inode号进行识别文件
对于用户,文件名只是inode号码便于识别的别称
inode和block概述二:
文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区,每个扇区存储512字节
一般连续八个扇区组成一个块,一块是4k大小,是文件存取的最小单位,操作系统读取硬盘时候,是一次性连续读取多个扇区,就是一个块一个块地读取的。
文件数据包括实际数据与元信息,文件数据存储在“块中,存储文件元信息的区域叫做inode。因此,一个文件必须占用一个inode,并且至少占用一个block
inode不包含文件名,文件名是存放在目录当中的,linux系统中一切皆为文件,因此目录也是一种文件
每个inode都有一个号码,操作系统用inode号来识别不同的文件,linux系统内部不使用文件名去识别文件的(是使用inode号码去识别文件的,每一个inode号码一一对应一个文件名)。
所以,当用户在linux系统中试图访问一个文件,系统会先根据文件名去查找它对应的inode号码,通过inode号码,获取inode信息。根据inode信息,查看该用户是否具有访问该文件的权限,如果有就指向相应的数据block,并且读取数据。如果没有就拒绝
inode包含的元信息
文件的字节数
文件拥有者的USER ID
文件的GROUP ID
文件的读、写、执行权限
文件时间戳
用stat命令可以查看某个文件的inode信息
比如: stat 123.txt ;查看123.txt文件的inode号
实操:使用stat命令
备注:
1、以上两图是一份英文语言一份是中文语言对照
2、change time (ctime):最后一次改变文件或者目录属性的时间
3、access time (atime):最后一次访问文件或者目录的时间
4、modify time(mtime): 最后一次修改文件或者目录内容的时间
inode号码
用户通过文件名打开文件时,系统内部的过程
1、系统找到这个文件名对应的inode号码
2、通过inode号码,获取inode信息
3、根据inode信息,找到文件数据所在的block,并读出数据
查看inode号码的方法:
1、ls -i命令:查看文件对应的inode号码
ls -i 文件名
2、stat命令:查看文件inode信息中的inode号码
stat 文件名
inode的大小
inode也会消耗磁盘空间
每个inode的大小一般为128字节或者256字节
格式化文件系统时确定inode的总数
使用df -i命令可以查看每个硬盘分区的inode总数与已经使用的数量
补充:
1、inode也会消耗硬盘空间,所以格式化的时候,操作系统会自动将硬盘分成两个区域,一个是数据区域,存放文件数据;另一个是inode区域,存放inode包含的信息。,每个inode的大小,一般是128字节或者256个字节。
通常情况下不需要关注单个inode的大小,而是需要重点关注inode的总数,inode的总字节在格式化的时候就给定了,执行“df -i”命令即可查看每个硬盘分区对应的inode总数和已经使用的inode数量。
2、由于inode号码与文件名称分离,导致linux系统具备以下几特有的现象
a、文件名包含特殊字符,可能无法正常删除,这时候直接删除inode,能起到删除文件的作用
b、移动文件或者重命名文件,只是改变文件名字,不影响inode号
c、开打一个文件后,系统以inode号来识别这个文件,且不再考虑文件名
4、文件数据被保存修改后,会生成一个新的inode号
删除inode号的两种方式
find ./ -inum (inode号) -exec rm -i {} \\;
find ./ -inum (inode号) -delete
inode号的特殊作用
由于inode号码与文件名分离,导致一些linux系统具有以下的现象:
1、当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
2、移动或者重命名文件时,只改变文件名,不影响inode号码
3、打开一个文件后,系统通过inode号码来识别文件,不再考虑文件名
4、使用vi编辑器修改文件数据保存后,会生成一个新的inode号码。但是,如果使用ehco进行“>”的追加内容。则不会变更inode号。
小结
1、硬盘分区后的结构
注意:元信息和数据为文件数据的组成
2、linux系统中系统访问文件的过程
链接文件
为文件或者目录建立链接文件
链接文件的分类(下图所示)
链接文件的命令:
1、硬链接
ln 源文件 目标位置; 用的很少
2、软连接!
ln -s 源文件 目标位置; 实际工作环境经常使用!
实验:inode号节点耗尽故障处理
使用fdisk创建分区sdb1,大小30M即可
fdisk /dev/sdb1
mkfs -t ext4 /dev/sdb1
mkdir /test
mount /dev/sdb1 /test
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
实验操作:
注备:实验结束后,如果不是虚拟机的话,直接rm -rf /test/*全部删除就行
实验:EXT类型文件恢复
extundelete是一个开源的linux数据恢复工具,支持ext3、ext4文件系统。(备注:ext4只能运行在centos6版本恢复)
步骤:
1、使用fdisk创建分区/dev/sdc1,格式化成ext3系统文件
fdisk /dev/sdc
partprobe /dev/sdc ;此项命令是可以不重启系统,直接添加磁盘
mkfs -t ext3 /dev/sdc1
mkdir /test
mount /dev/sdc1 /test
df -h
2、安装依赖包
yum install -y e2fsprogs-devel e2fsprogs-libs
接着编译安装extundelete(网上先自己下压缩包)
3、进行模拟删除并恢复的操作
cd /test
echo a>a
echo a>b
echo a>c
echo a>d
ls
extundelete /dev/sdc1 --inode 2 ;查看文件系统/dev/sdc1下存放在哪些文件,此外i节点从2开始的,2代表该文件系统最开始的目录
rm -rf a b
extundelete /dev/sdc1 --inode 2
cd ~
umount /test
extundelete /dev/sdc1 --restore-all ;恢复/dev/sdc1文件系统下的所有内容
#最后:在当前目录下会出现一个RECOVERED_FILES/目录,里面保存了已经恢复的文件
ls RECOVERED_FILES/ ;查看里面的目录
操作:如上图步骤所示 (注意:自己先网上下载好extundelete-0.2.4.tar.bz2
后再进行试验)
实验:恢复XFS类型的文件
Centos 7系统默认采用xfs类型文件,xfs类型的文件可以使用xfsdump、xfsdump工具进行备份恢复。
1、xfsdump命令格式
xfsdump -f 备份存放位置 要备份的路径或者设备文件
xfsdump的备份等级(默认为0)
0 : 完全备份
1-9 :增量备份
xfsdump常用选项:
-f:指定备份文件目录
-L:指定标签session label
-M:指定设备标签 media label
-s:备份单个文件,- s 后面不能直接跟路径
xfsdump的使用限制:
a、只能备份已挂载的文件系统
b、必须使用root的权限才能操作
c、只能备份XFS文件系统
d、备份后的数据只能给xfsrestore解析
e、不能备份两个具有相同UUID的文件系统
2、xfsrestore命令格式
xfsrestore -f 恢复文件位置 存放恢复后文件的位置
操作:
1、使用fdisk创建分区 /dev/sdb1,并格式化成xfs文件系统。最后挂载mount /dev/sdb1 /data/
cd /data
cp /etc/passwd ./
mkdir test
touch abc.txt /test
2、使用xfsdump备份整个分区
rpm -qa | grep xfsdump
yum install -y xfsdump
xfsdump -f /opt/dump_sdb1 /dev/sdb1 [-L dump_sdb1 -M sdb1]
3、模拟数据丢失并使用xfsrestore
cd /data/
rm -rf /data/*
ls ;此时发现数据全部消失
xfsrestore -f /opt_sdb1 /data/ ;对data目录进行数据恢复
日志文件
日志的功能:
用于记录系统、程序运行中发生的各种事件
通过阅读日志,有助于诊断和解决系统故障
日志文件的分类
内核及系统日志
由系统服务rsyslog统一进行管理,日志格式基本相似
主配置文件/etc/rsyslog.conf
用户日志
记录系统用户登录与退出系统的相关信息
程序日志
由各种应用程序独立管理的日志文件,记录格式不统一
如何去书写日志
日志保存的位置
默认位于:/var/log ;系统或者用户日志
主要日志内容介绍
补充:系统服务rsyslog的安装包与主程序
常见的一些日志
1、内核与公共消息日志(排障用)
/var/log/messages: 记录linux内核消息的各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或者服务,一般都可以从该日志中获得相关的日志记录信息
2、极化任务日志
/var/log/cron :记录crond极化任务产生的时间信息
3、系统引导日志
/var/log/dmesg :记录linux系统在引导过程中的各种事件信息
4、邮件登录日志
/var/log/maillog : 记录进入或者发出系统电子邮箱活动
5、用户登录日志
/var/log/secure :记录用户认证相关的安全事件信息
/var/log/lastlog :记录每个用户最近的登录事件(采用二进制,需要相关转码工具)
/var/log/wtmp :记录每个用户登录、注销与系统启动和停机事件(采用二进制,需要相关转码工具)
/var/run/btmp :记录失败的、错误的登录尝试以及验证事件、二进制格式
vim /etc/rsyslog.conf ;查看rsyslog.conf配置文件
之后开打后如下图所示{设备.级别
动作}
设备字段的说明:
auth:用户认证时产生的日志
authpriv:ssh、ftp等登录信息的验证日志
daemon:一些守护进程产生的日志
ftp:FTP产生的日志
lpr:打印相关活动
mark:rsyslog内部服务的信息,事件标识
news:网络新闻传输协议(nntp)产生的消息
syslog:系统日志
uucp:两个unix之间的相关通讯
console:针对系统控制台的消息
cron:系统执行定时任务产生的日志
kern:系统内核日志
local0~local7:自定义程序使用
mail:邮件日志
user:用户进程
linxu系统内核消息的优先级别
0 EMERG(紧急) 如系统崩溃
1 ALERT(警告) 如数据库被破坏
2 CRIT (严重) 如硬盘错误
3 ERR (错误) 不是非常紧急的
4 WARNING (提醒) 需要提醒用户的主要事件
5 NOTICE (注意) 需要注意的事件,无需处理
6 INFO (信息) 一般信息
7 DEBUG (调试) 调试程序时使用
none 没有优先级,不记录任何消息
日志的一般格式
公共日志 /var/log/messages文件的记录格式
事件标签:消息发出的日期和时间
主机名:生成消息的计算机名称
子系统名称:发出消息的应用程序
消息:消息的具体内容
此外:程序自己维护日志记录,httpd网站服务程序使用两个日志文件:
access_log ;记录客户访问时间
erro_log ;记录错误事件
用户日志分析
保存了用户登录、退出系统等相关信息
/var/log/lastlog;最近的用户登录事件
/var/log/wtmp;用户登录、注销与开关机的事件
/var/run/utmp:当前挡路的每一个用户的详细信息
/var/log/secure;与用户验证相关的安全事件
分析工具
users 、who、w、last、lastb
last命令用于查询成功登录系统的用户记录
lastb命令用于查询登录失败的用户记录
由相应的应用程序独立进行管理
awk、sed、vim 是三大主要使用的工具
日志管理策略
及时做好备份与归档
a、命令/脚本+crontab
b、rsyslog
c、ELK/EFK
延长日志保存期限
控制日志访问权限:各类敏感信息如账户、口令等
集中管理日志:
1、将服务器的日志统一发送到日志文件服务器
2、便于日志信息的统一收集、整理和分析
3、杜绝日志信息的意外丢失、恶意篡改与删除
实验:配置日志服务器
rsyslog是一个C/S架构,可以通过套接字来进行监听记录工作。可以基于TCP和UDP工作。默认的监听端口时514,只需要在MODULES打开即可
发送服务器:客户端 192.168.206.20
收集服务器:192.168.206.30
步骤:
1、先关闭服务端和客户端防火墙、selinux
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
2、修改客户端配置文件,并启动服务
vim /etc/rsyslog.conf
进入文本后将下面四行的注释取消掉
接着添加以下内容
$template myFormat, "%timestamp% %hostname% %syslogseverity-text% %syslogtag% %msg%\\n"
$ActionFileDefaultTemplate myFormat
*.info;mail.none;authpriv.none;cron.none @@192.168.80.30:514
#%timestamp% :时间戳
#%fromhost-ip告 : 接收的信息来自于哪个节点的IP
#hostname号: 主机名
#%syslogseverity-text% : 日志等级
#%syslogtag% :服务进程br/>#%msg%:日志内容
#接收方IP前面一个@表示TCP传输,两个@表示UDP传输
systemcrl restart rsyslog
修改服务端配置文件,并启动服务
vim /etc/rsyslog.conf
#将下面四行前的注释取消掉
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
#添加以下内容
$AllowedSender tcp, 192.168. 80.0/24 #允许192.168.80.0网段内的主机以tcp协议来传输
$template Remote,"/data/1og/%romhost-ip%/&fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY8.1og"
#定义模板,接受日志文件路径,区分了不同主机的日志
:fromhost-ip, !isequal, "127.0.0.1" ?Remote #过滤掉server 本机的日志
systemcrl restart rsyslog
//在服务端创建/data/log目录,以接受大量日志信息,配置文件中的路径应当与该路径一致
mkdir -p /data/log
//验证
客户端的终端命令输入或者重启一个服务
logger "hello world"
在服务端查看日志文件
tree /data/log/
(如果是最小化安装,请使用yum本地安装tree)
Centos7 专有日志管理工具
1、查看内核日志(不显示应用日志)
journalctl -k
2、查看系统本次启动的日志
journalctl -b [-0] ;"0"指上上次启动的日志
3、查看上一次启动的日志
journalctl -b -1
4、显示尾部指定行数的日志
journalctl -n 20 [-f]
备注:查看的是/var/log/messages的日志。但是格式上有所调整。如主机名格式不一样而已
5、!查看某个服务的日志
journalctl -u httpd.service [-f]
6、查看指定进程的日志
journalctl _PID=1 ;此处的是查看init进程(详情见我的开机引导那篇)
7、查看指定用户的日志
journalctl _UID=0 --since today ;查今天的root用户的日志,用户UDP=0的就是root用户
或者
journalctl -xe
-x :是目录的意思,在报错的信息下会附加解决问题的网址
-e:(pager-end)从末尾开始看
8、!查看所有日志(默认情况下,只保留本次启动的日志)
journalctl
journalctl -r :r表示倒叙
以上是关于linux文件系统和日志分析的主要内容,如果未能解决你的问题,请参考以下文章