目录
一、Linux文件系统
1、inode 与 block 详解
1.1 inode 和 block 概述
1.2 inode表的内容
1.3 查看文件的inode号码
1.4 模拟innode号耗尽故障处理
2、访问文件的流程
3、文件恢复
3.1 恢复误删除的ext3格式文件
3.2 恢复误删除的 xfs 格式文件
二、Linux日志文件管理
1、日志的功能
2、日志文件种类
3、日志消息级别
4、rsyslog工具:管理日志
4.1 rsyslog 相关文件
4.2 /etc/rsyslog.conf 配置文件格式
4.3 通过rsyslog软件将sshd程序的日志独立
4.4 网络日志(远程日志功能)
5、journalctl工具:管理日志
6、logrotate工具:日志转储
inode(索引节点): inode 是文件系统中的一种数据结构,用于存储文件或目录的元数据信息,如文件大小、权限、所有者、时间戳等。每个文件和目录都与一个唯一的 inode 相关联,它们可以通过 inode 而不是文件名来标识和访问
block(块):文件是存储在硬盘上的,硬盘的最小存储单位叫做 “扇区” (sector),每个扇区存储 512 字节。一般连续八个扇区组成一个 “块” (block),一个块是 4K 大小,是文件系统中存储数据的最小单位。当文件系统需要存储文件时,它将文件分割成块,并将这些块分配给存储介质上的不同位置。文件系统使用块来管理存储空间并存储文件数据
元数据:每个文件的属性信息,比如:文件的大小,时间,类型,权限等。而元数据是存放在inode(index node)表中
每一个inode表记录对应的保存了以下信息:
简写 | 全名 | 中文名 | 含义 |
---|---|---|---|
atime | access time | 访问时间 | 文件内容最后被访问的时间 |
mtime | modify time | 修改时间 | 文件内容最后被修改的时间 |
ctime | change time | 变化时间 | 文件的元数据发生变化的时间(比如权限,所有者等) |
命令一:ls -i 文件名
命令二:stat 文件名
注:
innode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件
操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个或多个文件名
df -i #查看设备的inode号数量
touch {1..51300}|xargs -n1 touch #到磁盘设备的挂载目录中创建大量的空文件
ls |wc -l #统计创建文件的个数,即总inode号数
****************************************************
解决方法:
rm -rf 无用文件名 #删除无用的文件,释放inode号
如果设备是逻辑卷可通过扩容来增加空间容量,从而增加inode号数量
注:
inode号是有限资源,它的多少与磁盘大小有关,inode号在同一设备上是唯一的,在不同设备上可能不唯一
总结:根据文件夹的文件名和indoe号的关系找到对应的inode表,再根据inode表当中的指针找到磁盘上的真实数据
使用extundelete工具是一个开源的 Linux 数据恢复工具,支持 ext3 文件系统
#安装extundelete软件
yum -y install e2fsprogs-devel e2fsprogs-libs #安装依赖软件
tar -jxvf extundelete-0.2.4.tar.bz2 -C /opt #解压软件包,软件包从官网下载
cd /opt/extundelete-0.2.4 #切换到安装目录下
./configure #编译安装
make
make install
ls /usr/local/bin/ #查看extundelete软件
************************************************************************
目前使用版本只对ext3有效,设置磁盘分区略
mkfs.ext3 /dev/sdb1 #文件系统格式化
mount /dev/sdb1 /mnt #挂载磁盘分区
cd /mnt #切换到挂载点目录
echo 111>a #创建文件
echo 222>b
echo 333>c
echo 444>d
************************************************************************
#模拟删除文件,并恢复
rm -rf a b c d #模拟删除
umount /mnt #解挂载
extundelete /dev/sdb1 --inode 2 #查看该分区下的存在哪些文件
extundelete /dev/sdb1 --restore-all #恢复被删除的文件
************************************************************************
#验证,查看恢复的文件
cd ~ #切换到当前家目录
ls RECOVERED_FILES/ #在该目录下有恢复文件
使用 xfsdump 与 xfsrestore 工具对xfs 类型的文件进行备份恢复
xfsdump 的备份级别有两种 | |
0(备份默认级别) | 表示完全备份 |
1-9 | 表示增量备份 |
通式:xfsrestore -f 恢复文件的位置 存放恢复后文件的位置
选项 | 说明 |
---|---|
-f | 指定备份文件目录 |
-L | 指定标签 session label |
-M | 指定设备标签 media label |
-s | 备份单个文件,-s 后面不能直接跟路径 |
使用 xfsdump 时,需要注意以下的几个限制:
使用 xfsdump限制较多,还是最好提前备份重要数据,以防数据丢失
- 不支持没有挂载的文件系统备份,所以只能备份已挂载的
必须使用 root 的权限才能操作
只能备份 XFS 文件系统
备份下来的数据只能让 xfsrestore 解析
不能备份两个具有相同 UUID 的文件系统(可使用blkid查看)
#安装xfsdump工具
yum install -y xfsdump命令安装
**************************************************
#目前使用版本只对xfs有效,设置磁盘分区略
mkfs.xfs /dev/sdb1 #文件系统格式化
mount /dev/sdb1 /mnt #挂载磁盘分区
cd /mnt #切换到挂载点目录
echo 111>a #创建文件
**************************************************
#使用 xfsdump 命令备份整个分区到指定目录
xfsdump -f /opt/bak_sdb1 /dev/sdb1
**************************************************
#模拟删除文件并恢复
rm -rf /mnt/* #删除/mnt目录下的所有文件
ls /mnt #查看还有无文件
xfsrestore -f /opt/bak_sdb1 /data/
#使用bak文件将数据恢复到/data下
**************************************************
#验证,查看恢复的文件
cd /data #切换目录
ls /data #在该目录下有恢复文件
记录:日志可以记录特定事件、活动或数据,以便将来进行查看和分析
故障排除:在软件开发和系统管理中,日志通常用于跟踪问题和故障,帮助识别和解决错误
监控:日志记录可以用于监视应用程序、系统或网络的性能和行为,从而及时发现异常并采取必要的措施
合规性:在许多行业中,日志记录是确保合规性和安全性的重要手段,例如在金融和医疗领域
分析:通过分析日志数据,可以获取有关系统使用情况、用户行为和趋势的宝贵信息,从而支持决策制定和优化流程
安全:日志记录对于安全审计和追踪潜在的安全威胁至关重要,能够帮助发现入侵和未经授权的访问
①内核及系统日志
记录 Linux 内核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息
②用户日志
记录系统用户登录及退出系统的相关信息
③程序日志
由各种应用程序独立管理的日志文件,记录格式不统一
级号 | 消息 | 级别 | 说明 |
---|---|---|---|
0 | EMERG | 紧急 | 会导致主机系统不可用的情况 |
1 | ALERT | 警告 | 必须马上采取措施解决的问题 |
2 | CRIT | 严重 | 比较严重的情况 |
3 | ERR | 错误 | 运行出现错误 |
4 | WARNING | 提醒 | 可能会影响系统功能的事件 |
5 | NOTICE | 注意 | 不会影响系统但值得注意 |
6 | INFO | 信息 | 一般信息 |
7 | DEBUG | 调试 | 程序或系统调试信息等 |
程序包: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
由三部分组成:
MODULES:相关模块配置
GLOBAL DIRECTIVES:全局配置
RULES:日志记录相关的规则配置
程序类型:mail 邮箱、corn 计划任务、auth 用户认证
自定义类型:local0~local6(7个类型)
注:rsyslog软件管理日志,需要rsyslog软件和其他服务程序之间要相互支持
原本sshd软件的日志放在/var/log/secure日志中,与很多软件放在一起,因为这个软件比较重要,所以把sshd软件的日志单独存放
#在rsyslog配置文件里添加sshd的程序日志
vim /etc/rsyslog.conf
local6.* /opt/sshd.log
*************************************************************************
#修改sshd配置文件
vim /etc/ssh/sshd_config
#SyslogFacility AUTHPRIV #注释掉这行
SyslogFacility local6 #在sshd配置文件里将日志存放在local6类型中
**************************************************************************
#验证
systemctl restart rsyslog.service sshd #重启rsyslog软件和sshd软件服务
ssh 172.16.12.12 #远程连接
cat /opt/sshd.log #查看sshd程序日志
①在rsyslog配置文件里添加sshd的程序日志
②在sshd配置文件里将日志存放在local6类型中
③验证,重启rsyslog软件和sshd软件服务,查看指定目录下的日志
允许将来自多个源头(如服务器、应用程序、网络设备)的日志数据传输到远程位置,通常是集中式的日志服务器或云端存储
要求:开启日志的远程传输功能在172.16.12.12
#客户端和日志服务器都要关闭防火墙和临时防护
systemctl stop firewalld
setenforce 0
**************************************************
#开启客户端和日志服务器tcp的514端口
vim /etc/rsyslog.conf
$ModLoad imtcp
$InputTCPServerRun 514
或开启客户端和日志服务器udp的514端口
$ModLoad imudp
$UDPServerRun 514
**************************************************
systemctl restart rsyslog #重启rsyslog服务
ss -ntap |grep 514 #查看514端口是否打开
**************************************************
#在172.16.12.10上设置发送日志到172.16.12.12主机去
vim /etc/rsyslog.conf #修改rsyslog文件配置文件
*.info;mail.none;authpriv.none;cron.none @@172.16.12.12
#@@代表使用tcp,@代表udp
**************************************************
#测试,在客户端把写日志进日志服务端
logger "this is test log from 172.16.12.10"
cat /var/log/messages #在日志服务端查看客户端发来的日志信息
①客户端和日志服务器都要关闭防火墙和临时防护
②开启客户端和日志服务器tcp的514端口
③重启rsyslog服务并查看514端口是否打开
④ 在172.16.12.10上设置发送日志到172.16.12.12主机去
⑤ 测试,在客户端把写日志进日志服务端
日志的配置文件:
通式:journalctl [OPTIONS...] [MATCHES...]
选项 | 说明 |
---|---|
--no-full,--full, -l | 默认显示完整的字段内容,超长的部分换行显示或者被分页工具截断 |
-a,--all | 完整显示所有字段内容, 即使其中包含不可打印字符或者字段内容超长 |
-f,--follow | 只显示最新的日志项,并且不断显示新生成的日志项 |
-e,--pager-end | 在分页工具内立即跳转到日志的尾部 |
-n,--lines | 限制显示最新的日志行数,若不设参数则表示默认值10行 |
--no-tail | 显示所有日志行 |
-r,--reverse | 反转日志行的输出顺序, 也就是最先显示最新的日志 |
-o,--output | 控制日志的输出格式 |
--no-hostname | 不显示来源于本机的日志消息的主机名字段 |
-x,--catalog | 在日志的输出中增加一些解释性的短文本, 以帮助进一步说明日志的含义 |
-q,--quiet | 当以普通用户身份运行时, 不显示任何警告信息与提示信息 |
-m,--merge | 混合显示包括远程日志在内的所有可见日志 |
-b | 显示特定于某次启动的日志,"-b 1"表示按时间顺序排列最早的那次启动, "-b 2"则表示在时间上第二早的那次启动; "-b -0"表示最后一次启动, "-b -1"表示在时间上第二近的那次启动 |
--directory | 指定了另外一台主机上的日志目录 |
--list-boots | 列出每次启动的 序号(也就是相对于本次启动的偏移量)、32字符的ID、第一条日志的时间戳、最后一条日志的时间戳 |
-k,--dmesg | 仅显示内核日志 |
-u, --unit | 仅显示属于特定单元的日志 |
-p, --priority | 根据日志等级(包括等级范围)过滤输出结果 |
-c, --cursor | 从指定的游标(cursor)开始显示日志 |
--after-cursor | 从指定的游标(cursor)之后开始显示日志 |
--show-cursor | 在最后一条日志之后显示游标 |
-S, --since=, -U, --until= | 显示晚于指定时间(--since=)的日志、显示早于指定时间(--until=)的日志 |
-F, --field | 显示所有日志中某个字段的所有可能值 |
-N, --fields | 输出所有日志字段的名称 |
--system, --user | 仅显示系统服务与内核的日志(--system)、 仅显示当前用户的日志(--user) |
-M, --machine | 显示来自于正在运行的、特定名称的本地容器的日志 |
-D DIR, --directory=DIR | 仅显示来自于特定目录中的日志, 而不是默认的运行时和系统日志目录中的日志 |
案例:
#查看所有日志(默认情况下 ,只保存本次启动的日志)
journalctl
#查看内核日志(不显示应用日志)
journalctl -k
#查看系统本次启动的日志
journalctl -b
journalctl -b -0
#查看上一次启动的日志(需更改设置)
journalctl -b -1
#查看指定时间的日志 -S=since -U=unit
journalctl --since="2024-1-8 19:00:00" #查看2024-1-8 19:00:00的日志
journalctl --since "20 min ago" #查看20分钟前的日志
journalctl --since yesterday #查看昨天的日志
journalctl -S "2023-12-31 19:00" -U "2024-1-8 19:00:00"
#查看2023-12-31 19:00到2024-1-8 19:00:00的日志
journalctl --since 09:00 --until "1 hour ago"
#从今天09:00 开始直至一小时前的systemd日志
#显示尾部的最新10行日志
journalctl -n
#显示尾部指定行数的日志
journalctl -n 20
#实时滚动显示最新日志
journalctl -f
#查看指定服务的日志
journalctl /usr/lib/systemd/systemd
#查看指定进程的日志
journalctl _PID=1
#查看某个路径的脚本的日志
journalctl /usr/bin/bash
#查看指定用户的日志
journalctl _UID=33 --since today
#查看某个 Unit 的日志
journalctl -u nginx.service
journalctl -u nginx.service --since today
#实时滚动显示某个 Unit 的最新日志
journalctl -u nginx.service -f
#合并显示多个 Unit 的日志
journalctl -u nginx.service -u php-fpm.service --since today
#查看指定优先级(及其以上级别)的日志,共有8级 0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
journalctl -p err -b
#日志默认分页输出,--no-pager 改为正常的标准输出
journalctl --no-pager
#日志管理journalctl
#以 JSON 格式(单行)输出
journalctl -b -u nginx.service -o json
#以 JSON 格式(多行)输出,可读性更好
journalctl -b -u nginx.serviceqq -o json-pretty
#显示日志占据的硬盘空间
journalctl --disk-usage
#指定日志文件占据的最大空间
journalctl --vacuum-size=1G
#指定日志文件保存多久
journalctl --vacuum-time=1years
logrotate工具相关文件:
计划任务:/etc/cron.daily/logrotate
程序文件:/usr/sbin/logrotate
配置文件: /etc/logrotate.conf
日志文件:/var/lib/logrotate/logrotate.status
程序独立的配置文件/etc/logrotate.d/*
以bootlog程序为例,查看独立的程序bootlog的配置文件格式:
配置文件的配置参数 | 说明 |
---|---|
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 | 如果日志不存在,提示错误,此为默认值 |
以nginx软件的独立配置文件为模板
cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily #一天生成一个新的日志
rotate 5 #保留5天日志
missingok #无所谓有无日志
compress #通过gzip压缩转储以后得日志
delaycompress #转储的日志文件到下一次转储时才压缩
notifempty #空文件不转存
create 644 ngnix nginx #转存文件的属性
postrotate
if [ -f /app/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /app/nginx/logs/nginx.pid`
#日志分割后,告诉nginx软件需重新生成新的日志文件
fi
endscript
}
案例:分割日志
①首先,在/var/log/httpd的目录下能看到两个文件,这是httpd服务的日志信息
② 如果把access_log文件移动成一个新的文件,加载后又会生成新的文件
因为在httpd的配置文件中规定:访问httpd服务通过的日志文件只能存放在/var/log/httpd/access_log中
因为logrotate的子配置文件中规定重新加载httpd服务会在/var/log/httpd/下重新产生新的access_log文件