一、深入理解LINUX文件系统

inode 与 block

inode 与 block 概述

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

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

block (块)

连续的八个扇区组成一个block(4K)

是文件存取的最小单位 (一个文件必须占用一个inode, 并且至少占用一个block)

inode (索引节点)

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

用于存储文件元信息

Linux文件系统与日志文件_日志管理工具

小结概述:

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

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

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

inode不包含文件名。文件名是存放在目录当中的。Linux系统中一切皆文件,因此目录也是一种文件。

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux 系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。

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


inode

inode包含文件的元信息 (不包含文件名)

●文件的字节数

●文件拥有者的User ID

●文件的Group ID

●文件的读、写、执行权限

●文件的时间戳


查看文件名对应的inode号码有两种方式

ls -i文件名

stat 文件名

Linux文件系统与日志文件_inode_02

atime (accesstime) :最近访问

当使用这个文件的时候就会更新这个时间。

mtime (modification time) :最近更改

当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不 会改变,这就是和ctime的区别。

ctime (status time):最近改动

当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time, 更像是change time,

只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间。


inode的内容:

目录文件的结构

     目录也是一种文件

     目录文件的结构

每个inode都有一个号码,操作系统用inode号码来识别不同的文件

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

对于用户,文件名只是inode号码便于识别的别称;


inode的号码:

用户通过文件名打开文件时,系统内部的过程

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

2.通过inode号码, 获取inode信息

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

Linux文件系统与日志文件_日志服务器收集日志_03


查看inode号码的方法

●ls -i命令:查看文件名对应的inode号码

ls -i aa.txt

●stat命令:查看文件inode信息中的inode号码

stat aa.txt

Linux文件系统与日志文件_日志服务器收集日志_04


inode 的大小:

inode也会消耗硬盘空间

     每个inode的大小

     一般是128字节或256字节

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

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


小结概述:

inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据:另一个是inode

区,存放inode 所包含的信息。每个inode 的大小,一般是128字节或256字节。

通常情况下不需要关注单个inode 的大小,而是需要重点关注inode 总数。inode 的总数在格式化时就给定了,执行“df -i”

命令即可查看每个硬盘分区对应的的inode总数和已经使用的inode数量。


inode的特殊作用

由于inode 号码与文件名分离,导致Linux系统具备以下几种特有的现象:

1.文件名包含特殊字符,可能无法正常删除。这时直接删除inode,能够起到删除文件的作用;

2.移动文件或重命名文件,只是改变文件名,不影响inode号码:

3.打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。

4.使用vi 编辑器对文件数据进行修改保存后,会生成一个新的inode号码。


通过inode 号删除文件命令

find ./ -inum 52305140 -exec rm -i {} \;

find ./ -inum 50464299 -delete

Linux文件系统与日志文件_日志管理工具_05




案例1:inode号节点故障实验

#使用fdisk创建分区/dev/sdc1, 分区大小30M即可

fdisk /dev/sdc

mkfs.ext4 /dev/ sdc1

mkdir /qqqqq

mount /dev/sdc1 /qqqqq

Linux文件系统与日志文件_文件系统_06

df-i

#模拟inode节点耗尽故障

for ((i=1; i<=7680; i++));do touch /test/file$i; done 或 touch {1. .7680}.txt

df -i

df -hT

Linux文件系统与日志文件_inode_07


Linux文件系统与日志文件_inode_08


#删除文件恢复

