一、inode与inode表
linux系统中的每一个文件都有文件对应的文件数据 ,文件数据包括元数据(文件的属性信息) 与实际数据,元数据 存放在indoe表中。
- 文件数据包括元信息与实际数据。
- 文件存储在硬盘上,硬盘最小存储单位是
扇区
,每个扇区存储512字节
,连续的八个扇区
组成了一个block
块,是文件存取的最小单位,操作系统在读取硬盘的时候,就是一个block块,一个block块的读取(八个扇区一读,也就是4k一读)
1. inode(索引节点)
- 中文译名为"索引节点",也叫 i 节点
- 用于存储文件元信息
2 inode表:
文件系统中的一种数据结构,用于存储关于文件和目录的元数据信息。每个文件或目录在文件系统中都有一个对应的 inode
文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在block块中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode表。 一个文件必须占用一个inode ,至少占用一个block(这也是du和ls命令查看的区别)
每一个inode表记录对应的保存了以下信息:
- inode number 节点号
- 文件类型
- 权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
inode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个或多个文件名,inode号是在分区时被固定分配多少个的,所以是可以被消耗完的,当查看磁盘空间有剩余却创建不了文件时,有可能是文件过多inode号被用完,这时find ./ -empty 可以查找空文件并删除,另外并不是i
当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码:通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。
在同一文件系统中inode是唯一的。在不同文件系统中inode可能会一样
inode 表中存储了诸如文件大小、文件权限、文件所有者、文件创建时间、文件修改时间等元数据信息。它还包含了指向实际文件数据的指针,可以快速定位和访问文件的内容。
当文件系统创建一个新文件时,会为该文件分配一个唯一的 inode 号,并在 inode 表中创建一个对应的记录。这个 inode 号可以用来标识并访问该文件。
通过使用 inode 表,文件系统可以高效地管理文件和目录,而不需要依赖文件名来进行查找和定位。这种基于 inode 的文件系统在许多操作系统中广泛使用,包括 Linux 中的 ext 文件系统家族。
总结起来,inode 表是文件系统中的一个数据结构,用于存储文件和目录的元数据信息,以及指向文件数据的指针,使得文件系统可以高效地管理和访问文件。
PS:
2.1 如何查看inode号
命令:
查看文件名对应的inode号码
ls -i
文件名/目录(是目录时必须是绝对路径)
查看文件inode信息中的inode号码
stat
文件名
补充:du -i
可以查看文件系统的inode号
2.命令和inode号之间的关系
cp 命令:
- 分配一个空闲的inode号,在inode表中生成新条目
- 在目录中创建一个目录项,将名称与inode编号关联
- 拷贝数据生成新的文件
mv命令:
-
如果mv命令的目标和源在同一设备,
不影响inode表(除时间戳)或磁盘上的数据位置;
系统会删除旧的目录对应关系,新建目录对应关系。
rm 命令:
- 硬链接数递减,从而释放的inode号可以被重用
- 把数据块放在空闲列表中
- 删除目录项
- 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
3.文件的三条时间戳(元数据中的一部分)
- 最近访问atime(access time):最后一次访问文件的时间(使用echo追加内容不会变,因为没有打开文件)
- 最近更改mtime(modify):最后一次更改文件内容的时间。更改完内容之后,ctime也会改变
- 最近改动ctime(change time):最后一次改变文件元信息(文件或目录属性)的时间。改变后,mtime不变
4.目录
目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系,目录文件本身的大小,是根据所含目录项统计的,不是目录内所有子文件的大小总和。
文件引用说起来是两个方式:
一个是 inode号
另一个是通过文件名来引用一个文件,但Linux系统内部不使用文件名,而使用inode号码来识别文件,对于系统来说,文件名只是inode号码便于识别的别称,所以实际上就是一个,通过inode号,对用户来说是两种。
一个目录是目录下的文件名和文件inode号之间的映射
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名 ,以及该文件名对应的inode号码。
5.备份与恢复(xfs类型)
备份分为两种
- 全量备份:将文件内容进行备份
- 增量备份:将文件新加入的内容,全量备份以外的内容备份
在使用xfs文件系统的系统中,可以通过安装 xfsdump
与xfsrestore
工具进行备份
列举xfsdump
安装命令:
yum install -y xfsdump
xfsdump
按照inode 顺序备份一个 xfs 文件系统。xfsdump 的备份级别有两种:
- 0 表示完全备份
- 1-9 表示增量 备份
xfsdump 的备份级别默认为 0
使用 xfsdump 时,需要注意以下的几个限制:
- 只能备份已挂载的文件系统
- 必须使用root权限才能操作
- 只能备份xfs文件系统
- 备份后的数据只能用xfsrestore解析
- 不能备份两个相同uuid号的文件系统(blkid查看)
备份命令:xfsdump
选项
选项 | 说明 |
---|---|
-f | 指定备份文件目录 |
-L | 指定标签 session label |
-M | 指定设备标签 media label |
-s | 备份单个文件 |
二、日志
内核及系统日志由系统服务 rsyslog
统一管理,根据其主配置文件 /etc/rsyslog.conf
Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/
下
1.日志的功能及其分类
1.1日志的功能
记录系统、程序运行中发生的各种事件,当系统出现故障时,通过阅读日志,有助于诊断和解决系统故障。
1.2、日志文件的分类
-
内核及系统日志:由系统服务rsyslog统一进行管理,日志格式基本相似,其主配置文件是
/etc/rsyslog.conf
-
用户日志:记录系统用户登录及退出系统的相关信息
-
程序日志:由各种应用程序独立管理的日志文件,记录格式不统一
- Web服务:
/var/log/httpd/
access_log
、error_log
- 代理服务:
/var/log/squid
access.log
、cache.log
- FTP服务:
/var/log/xferlog
- Web服务:
2.常见的日志文件及其保存位置
日志文件一般默认位于:/var/log
目录下
日志文件位置 | 日志文件说明 |
---|---|
/var/log/messages内核和公共日志 | 它是核心系统日志文件,其中包含了系统启动时的引导信息,以及系统运行时的其他状态消息。I/O 错误、网络错误和其他系统错误都会记录到此文件中。其他信息,比如某个人的身份切换为 root,已及用户自定义安装软件的日志,也会在这里列出。 |
/var/log/cron 计划任务日志 | 记录与系统定时任务相关的曰志 |
/var/log/dmesg 系统引导日志 | 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息 |
/var/log/maillog 邮件日志 | 记录邮件信息的曰志 |
用户日志 | |
/var/log/lastlog | 记录系统中所有用户最后一次的登录时间的曰志。这个文件也是二进制文件.不能直接用Vi 查看。而要使用lastlog命令查看 |
/var/log/secure | 记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
/var/log/wtmp | 永久记录所有用户的登陆、注销信息,同时记录系统的启动、重启、关机事件。同样,这个文件也是二进制文件.不能直接用Vi查看,而要使用last命令查看 |
/var/tun/ulmp | 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用Vi查看,而要使用w、who、users等命令查看 |
3.日志文件的格式
日志文件的格式包含以下 4 列:
- 事件产生的时间(什么时候)
- 产生事件的服务器的主机名
- 产生事件的服务名或程序名(做了什么)
- 事件的具体信息 (谁)
简单说就是谁在什么主机上,在什么时候,做了什么
4.内核及公共消息日志
内核及大多数系统消息被记录到公共日志文件/var/log/messages
中,而其他一些程序消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者直接发送给指定用户。
对于rsyslog 服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的(详见3.日志文件的格式) 。
由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf。
- 软件包:
rsyslog-8.24.0-12.el7.x86_64
(可使用rpm -q
命令查看) - 主要程序:
/sbin/rsyslogd
- 配置文件:
/etc/rsyslog.conf
(可使用rpm -qc
命令查看)
5.用户日志分析
保存了用户登录、退出系统等相关信息:
/var/log/lastlog
:最近都用户登录事件。二进制文件,使用lastlog
命令查看。/var/log/secure
:与用户验证有关的安全性事件。/var/log/wtmp
:用户登录、注销,及系统开、关机事件。二进制文件,使用 last 命令查看。/var/run/utmp
:当前登录的每个用户的详细信息。二进制文件,使用w、who、users等命令查看。
5.1 users 查询最近三次登录的用户信息
users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。 如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。
5.2 who 查看当前登录的用户、终端、登录时间、IP地址
who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可
以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用
户名、终端类型、登录日期及远程主机
5.3 w 查看当前登录的用户、终端、IP地址、登录时间、占用CPU的情况、进程等
w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的 输出内容要丰富一些。
各字段:
- USER:登录的用户名。
- TTY:用户当前所使用的终端。
- FROM:登录用户的IP地址或主机名。
- LOGIN@:登录时间。
- IDLE:用户在终端处于空闲状态的时间。
- JCPU:用户所有进程的累计CPU时间。
- PCPU:当前正在运行的进程的CPU时间。
- WHAT:用户正在做的事情(命令或程序的简短描述)
5.4 last 读取 /var/log/wtmp 文件,显示登录系统的用户信息
last 命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。通过 last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前 主机可能已被入侵。
各字段:
- root 登录的用户名
- pts/0 用户所使用的终端。
- 2023-07-31 02:29 登录时间和日期。
- 192.168.2.103 登录用户的IP地址或主机名。
5.5 lastb 读取 /var/log/btmp 文件,显示登入系统失败的用户信息
lastb 命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除 了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure
中获得相关信息。
6.程序日志分析
程序日志:由各种应用程序独立管理的日志文件,记录格式不统一
- Web服务:
/var/log/httpd/
access_log
、error_log
- 代理服务:
/var/log/squid
access.log
、cache.log
- FTP服务:
/var/log/xferlog
一般查看文本使用grep
过滤命令,awk
、sed
等文本过滤、格式化编辑工具,分析日志使用Webalizer
、Awstats
等专用日志分析工具
三、系统日志管理
1. sysklogd 系统日志服务
CentOS 5 之前版本采用的日志管理系统服务
- syslogd: system application 记录应用日志
- klogd: linux kernel 记录内核日志
事件记录格式:
日期时间
主机
进程[pid]: 事件内容
C/S架构:
通过TCP或UDP协议的服务完成日志记录传送,将分布在不同主机的日志实现集中管理
2.rsyslog 系统日志服务
rsyslog是CentOS 6以后版本的系统管理服务:它提供了高性能,出色的安全性和模块化设计。尽管rsyslog最初是常规的syslogd,但发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地。
当应用有限的处理时,RSYSLOG每秒可以将超过一百万的消息传递到本地目的地。即使在远程的目的地和更精细的处理中,性能通常也被认为是惊人的"。
2.1 rsyslog的特性
- 多线程
- UDP, TCP, SSL, TLS, RELP
- MySQL, PGSQL, Oracle实现日志存储
- 强大的过滤器,可实现过滤记录日志信息中任意部分
- 自定义输出格式 可以日志
- 适用于企业级
2.2 查看rsyslog的详细信息
vbnet
[root@localhost ~]#rpm -qi rsyslog
Name : rsyslog
Version : 8.24.0
Release : 12.el7
Architecture: x86_64
Install Date: 2021年08月06日 星期五 20时59分53秒
Group : System Environment/Daemons
Size : 2001814
License : (GPLv3+ and ASL 2.0)
Signature : RSA/SHA256, 2017年08月11日 星期五 03时43分05秒, Key ID 24c6a8a7f4a80eb5
Source RPM : rsyslog-8.24.0-12.el7.src.rpm
Build Date : 2017年08月07日 星期一 08时56分12秒
Build Host : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.rsyslog.com/
Summary : Enhanced system logging and kernel message trapping daemon
Description :
Rsyslog is an enhanced, multi-threaded syslog daemon. It supports MySQL,
syslog/TCP, RFC 3195, permitted sender lists, filtering on any message part,
and fine grain output format control. It is compatible with stock sysklogd
and can be used as a drop-in replacement. Rsyslog is simple to set up, with
advanced features suitable for enterprise-class, encryption-protected syslog
relay chains.
2.3 ELK
ELK:由Elasticsearch
,Logstash
,Kibana
三个软件组成
- 非关系型分布式数据库基于apache软件基金会jakarta项目组的项目lucene
Elasticsearch
是个开源分布式搜索引擎,可以处理大规模日志数据,比如:Nginx
、Tomcat
、系统日志等功能Logstash
对日志进行收集、分析,过滤,并将其存储供以后使用Kibana
可以提供的日志分析友好的 Web 界面
3.rsyslog管理
3.1 rsyslog 系统日志术语
- facility:设施,从功能或程序上对日志进行归类
perl
#内置分类
auth(验证), authpriv, cron(定时任务), daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, syslog
#自定义的分类
local0-local7
- Priority 优先级别,从低到高排序
scss
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
还可以通过 man 3 syslog
,man logger
查看帮助:
sql
[root@centos8 ~]#yum -y install man-pages
[root@centos8 ~]#man 3 syslog
level
This determines the importance of the message. The levels are, in order of decreasing impor‐
tance:
LOG_EMERG system is unusable
LOG_ALERT action must be taken immediately
LOG_CRIT critical conditions
LOG_ERR error conditions
LOG_WARNING warning conditions
LOG_NOTICE normal, but significant, condition
LOG_INFO informational message
LOG_DEBUG debug-level message
3.2 日志的等级
在 Linux 内核中,根据日志消息的重要程度不同,将其分为不同 的优先级别(数字等级越小,优先级越高,消息越重要)
等级名称 | 说 明 | 级别 |
---|---|---|
debug (LOG_DEBUG) | 一般的调试信息说明 | 7 |
info (LOG_INFO) | 基本的通知信息 | 6 |
notice (LOG_NOTICE) | 普通信息,但是有一定的重要性 | 5 |
warning(LOG_WARNING) | 警吿信息,但是还不会影响到服务或系统的运行 | 4 |
error(LOG_ERR) | 错误信息, 一般达到err等级的信息已经可以影响到服务成系统的运行了 | 3 |
crit (LOG_CRIT) | 临界状况信思,比err等级还要严® | 2 |
alert (LOG_ALERT) | 状态信息,比crit等级还要严重,必须立即采取行动 | 1 |
emerg (LOG_EMERG) | 疼痛等级信息,系统已经无法使用了 | 0 |
补充四条特殊
*
代表所有日志等级。比如,"authpriv.*"代表amhpriv认证信息服务产生的日志,所有的日志等级都记录
none
:没有级别,即不记录
PRIORITY
:指定级别(含)以上的所有级别=PRIORITY
:仅记录指定级别的日志信息
3.3 日志的服务名称
什么服务 的日志
服务名称 | 说 明 |
---|---|
auth(LOG AUTH) | 安全和认证相关消息 (不推荐使用authpriv替代) |
authpriv(LOG_AUTHPRIV) | 安全和认证相关消息(私有的) |
cron (LOG_CRON) | 系统定时任务cront和at产生的日志 |
daemon (LOG_DAEMON) | 与各个守护进程相关的曰志 |
ftp (LOG_FTP) | ftp守护进程产生的曰志 |
kern(LOG_KERN) | 内核产生的曰志(不是用户进程产生的) |
Iocal0-local7 (LOG_LOCAL0-7) | 为本地使用预留的服务 |
lpr (LOG_LPR) | 打印产生的日志 |
mail (LOG_MAIL) | 邮件收发信息 |
news (LOG_NEWS) | 与新闻服务器相关的日志 |
syslog (LOG_SYSLOG) | 存syslogd服务产生的曰志信息(虽然服务名称己经改为reyslogd,但是很多配罝依然沿用了 syslogd服务的,所以这里并没有修改服务名称) |
user (LOG_USER) | 用户等级类别的日志信息 |
uucp (LOG_UUCP> | uucp子系统的日志信息,uucp是早期Linux系统进行数据传递的协议,后来 也常用在新闻组服务中 |
3.4 rsyslog相关文件
- 程序包:
rsyslog
- 主程序:
/usr/sbin/rsyslogd
- CentOS 6:
/etc/rc.d/init.d/rsyslog {start|stop|restart|status}
- CentOS7和CentOS8:
/usr/lib/systemd/system/rsyslog.service
- 配置文件:
/etc/rsyslog.conf
,/etc/rsyslog.d/*.conf
- 库文件:
/lib64/rsyslog/*.so
3.5 rsyslog的配置文件格式
rsyslog
的配置文件是/etc/rsyslog.conf
,它由三部分组成:
- MODULES:相关模块配置
- GLOBAL DIRECTIVES:全局配置
- RULES:日志记录相关的规则配置
RULES配置格式:
java
facility.priority;
#分类 优先级
*: 所有级别
none:没有级别,即不记录
PRIORITY:指定级别(含)以上的所有级别
=PRIORITY:仅记录指定级别的日志信息
文件路径:通常在/var/log/,文件路径前的-表示异步写入
用户:将日志事件通知给指定的用户,* 表示登录的所有用户
日志服务器:@host,把日志送往至指定的远程UDP日志服务器 @@host 将日志发送到远程TCP日志服务器
管道: | COMMAND,转发给其它命令处理
3.6 将ssh服务的日志单独设置
3.7 网络日志(远程日志)
csharp
//日志服务器
[root@localhost ~]#vim /etc/rsyslog.conf
....
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
//打开19 20行的配置
....
[root@localhost ~]#systemctl restart rsyslog.service
[root@localhost ~]#ss -ntap|grep 514 //查看514端口
LISTEN 0 25 *:514 *:* users:(("rsyslogd",pid=2015,fd=3))
LISTEN 0 25 :::514 :::* users:(("rsyslogd",pid=2015,fd=4))
//服务器1
[root@localhost ~]#vim /etc/rsyslog.conf
.....
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
//打开19.20行配置
.....
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none @@192.168.1.10
//设置日志发送到哪台服务器
.....
[root@localhost ~]#systemctl restart rsyslog.service
[root@localhost ~]#ss -ntap|grep 514 //查看514端口
LISTEN 0 25 *:514 *:* users:(("rsyslogd",pid=34126,fd=3))
ESTAB 0 0 192.168.1.13:36508 192.168.1.10:514 users:(("rsyslogd",pid=34126,fd=9))
LISTEN 0 25 :::514 :::* users:(("rsyslogd",pid=34126,fd=4))
[root@localhost ~]#logger "genshin is the best game in the world"
//向日志服务器发送日志
//日志服务器
[root@localhost ~]#tailf /var/log/messages
Jul 31 19:00:01 localhost systemd: Started Session 2 of user root.
Jul 31 19:00:01 localhost systemd: Starting Session 2 of user root.
Jul 31 19:01:01 localhost systemd: Started Session 3 of user root.
Jul 31 19:01:01 localhost systemd: Starting Session 3 of user root.
Jul 31 19:01:59 localhost systemd: Stopping System Logging Service...
Jul 31 19:01:59 localhost rsyslogd: [origin software="rsyslogd" swVersion="8.24.0" x-pid="31808" x-info="http://www.rsyslog.com"] exiting on signal 15.
Jul 31 19:01:59 localhost systemd: Starting System Logging Service...
Jul 31 19:01:59 localhost rsyslogd: [origin software="rsyslogd" swVersion="8.24.0" x-pid="34126" x-info="http://www.rsyslog.com"] start
Jul 31 19:01:59 localhost systemd: Started System Logging Service.
Jul 31 19:03:06 localhost root: genshin is the best game in the world
"http://www.rsyslog.com"] exiting on signal 15.
Jul 31 19:01:59 localhost systemd: Starting System Logging Service...
Jul 31 19:01:59 localhost rsyslogd: [origin software="rsyslogd" swVersion="8.24.0" x-pid="34126" x-info="http://www.rsyslog.com"] start
Jul 31 19:01:59 localhost systemd: Started System Logging Service.
Jul 31 19:03:06 localhost root: genshin is the best game in the world
//最后一行显示了服务器1发送来的日志
3.8 journalct 日志管理工具
CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)
配置文件存放于:/etc/systemd/journald.conf
命令格式 :journalctl
选项
常用选项
- -u 仅显示特定系统服务或单元的日志消息
- -b 仅显示特定引导过程的日志消息
- -p 仅显示特定优先级的日志消息
- -n 显示指定行数的日志消息
- -f 实时跟踪日志,持续显示新的日志消息
- --since= 和 --until=: 仅显示指定时间范围内的日志消息。