一.inode与block

1.1 block块

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

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

文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在“块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode。 因此,一个文件必须占用一个inode,并且至少占用一个block。inode不包含文件名。文件名是存放在目录当中的。Linux 系统中一切皆文件,因此目录也是一种文件。

1.2 inode号

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

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

1.2.1 查看文件名对应的inode 号码

两种方式

ls -i文件名

stat 文件名

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

1.2.2 查看每个硬盘分区对应的inode总数

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

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定了,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘12.8%

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

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

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

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

4.文件数据被修改保存后,会生成一个新的inode 号码。

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

find ./ -inum 50464299 -delete

扩展

inode节点耗尽故障处理

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

fdisk /dev/sdb

mkfs.ext3 /dev/sdb1

mkdir /opt/test

mount /dev/sdb1 /opt/test

df -i

还可用inode号7669

#模拟inode节点耗尽故障

for ((i=1; i<=8000; i++)) ;do touch /opt/test/file$i;done       或 i=i+1 或i+=1

touch 1

df -i

df -hT

容量空间可用27M,然而创建不了文档

#删除文件恢复

rm -rf /opt/test/*

df -i

df -hT

二.恢复误删除的文件

2.1 EXT类型文件恢复

恢复误删除的文件ext3

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

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

fdisk /dev/sdb

partprobe /dev/sdb 

#当你运行 partprobe /dev/sdb 时,你实际上是在告诉系统重新读取 /dev/sdb 这个磁盘的分区表。(重启也行)

mkfs.ext3 /dev/sdb1

mkdir /opt/test

mount /dev/sdb1 /opt/test

df -hT

#安装依赖包

yum -y install e2fsprogs-devel e2fsprogs-libs gcc gcc-c++

#编译安装extundelete

cd /opt/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/

./configure --prefix=/usr/1ocal/extundelete && make && make install 或

./configure && make && make install

ln -s /usr/local/extundelete/bin/* /usr/bin/

#模拟删除并执行恢复操作

cd /opt/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/

2.2 xfs类型文件备份和恢复

恢复误删除的文件XFS

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

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

xfsdump的命令格式为:

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

xfsdump命令常用的选项:

-f: 指定备份文件目录

-L: 指定标签session label

-M: 指定设备标签media labe........ 。

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

xfsdump使用限制:

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

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

3.只能备份XFS文件系统

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

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

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

fdisk /dev/sdb 或 partprobe /dev/sdb

mkfs.xfs /dev/sdb2                                     #    mkfs.xfs [-f] /dev/sdb2

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_sdb2 /dev/sdb2 [-L dump_sdb2 -M sdb2]

xfsdump -f /opt/dump_sdb2 /dev/sdb2 -L dump_sdb2 -M sdb2

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

cd /opt/data/

rm -rf ./*

ls

xfsrestore -f /opt/dump_sdb2 /opt/data/

增量备份

xfsdump -l 1 -f /opt/dump_sdb2_level_1 /dev/sdb2 -L dump_sdb2_level_1 -M sdb2

XFSdump的增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或修改的文件。

三.分析日志文件

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

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

3.1常见的一些日志文件

3.1.1 内核及公共消息日志

/var/log/messages: 记录Linux内核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等。

对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。

3.1.2 计划任务日志

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

3.1.3 系统引导日志:

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

3.1.4 邮件系统日志:

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

3.1.5 用户登录日志

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

/var/log/lastlog: 记录每个用户最近的登录事件。二进制格式

/var/1og/wtmp: 记录每个用户登录、注销及系统启动和停机事件。二进制格式

/var/run/btmp: 记录失败的、错误的登录尝试及验证事件。二进制格式

vim /etc/rsyslog.conf   #查看rsyslog.conf配置文件

*.info;mail.none;authpriv.none;cron.none                  /var/1og/messages

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

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

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

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

1  ALERT(警告):必须马上采取措施解决的问题。

2  CRIT(严重):比较严重的情况。

3  ERR (错误) :运行出现错误。

4  WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。

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

6  INFO(信息):一般信息。

7  DEBUG(调试):程序或系统调试信息等。

公共日志/var/log/messages文件的记录格式

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

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

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

消息:消息的具体内容。

程序自己维护日志记录,httpd 网站服务程序使用两个日志文件:

access_log :  #记录客户访问事件

error_log  #记录错误事件。

3.2 详细日志分析命令

users:命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数

who:命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用户名、终端类型、登录日期及远程主机

w:命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的输出内容要丰富一些

last:命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。通过last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前主机可能已被入侵

lastb:命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息

有哪些系统常见日志

/var/log/messages    //系统主日志文件

[root@localhost ~]# cat /var/log/messages | wc -l

3784

tail -f或者tailf或tail -100查看

时间,主机名,服务,具体信息

/var/log/dmesg    //开机后的内核自检信息,dmesg命令看的是一样的

/var/log/secure   //涉及到登陆,验证之类的都会记录比如su

用户日志采用二进制格式,但可以用命令查看,避免认为修改内容,保证日志的有效性

/var/log/wtmp(last)

/var/log/btmp(lastb)

/var/log/lastlog(lastlog)所有账号的登录信息

还有一些服务的日志比如

/var/log/yum.log

/var/log/cron

也并不是所有安装的程序的日志都会在/var/log下,只有rpm包安装的才会,源码装的在自己指定的目录中

例如httpd,源码安装的日志目录在/usr/local/httpd/logs/

四.journalctl工具

journalctl工具是CentOS-7才有的工具

Systemd 统一管理所有 Unit 的启动日志。带来的好处就是 ,可以只用journalctl一个命令,查看所有日志(内核日志和 应用日志)。日志的配置文件/etc/systemd/journald.conf

ps -ef | grep journald

journalctl -b    //查看本次启动的日志

journalctl -k     //查看内核日志

[root@localhost log]# journalctl | wc -l     //查看系统总共的日志

2787

journalctl -xe  经常用来查看最近报错的日志

-e:从结尾开始看

-x:提供问题相关的网址

注:日志工具可研究:Webmin、 Webalizer、Awstats等专用日志分析工具

五.日志文件的分析方法

熟悉了系统中的主要日志文件以后,下面将介绍针对日志文件的分析方法。分析日志文   件的目的在于通过浏览日志查找关键信息、对系统服务进行调试,以及判断发生故障的原因等。本小节主要介绍三类日志文件的基本格式和分析方法。

对于大多数文本格式的日志文件(如内核及系统日志、大多数的程序日志),只要使用 tail、more、less、cat等文本处理工具就可以查看日志内容。而对于一些二进制格式的日志文件(如用户日志),则需要使用特定的查询命令。

1.内核及系统日志

内核及系统日志功能主要由默认安装的 rsyslog-7.4.7-16.el7.x86_64.rpm 软件包提供。rsyslog 服务所使用的配置文件为/etc/rsyslog.conf。通过查看/etc/rsyslog.conf 文件中的内容,可以了解到系统默认的日志设置

grep -v "^$" /etc/rsyslog.conf   //过滤掉空行

2.日志消息的等级

0-7

rsyslog服务

ps -ef | grep rsyslogd       //查看服务是否开启

vim /etc/rsyslog.conf     //rsyslog服务配置文件

mail.*   代表比*等级高的都记录,*代表任何,也就是说任何日志都记录

.none 代表不记录日志

日志存放位置为*:所有日志高于疼痛这个等级就会对所有在线用户广播

.=代表只记录=后面级别的日志

.!代表除了!后面级别的日志不记录其他的都记录

存放路径之前有“-”代表先放入缓存足够大之后再存放在路径

也可以自定义日志

vim /etc/rsyslog.conf

加入一行内容

*.info   /var/log/info.log

systemctl restart rsyslog    //重启服务之后/var/log下面就生成了info.log了

六.日志文件放入日志文件服务器

rpm -ql rsyslog   #查看模块

1.服务端配置

[root@localhost ~]#vim /etc/rsyslog.conf

编辑文件取消第19 20 行注释允许服务器使用TCP 514端口接收日志 ;

19 $ModLoad imtcp

20 $InputTCPServerRun 514

[root@localhost ~]#netstat -ntap |grep 514

查看514端口是否开启

[root@localhost ~]# systemctl restart  rsyslog

重启rsyslog日志服务

2.客户端配置

[root@www1 ~]# vim /etc/rsyslog.conf

修改日志服务配置文件

90     *.*    @@192.168.126.131:514

行数   所有 TCP     服务端IP  端口

#把所有日志采用TCP协议发送到192.168.10.13的514端口上 ;

#两个@ 代表使用  tcp  一个代表udp

[root@localhost ~]# systemctl restart  rsyslog

重启rsyslog日志服务

3.测试方法

1、测试客户机上新建用户

[root@localhost ~]# useradd  liqi

#服务器端查看

[root@localhost ~]# vim /var/log/secure

2、测试客户机上写日志进去

[root@localhost ~]#logger "this is test log from 192.168.126.131"   

#服务器端查看

[root@localhost ~]# vim /var/log/messages

七.日志轮替logrotate

日志轮替(log rotate)在IT行业中,特别是在系统管理中,指的是一个自动化的归档过期日志文件的过程。当服务器上运行的大型软件(如LAMP等)产生大量的日志时,日志轮替提供了一个有效的方法来限制日志文件的大小,同时保留近期的日志用于分析。

logrotate可以对单个日志文件或者某个目录下的文件按时间、大小进行切割、压缩操作,指定日志保存数量,还可以在切割之后运行自定义命令。它通常基于crontab运行,按照计划的频率(通常是每天)执行,以节省空间和方便整理。

rpm/yum和源码都可以使用,rpm/yum直接轮替,不需要额外设置,根据配置文件的设置执行

/etc/logrotate.conf

dateext参数

weekly 每周一次轮替daily每日,monthly每月

轮替4次

create    新建新日志

dateext     按日期改名,否则会自动改名为file.1、file.2等等

minsize     一定达到这个值才轮替,否则就算时间到了也不轮替

size    只有到达这个值才轮替,跟时间无关

其他日志比如yum都放在include路径里了

把自己的日志加入轮替

1、编辑配置文件/etc/logrotate.conf(管理不方便)

2、编辑成文件放到/etc/logrotate.d目录下

vim /etc/logrotate.conf

/var/log/mine.log {

    weekly

    rotate 5

    create

}

logrotate -fv /etc/logrotate.conf     //强制执行轮替,但是目录下的都会轮替,-v查看

  • -d, --debug: 进入调试模式,显示将会做什么但不真正执行日志轮替。
  • -f, --force: 强制轮替日志文件,即使它们没有超过大小限制或时间限制。
  • -m, --mail command: 发送邮件给指定的命令,而不是默认的 mail 命令。通常用于发送日志文件的副本给管理员。
  • -s, --state statefile: 使用指定的状态文件而不是默认的状态文件(通常是 /var/lib/logrotate/status)。
  • -v, --verbose: 显示详细的输出信息。
  • -l, --log STRING: 写入日志信息到指定的文件或标准错误(stderr)之外的地方。
  • --version: 显示 logrotate 的版本信息。
  • -?, --help: 显示帮助信息并退出。
  • --usage: 显示简短的用法信息并退出。

改过配置文件之后必须先把服务重启再把lograte重启

  1. Allocating hash table for state file, size 15360 B
    这表示 logrotate 正在为一个状态文件(通常是用于跟踪哪些日志文件已经被轮替过的)分配一个哈希表,并指定了其大小为15360字节。状态文件通常包含了关于哪些日志文件已经被处理过(即轮替或压缩)的信息。

  2. Handling 1 logs
    这告诉你有1个日志文件正在被 logrotate 处理。

  3. rotating pattern: /var/log/zabbix/zabbix_agent2.log weekly (12 rotations)
    这定义了轮替的模式。具体来说,/var/log/zabbix/zabbix_agent2.log 这个日志文件将被每周轮替一次,并且会保留最近的12个备份文件。

  4. empty log files are not rotated, old logs are removed
    这表示如果日志文件是空的,它不会被轮替。另外,旧的日志文件(超过12个备份的)会被删除。

  5. considering log /var/log/zabbix/zabbix_agent2.log
    logrotate 正在考虑是否需要轮替 /var/log/zabbix/zabbix_agent2.log 这个日志文件。

  6. log does not need rotating (log has been already rotated)
    这表示 logrotate 已经确定该日志文件不需要被轮替,因为它已经被轮替过了(可能是在最近的一次 logrotate 执行中)。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部