rm -rf /test/*

df-i

df -hT

Linux文件系统与日志文件_日志服务器收集日志_09


案例2:恢复EXT类型文件

extundelete是一个开源的Linux数据恢复工具,支持ext3、ext4文件系统。(ext4只能在centos6版本恢复)

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

fdisk /dev/sdc

partprobe /dev/sdc

mkfs -t ext3 /dev/sdc1

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

mkdir /test

mount /dev/sdc1/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

Linux文件系统与日志文件_日志服务器收集日志_11

tar jxvf extundelete-0.2.4.tar.bz2

Linux文件系统与日志文件_日志服务器收集日志_12

cd extundelete-0.2.4/

./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/sdcl --inode 2 查看文件系统/dev/sdc1下存在哪些文件,i节点是从2开始的,

2代表该文件系统最开始的目录。

Linux文件系统与日志文件_inode_13

rm -rf a b

extundelete /dev/sdc1 --inode 2

Linux文件系统与日志文件_inode_14

cd ~

umount /test

extundelete /dev/sdc1 --restore-allt恢复/dev/sdc1 文件系统下的所有内容

在当前目录下会出现一个RECOVERED_FILES目录,里面保存了己经恢复的文件

ls RECOVERED_FILES/

Linux文件系统与日志文件_日志管理工具_15


案例3:XFS类型文件恢复

步骤:

Centos 7系统默认采用xfs类型的文件,xfs类型的文件可使用xfsdump 与xfsrestore 工具进行备份恢复。

xfsdump 的备份级别有两种: 0表示完全备份; 1-9表示增量备份。xfsdump 的备份级别默认为0。


1、xfsdump 的命令格式为:

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


xfsdump 命令常用的选项:

-f: 指定备份文件目录,

-L: 指定标签session label

-M: 指定设备标签media label

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


xf sdump使用限制:

1.只能备份已挂载的文件系统

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

3.只能备份XFS文件系统

4.备份后的数据只能让xfsrestore解析

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


xfsrestore命令格式

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


模拟删除并执行恢复操作


实操案例3:

#使用disk创建分区/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/dump_ sdb1 /dev/sdb1 [-L dump_sdb1 -M sdb1]

Linux文件系统与日志文件_日志管理工具_16


Linux文件系统与日志文件_日志管理工具_17


#模拟数据丢失并使用xfsrestore 命令恢复文件

cd /data/

rm -rf ./*

ls

Linux文件系统与日志文件_日志文件_18

xfsrestore -f /opt/dump_sdb1 /data/    回到备份目录然后使用命令把备份文件恢复到/data2目录中

Linux文件系统与日志文件_日志服务器收集日志_19



二、日志文件

日志的功能

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

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


日志文件的分类

内核及系统日志

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

主配置文件/etc/rsyslog.conf

用户日志

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

程序日志

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


日志保存位置

默认位于: var/log目录下


主要日志文件介绍

内核及公共消息日志

/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: 记录失败的、错误的登录尝试及验证事件。二进制格式



内核及系统日志

由系统服务rsyslog统一管理

软件包: rsyslog-7 .4.7-16.el7.x86_ 64

主要程序: /sbin/rsyslogd

配置文件: /etc/rsyslog.conf


vim /etc/ rsyslog. conf

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

示例:*.info;mail.none;   authpriv.none;  cron.none

/var/log/ messages


*.info #表示info等级及以上的所有等级的信息都写到对应的日志文件里

mail. none #表示某事件的信息不写到日志文件里(这里比如是邮件)


设备字段说明:


auth

用户认证时产生的日志

authpriv

ssh、ftp等登录信息的验证信息

daemon

一些守护进程产生的日志

ftp

FTP产生的日志

lpr

打印相关活动

mark

rsyslog服务内部的信息,时间标识.

news

网络新闻传输协议(nntp)产生的消息。

syslog

系统日志

uucp

Unix-to-Unix Copy 两个unix之间的相关通信

console

针对系统控制台的消息。

cron

系统执行定时任务产生的日志。

kern

系统内核日志

local 0~local 7

自定义程序使用

mail

邮件日志

user

用户日志


Linux系统内核日志消息的优先级别(数字等级越小,优先级越高,消息越重要) :

0   EMERG(紧急):会导致主机系统不可用的情况。如系统崩溃

1   ALERT(警告):必须马.上采取措施解决的问题。如数据库被破坏

2   CRIT(严重):比较严重的情况。如硬盘错误,可能会阻碍程序的部分功能

3   ERR (错误) :运行出现错误。不是非常紧急,尽快修复的.

4   WARNING (提醒) :可能影响系统功能,需要提醒用户的重要事件。不是错误,如磁盘用了85%等

5   NOTICE(注意):不会影响正常功能,但是需要注意的事件。无需处理

6   INFO(信息):一般信息。正常的系统信息

7   DEBUG(调试):程序或系统调试信息等。包含详细开发的信息,调试程序时使用

     none:没有优先级,不记录任何日志消息。


示例:

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

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

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

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

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

mail.notice;news.info /var/1og/maillog : mai1的notice以上记得日志级别和news的info以上的级别保存至/var/log/maillog

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


日志记录的一般格式

时间标签: 消息发出的日期和时间

主机名: 生成消息的计算机的名称

子系统名称: 发出消息的应用程序的名称

消息: 消息的具体内容

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


用户日志分析

分析工具

●users、who、 w、last、lastb

●last命令用于查询成功登录到系统的用户记录

●lastb命令用于查询登录失败的用户记录


程序日志分析

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

Web服务: /var/log/httpd/

   access_log //记录客户访问事件

    error_log //记录错误事件

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

    access.log、cache.log


分析工具

●文本查看、grep过滤检索、Webmin管理套件中查看

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

●Webalizer、Awstats等专用日志分析工具


日志管理策略

及时作好备份和归档 (日志收集方式:命令/脚本、rsyslog、ELK/EFK、)

延长日志保存期限

控制日志访问权限

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

集中管理日志

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

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

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



扩展知识:

配置日志服务器收集日志

rsyslog是一个C/S架构,可以通过套接字来进行监听记录工作,

可以基于TCP和UDP工作,默认的监听端口是514,只需要在MODULES打开即可。


发送服务器:客户端192.168.80.20

收集服务器:服务端192.168.80.30


//关闭服务端和客户端防火墙、selinux

setenforce 0

systemctl stop firewalld

systemctl disable firewalld


//修改客户端配置文件,并启动服务

vim /etc/rsyslog.conf

#### MODULES ####

#将下面四行前的注释取消掉

$ModLoad imudp

$UDPServerRun 514

$ModLoad imtcp

$InputTCPServerRun 514


#### RULES ####

#添加下列内容

$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%:服务进程

#%msg% :日志内容

#接收方 IP 前而一个@表示TCP传输,两个@表示UDP传输


systemctl 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/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"

#定义模板,接受日志文件路径,区分了不同主机的日志

:fromhost-ip, !isequal,"127.0.0.1" ?Remote #过滤掉server本机的日志


mkdir -p /data/log

systemctl restart rsyslog




journalctl 日志管理工具

日志管理工具journalct1是centos7上专有的日志管理工具,该工具是从message这 个文件里读取信息。

Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。

日志的配置文件是/etc/systemd/ journald. conf


#查看所有日志(默认情况下,只保存本次启动的日志)

journalctl

journalctl -r #-r表示倒序,从尾部看(推荐)


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

journalctl -k


#查看系统本次启动的日志

journalctl -b [-0]


#查看上一次启动的日志(需更改设置,如上次系统崩溃,需要查看日志时,就要看上一次的启动日志)

journalctl -b -1


#显示尾部指定行数的日志

查看的是/var/log/messages的日志,但是格式上有所调整,如主机名格式不一样而已

journalctl -n 20 [-f]


#查看某个服务的日志

journalctl -u nginx.service [-f]跟踪


#查看指定进程的日志

journalctl_PID=1


#查看指定用户的日志

journalctl_UID=0 --since today


journalctl -xe

#-x 是目录(catalog)的意思,在报错的信息下会,附加解决问题的网址

#-e pager-end从末尾开始看