进阶学习——深入理解Linux文件系统与日志分析
目录
2.2.4anaconda——日志操作系统安装时安装的软件信息
?
日志记录的内容包括:时间、地点、人物、事件
日志级别:事件的关键性程度,Loglevel
一、inode和block概述
文件数据包括元信息与真实数据
文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节
block(块)
- 连续的八个扇区组成一个block
- 是文件读取的最小单位
inode(索引节点)
- 中文译名为“索引节点”,也叫i节点
- 用于存储文件元信息
1.inode表中信息
每个文件的属性信息,比如:文件的大小、时间、类型、权限等,称为文件的元数据(meta? data元信息)
元数据是存放在inode(index node)表中。inode表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息
1.1每一个inode表记录对应的保存了以下信息
- inode number 节点号
- 文件类型
- 权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
1.2用stat命令可以查看某个文件的inode信息
示例:
1.3Linux系统文件的三个主要的时间属性
ctime(change time)
最后一次改变文件或目录(属性)的时间
atime(access time)
最后一次访问文件或目录的时间
mtime(modify time)
最后一次修改文件或目录(内容)时间
建议最好使用mtime
- 当新建文件时,最近访问、最近更改、最近改动时间均一致
- 打开文件? 最近访问时间会更新
- 不打开文件? 只查看文件的话? 最近访问、最近更改、最近改动时间不会变动
- 更改文件内容? ?最近更改时间、最近改动时间会更新
- 修改权限? ?最近改动时间会更新
1.4inode内容
- 目录也是一种文件
- 目录文件的结构
文件名1 | inode号码1 |
文件名2 | inode号码1 |
...... | ...... |
- 每个inode都有一个号码,操作系统用inode号码来识别不同的文件
- Linux系统内部不使用文件名,而使用inode号码来识别文件
- 对于用户,文件名只是inode号码便于识别的别称
1.5查看inode号码
- 用户通过文件名打开文件时,系统内部的过程
- 系统找到这个文件名对应的inode号码
- 通过inode号码,获取inode信息
- 根据inode信息,找到文件数据所在的block,读出数据
- 查看inode号码的方法
- ls? -i? ? ?查看文件名对应的inode号码
- stat? 查看文件inode信息中的inode号码
1.6延伸——inode号码可以相同吗
inode号是文件系统分配的;
inode号可以相同? 但是不在同一块硬盘上;
inode号在同一设备上是唯一的;
inode号是有限资源,它的多少和磁盘大小有关。
1.7延伸——磁盘剩余空间很多,但是无法继续创建文件
inode也会消耗硬盘空间
每个inode的大小一般是128字节或256字节
格式化文件系统确定inode的总数
使用df -i命令可以查看每个硬盘分区的inode总数和已经使用的数量
结果是:inode号用完了
- 解决办法
- 如果是lvm逻辑卷的话,可以对逻辑卷进行扩容
- 如果是普通分区的话,可以删除没有用的空文件
1.8inode的特殊作用
由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象
- 当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
- 同一设备,移动或重命名文件时,只改变文件名,不影响inode号码
- 打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名
cp 和 inode
cp 命令:
- 分配一个空闲的inode号,在inode表中生成新条目
- 在目录中创建一个目录项,将名称与inode编号关联
- 拷贝数据生成新的文件
rm 命令:
- 硬链接数递减,从而释放的inode号可以被重用
- 把数据块放在空闲列表中
- 删除目录项
- 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
mv和inode
- 如果mv命令的目标和源在同一设备,
- 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
- 删除旧的目录对应关系新建目录对应关系
1.9文件存储小结
- 硬盘分区后的结构
文件名 | → | 目录项 | 目录块 |
元信息 | inode | inode表区块 | |
数据 | block | block数据区 |
- 访问文件的简单流程
根据文件夹的文件名和inode号码的关系找到对应的inode表(属主? 属组)再根据inode表当中的指针找到磁盘上的真实数据
2.链接文件
为文件或目录建立链接文件
- 链接文件分类
软链接 | 硬链接 | |
删除原始文件后 | 失效 | 仍旧可用 |
使用范围 | 适用于文件或目录 | 只可用于文件 |
保存位置 | 与原始文件可以位于不同的文件系统中 | 必须与原始文件在同一个文件系统(如一个Linux分区)内 |
3.案例:恢复EXT类型的文件
编译安装extundelete软件包
模拟删除并执行恢复操作
4.xfsdump使用限制
- 只能备份已挂载的文件系统
- 必须使用root的权限才能操作
- 只能备份XFS文件系统
- 备份后的数据只能让xfsrestore解析
- 不能备份两个具有相同UUID的文件系统
二、日志
1.日志的功能
- 用于记录系统、程序运行中发生的各种事件
- 通过阅读日志,有助于诊断和解决系统故障
2.日志文件的分类
- 内核及系统日志
由系统服务rsyslog统计进行管理,日志格式基本相似
- 用户日志
记录系统用户登录及退出系统的相关信息
- 程序日志
由各种应用程序独立管理的日志文件,记录格式不统一
rsyslog软件是Centos7中帮助管理日志的
2.1系统日志
2.1.1message——系统大部分日志都存放在其中
日志文件? ?默认位于/var/log目录下
- /var/log/secure:系统安全日志(用户登录),文本格式,应周期性分析
- /var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行查看
- /var/log/wtmp:当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查看
- /var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看
- /var/log/dmesg:CentOS7 之前版本系统引导过程中的日志信息,文本格式,开机后的硬件变化将不再记录专用命令dmesg查看,可持续记录硬件变化的情况
- /var/log/boot.log 系统服务启动的相关信息,文本格式
- /var/log/messages :系统中大部分的信息
- /var/log/anaconda : anaconda的日志操作系统安装时安装的软件信息
主要日志文件介绍 | |
内核及公共消息日志 | /var/log/message |
计划任务日志 | /var/log/cron |
系统引导日志 | /var/log/dmesg |
邮件系统日志 | /var/log/maillog |
用户登录日志 | /var/log/lastlog /var/log/secure /var/log/wtmp /var/logbtmp |
2.1.2secure——系统安全信息
存放用户登录信息
2.2用户日志
2.2.1btmap——查看用户登录失败的信息
可以使用lastb命令查看,因为btmap是一个二进制文件
2.2.2wtmp——用户登录、注销及系统开、关机事件
可以使用last命令查看
2.2.3lastlog——最近的用户登录事件
2.2.4anaconda——日志操作系统安装时安装的软件信息
2.3程序日志
程序日志是和程序有关,有的独立日志,有的没有独立日志
由相应的应用程序独立进行管理
Web服务:/var/log/httpd
- access_log、error_log
代理服务:/var/log/squid
- access.log、cache.log
FTP服务:/var/log/xferlog
分析工具
- 文本查看、grep过滤检索、Webmin管理套件中查看
- awk、sed等文本过滤、格式化编辑工具
- Webalizer、Awstats等专用日志分析工具
2.4总结
用户日志分析——保存了用户登录、退出系统等相关信息
- /var/log/lastlog:最近的用户登录事件
- /var/log/wtmap:用户登录、注销及开、关机事件
- /var/run/utmap:当前登录的每个用户的详细信息
- /var/log/secure:与用户验证相关的安全性事件
分析工具
users、who、w、last、lastb
2.4.1users——查询当前登录的用户情况
users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。 如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数
2.4.2who——报告当前登录到系统中的每个用户的信息
使用该命令,系统管理员可以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用户名、终端类型、登录日期及远程主机
2.4.3?w——查询当前登录的用户情况
w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的 输出内容要丰富一些。
2.4.4last——查询成功登录到系统的用户记录
最近的登录情况将显示在最前面。通过 last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前 主机可能已被入侵。
2.4.5lastb——查询登录失败的用户记录
lastb 命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都 将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除 了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息。
2.5日志管理策略
- 及时作好备份和归档
- 延长日志保存期限
- 控制日志访问权限(日志中可能会包含各类敏感信息,如账号、口令等)
- 集中管理日志
- 将服务器的日志文件发到统一的日志文件服务器
- 便于日志信息的统一收集、整理和分析
- 杜绝日志信息的意外丢失、恶意篡改或删除
3.内核及系统日志
由系统服务rsyslog统一管理
- 软件包:rsyslog-7.4.7-16.el7.x86_64
- 主要程序:/sbin/rsyslogd
- 配置文件:/etc/rsyslog.conf
[root@localhost ~]#vim /etc/rsyslog.conf
#查看rsyslog.conf 配置文件
*.info;mail.none;authpriv.none;cron.none /var/log/messages
#表示所有info等级以上的所有等级的信息都写到对应的日志文件里
mail.none
#表示某事件的信息不写到日志文件里(这里比如是邮件)
3.1日志消息的级别
日志消息的作用是描述错误是否紧急;事件发生后是否会影响系统
级号 | 消息 | 级别 | 说明 |
0 | EMERG | 紧急 | 会导致主机系统不可用的情况 |
1 | ALERT | 警告 | 必须马上采取措施解决的问题 |
2 | CRIT | 严重 | 比较严重的情况 |
3 | ERR | 错误 | 运行出现错误 |
4 | WARNING | 提醒 | 可能会影响系统功能的事件 |
5 | NOTICE | 注意 | 不会影响系统但值得注意 |
6 | INFO | 信息 | 一般信息 |
7 | DEBUG | 调试 | 程序或系统调试信息等 |
3.2日志记录的一般格式
内核及大多数系统消息被记录到公共日志文件/var/log/messages 中,而其他一些程序消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者直接发送给指定用户。
对于 rsyslog 服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的。以公共日志/var/log/messages 文件的记录格式为例,其中每一行表示一条日志消息,每一条消息均包括以下四个字段。
- 时间标签:消息发出的日期和时间。
- 主机名:生成消息的计算机的名称。
- 子系统名称:发出消息的应用程序的名称。
- 消息:消息的具体内容。
3.3rsyslog——系统日志服务
rsyslog软件作用:帮助管理日志
rsyslog是CentOS 6以后版本的系统管理服务:它提供了高性能,出色的安全性和模块化设计。尽管rsyslog最初是常规的syslogd,但发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地。
当应用有限的处理时,RSYSLOG每秒可以将超过一百万的消息传递到本地目的地。即使在远程的目的地和更精细的处理中,性能通常也被认为是惊人的”。
官网:http://www.rsyslog.com/
3.3.1rsyslog特性
- 多线程
- UDP, TCP, SSL, TLS, RELP
- MySQL, PGSQL, Oracle实现日志存储
- 强大的过滤器,可实现过滤记录日志信息中任意部分
- 自定义输出格式 可以日志
- 适用于企业级
3.3.2ELK——日志收集
ELK:由Elasticsearch, Logstash, Kibana三个软件组成
- 非关系型分布式数据库基于apache软件基金会jakarta项目组的项目lucene
- Elasticsearch是个开源分布式搜索引擎,可以处理大规模日志数据,比如:Nginx、Tomcat、系统日志等功能
- Logstash对日志进行收集、分析,过滤,并将其存储供以后使用
- Kibana 可以提供的日志分析友好的 Web 界面
- kafka消息队列
3.3.3深入理解rsyslog
rsyslog相关文件
- 程序包:rsyslog
- 主程序:/usr/sbin/rsyslogd
- CentOS 6:/etc/rc.d/init.d/rsyslog {start|stop|restart|status}
- CentOS 7,8:/usr/lib/systemd/system/rsyslog.service
- 配置文件:/etc/rsyslog.conf,/etc/rsyslog.d/*.conf
- 库文件: /lib64/rsyslog/*.so
rsyslog配置文件
/etc/rsyslog.conf配置文件格式由三部分组成?
- MODULES:相关模块配置
- GLOBAL DIRECTIVES:全局配置
- RULES:日志记录相关的规则配置
3.3.4日志等级
等级名称 | 说明 |
debug (LOG_DEBUG) | 一般的调试信息说明 |
info (LOG_INFO) | 基本的通知信息 |
notice (LOG_NOTICE) | 普通信息,但是有一定的重要性 |
warning(LOG_WARNING) | 警吿信息,但是还不会影响到服务或系统的运行 |
error(LOG_ERR) | 错误信息, 一般达到err等级的信息已经可以影响到服务成系统的运行了 |
crit (LOG_CRIT) | 临界状况信思,比err等级还要严 |
alert (LOG_ALERT) | 状态信息,比crit等级还要严重,必须立即采取行动 |
emerg (LOG_EMERG) | 紧急事件等级信息,系统已经无法使用了 |
* | 代表所有日志等级。比如,“authpriv.*”代表amhpriv认证信息服务产生的日志,所有的日志等级都记录 |
3.3.5实验一? ?——修改日志位置
第一步,新建规则
格式:类型.日志的级别? 日志的位置
local6.*代表取6级别以上的
rsyslog软件管理日志,需要rsyslog软件和那个软件之间要互相支持
第二步,单独修改sshd的日志存放位置
SyslogFacility? local6? 将日志放在local6类型中
第三步,重启服务
第四步,验证
3.3.6实验二? ——远程日志
rsyslog? 软件? 可以统一收集日志
第一步,开启TCP514端口(服务端和主机都要打开)
第二步,将node2作为日志服务器
第三步,测试
3.4journalctl——日志管理工具
CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。
日志的配置文件:/etc/systemd/journald.conf
journalctl? -xe? 可以查看实时日志? 以及日志的报错信息
内存信息统一由其管理
journalctl -xe --no-pager? 可以查看日志详细信息
journalctl? -u? httpd? 可以查看httpd的日志信息
journalctl -u? 可以查看某个程序的日志信息
3.4.1延伸
如果想查看几点几分到几点几分的日志
内存中
#查看指定时间的日志
- journalctl --since="2017-10-30 18:10:30"
- journalctl --since "20 min ago"
- journalctl --since yesterday
- journalctl --since "2017-01-10" --until "2017-01-11 03:00"
- journalctl --since 09:00 --until "1 hour ago"
?日志文件
如何查看8点到10点的日志文件
文本三剑客
- sed
- awk
- grep
3.5logrotate——日志转储
logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行
logrotate配置
相关文件
- 计划任务:/etc/cron.daily/logrotate
- 程序文件:/usr/sbin/logrotate
- 配置文件: /etc/logrotate.conf
- 日志文件:/var/lib/logrotate/logrotate.status
配置参数 | 说明 |
---|---|
compress | 通过gzip压缩转储以后的日志 |
nocompress | 不压缩 |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断 |
nocopytruncate | 备份日志文件但是不截断 |
create mode ownergroup | 转储文件,使用指定的权限,所有者,所属组创建新的日志文件 |
nocreate | 不建立新的日志文件 |
delaycompress | 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩 |
nodelaycompress | 覆盖 delaycompress 选项,转储同时压缩 |
errors address | 专储时的错误信息发送到指定的Email地址 |
ifempty | 即使是空文件也转储,此为默认选项 |
notifempty | 如果是空文件的话,不转储 |
mail address | 把转储的日志文件发送到指定的E-mail 地址 |
nomail | 转储时不发送日志文件 |
olddir directory | 转储后的日志文件放入指定目录,必须和当前日志文件在同一个文件系统 |
noolddir | 转储后的日志文件和当前日志文件放在同一个目录下 |
prerotate/endscript | 在转储以前需要执行的命令,这两个关键字必须单独成行 |
postrotate/endscript | 在转储以后需要执行的命令,这两个关键字必须单独成行 |
daily | 指定转储周期为每天 |
weekly | 指定转储周期为每周 |
monthly | 指定转储周期为每月 |
rotate count | 指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份 |
tabooext [+] list | 让logrotate*不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig,.rpmsave, v, 和~ |
size size | 当日志文件到达指定的大小时才转储bytes(缺省)及KB或MB |
sharedscripts | 默认,对每个转储日志运行prerotate和postrotate脚本,日志文件的绝对路径作为第一个参数传递给脚本。 这意味着单个脚本可以针对与多个文件匹配的日志文件条目多次运行(例如/ var / log / news /.example)。 如果指定此项sharedscripts,则无论有多少个日志*与通配符模式匹配,脚本都只会运行一次 |
nosharedscripts | 针对每一个转储的日志文件,都执行一次prerotate和 postrotate脚本,此为默认值 |
missingok | 如果日志不存在,不提示错误,继续处理下一个 |
nomissingok | 如果日志不存在,提示错误,此为默认值 |
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!