1 inode和block
1.1 inode和block概述
-
文件数据包括元信息与实际数据。
-
文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节。
-
block(块)
- 连续的八个扇区组成一个block
- 是文件存取的最小单位
-
inode(索引节点)
- 中文译名为“索引节点”,也叫 i 节点
- 用于存储文件元信息
- 一个文件必须占用一个inode ,至少占用一个block
1.2 inode和block关系
文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节
一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的
inode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个或多个文件名
2 inode 详细介绍
2.2.1 inode 表结构
每个文件的属性信息,比如:文件的大小,时间,类型,权限等,称为文件的元数据(meta data)。
元数据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。
每一个inode表记录对应保存了文件的元信息:
- inode number 节点号
- 文件类型
- 文件的读、写、执行权限
- 文件属主的UID
- 文件属组的GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
2.2.2 Linux系统文件三个主要的时间属性
-
atime(access time):最近访问
最后一次访问文件的时间
-
mtime(modify):最近更改
最后一次更改文件内容的时间
-
ctime(change time):最近改动
最后一次改变文件元信息的时间
查看inode号的命令:
查看文件名对应的inode号
ls -i 123.tex
查看inode信息中的inode号码
stat 123.tex
2.2.3 目录文件的结构
目录是个特殊文件,目录文件的内容保存了此目录中文件的列表,以及inode number对应关系。
- 目录文件的结构非常简单,就是一系列目录项(dirent)的列表。
- 每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
- 一个目录是目录下的文件名和文件inode号之间的映射。
- 每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
- Linux系统内部不使用文件名,而使用inode号码来识别文件。
- 对于用户,文件名只是Inode号码便于识别的别称。
2.3 inode的号码
用户通过文件名打开文件时,系统内部的过程:
(1) 系统找到这个文件名对应的inode号
(2) 通过inode号,获取inode信息
(3)根据inode信息,找到文件数据所在的block,读出数据
2.4 inode 与文件存储
2.5 inode 的大小
-
inode也会消耗硬盘空间
- 每个inode的大小一般是128字节或256字节
-
格式化文件系统时确定inode的总数
- 如果磁盘还有空间,但inode号被全部占用,也无法创建新文件。
- inode号在同一个文件系统内唯一,在不同的文件系统中可以重复。
使用 "df -i" 命令可以查看每个硬盘分区的inode总数和已经使用的数量
2.6 inode的特殊作用
1)当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
2)在同一个文件系统中移动或重命名文件时,只改变文件名,不影响inode号码。
3)打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名
4)使用 vi 编辑器修改文件数据保存后,会生成一个新的 inode 号码
find /opt -inum 34376268 -exec rm -rf {} \; 查找对应的inode号并删除
find ./ -inum 50464299 -delete --- 同上
2.7 EXT 类型文件恢复
extundelete 是一个开源的 Linux 数据恢复工具,支持 ext3、ext4文件系统。(ext4只能在centos6版本恢复)
首先使用fdisk创建分区/dev/sdb1,格式化ext3文件系统,并挂载
extundelete /dev/sdb1 --restore-all //恢复删除的文件,恢复所有
(这个要切换到挂载点目录外面操作)
extundelete /dev/sdb1 --inode 2 #查看文件系统/dev/sdc1下存在哪些文件,i 节点是从 2 开始的,2 代表该文件系统最开始的目录。
extundelete /dev/vdb1 --restore-inode 14 //根据inode号恢复
extundelete /dev/vdb1 --restore-all //恢复所有
extundelete /dev/vdb1 --restore-directory deletetest //恢复目录
extundelete /dev/vdb1 --restore-file passwd //恢复文件
2.8 xfs 类型文件备份和恢复
CentOS 7 系统默认采用 xfs类型的文件,xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。
xfsdump 的备份级别有两种:0 表示完全备份;1-9 表示增量备份。xfsdump 的备份级别默认为 0。
xfsdump 的命令格式为:
xfsdump -f 备份存放位置 要备份的路径或设备文件
xfsdump 命令常用的选项:
-f:指定备份文件目录
-L:指定标签 session label
-M:指定设备标签 media label
-s:备份单个文件,-s 后面不能直接跟路径
xfsdump使用限制:
1.只能备份已挂载的文件系统
2.必须使用root的权限才能操作
3.只能备份XFS文件系统
4.备份后的数据只能让xfsrestore解析
5.不能备份两个具有相同UUID的文件系统(可用 blkid命令查看)
3 日志文件介绍与分析
日志的功能:
- 用于记录系统、程序运行中发生的各种事件
- 通过阅读日志,有助于诊断和解决系统故障
日志文件的分类:
-
内核及系统日志:
这种日志数据由系统服务rsyslog统一管理,根据其主配置文件/etc/rsyslog.conf中的设置,决定将内核消息及各种系统程序消息记录到什么位置。日志格式基本相似。
-
用户日志:
记录用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。
-
程序日志:
有些应用程序会选择由自己独立管理一份日志文件(而不是交给rsyslog服务管理),用于记录本程序运行过程中的各种事件信息。记录格式不统一。
日志保存位置:
- 默认位于:/var/log 目录下
主要日志文件介绍:
日志 | 位置 | 描述 |
内核及公共消息日志 | /var/log/messages | 它是核心系统日志文件,其中包含了系统启动时的引导信息,以及系统运行时的其他状态消息。I/O 错误、网络错误和其他系统错误都会记录到此文件中。其他信息,比如某个人的身份切换为 root,以及用户自定义安装软件的日志,也会在这里列出。 |
计划任务日志 | /var/log/cron | 记录与系统定时任务相关的曰志 |
系统引导日志 | /var/log/dmesg | 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息 |
邮件系统日志 | /var/log/maillog | 记录邮件信息的曰志 |
系统引导日志 | /var/log/dmesg | 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息。 |
邮件系统日志 | /var/log/maillog | 记录邮件信息的曰志 |
用户登录日志: | /var/log/lastlog | 记录系统中所有用户最后一次的登录时间的曰志。这个文件是二进制文件.不能直接用 vi 查看,而要使用 lastlog 命令查看。 |
/var/log/secure | 记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录。比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中。 | |
/var/log/wtm | 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样,这个文件也是二进制文件,不能直接用 vi 查看,而要使用 last 命令查看。 |
3.2 内核及系统日志
由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf。
- 软件包:rsyslog-8.24.0-12.el7.x86_64 (可使用 ”rpm -q“ 命令查看)
- 主要程序:/sbin/rsyslogd
- 配置文件:/etc/rsyslog.conf (可使用 ”rpm -qc“ 命令查看
日志消息的级别:
级号 | 消息 | 级别 | 说明 |
0 | EMERG | 紧急 | 会导致主机系统不可用的情况 |
1 | ALERT | 警告 | 必须马上采取措施解决的问题 |
2 | CRIT | 严重 | 比较严重的情况 |
3 | ERR | 错误 | 运行出现错误 |
4 | WARNING | 提醒 | 可能会影响系统功能的事件 |
5 | NOTICE | 注意 | 不会影响系统但值得注意 |
6 | INFO | 信息 | 一般信息 |
7 | DEBUG | 调试 | 程序或系统调试信息等 |
日志记录的一般格式:
- 事件产生的时间。
- 产生事件的服务器的主机名。
- 产生事件的服务名或程序名。
- 事件的具体信息。
3.3 用户日志分析
保存了用户登录、退出系统等相关信息:
- /var/log/lastlog:最近用户登录事件。二进制文件,使用 lastlog 命令查看。
- /var/log/secure:与用户验证有关的安全性事件。
- /var/log/wtmp:用户登录、注销,及系统开、关机事件。二进制文件,使用 last 命令查看。
- /var/run/utmp:当前登录的每个用户的详细信息。二进制文件,使用w、who、users等命令查看。
分析工具:
- users、who、w、last、lastb
1)users:查询最近三次登录的用户信息
users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。 如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。
2)who:查看当前登录的用户、终端、登录时间、IP地址。
who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可
以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用
户名、终端类型、登录日期及远程主机。
3)w:查看当前登录的用户、终端、IP地址、登录时间、占用CPU的情况、进程等。
w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的 输出内容要丰富一些。
4)last: 读取 /var/log/wtmp 文件,显示登录系统的用户信息。
last 命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。通过 last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前 主机可能已被入侵。
5)lastb:读取 /var/log/btmp 文件,显示登入系统失败的用户信息。
lastb 命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除 了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息。
3.4 程序日志分析
由相应的应用程序独立进行管理:
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等专用日志分析工具
3.5 日志管理策略
-
及时做好备份和归档
-
延长日志保存期限
-
控制日志访问权限
- 日志中可能会包含各类敏感信息,如账户、口令等。
-
集中管理日志
-
将服务器的日志文件发到统一的日志文件服务器
-
便于日志信息的统一收集、整理和分析
-
杜绝日志信息的意外丢失、恶意篡改或删除
-
4 内核及系统日志管理
4.1 系统日志相关服务
- syslogd: system application 记录应用日志
- klogd: linux kernel 记录内核日志
事件记录格式:
- 日期时间 主机 进程[pid]: 事件内容
4.1.2 rsyslog 系统日志服务
rsyslog是CentOS 6以后版本的系统管理服务:它提供了高性能,出色的安全性和模块化设计。尽管rsyslog最初是常规的syslogd,但发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地。
当应用有限的处理时,RSYSLOG每秒可以将超过一百万的消息传递到本地目的地。即使在远程的目的地和更精细的处理中,性能通常也被认为是惊人的”。
rsyslog 特性:
- 多线程
- UDP, TCP, SSL, TLS, RELP
- MySQL, PGSQL, Oracle实现日志存储
- 强大的过滤器,可实现过滤记录日志信息中任意部分
- 自定义输出格式
- 适用于企业级中继
4.1.3 ELK
ELK:由Elasticsearch、Logstash、Kibana三个软件组成。
- 非关系型分布式数据库基于apache软件基金会jakarta项目组的项目lucene
- Elasticsearch是个开源分布式搜索引擎,可以处理大规模日志数据,比如:Nginx、Tomcat、系统日志等功能
- Logstash对日志进行收集、分析,过滤,并将其存储供以后使用
- Kibana 可以提供的日志分析友好的 Web 界面
4.2 rsyslog管理
4.2.1 系统日志术语
facility:设施,从功能或程序上对日志进行归类
auth(验证), authpriv, cron(定时任务), daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, syslog #自定义的分类
Priority 优先级别,从低到高排序
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
服务名称(即什么服务产生的日志)
服务名称 | 说明 |
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系统进行数据传递的协议,后来 也常用在新闻组服务中 |
4.2.2 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
4.2.3 rsyslog 配置文件
/etc/rsyslog.conf 配置文件格式(由三部分组成):
- MODULES:相关模块配置
- GLOBAL DIRECTIVES:全局配置
- RULES:日志记录相关的规则配置
查看/etc/rsyslog.conf 文件中的RULES模块:
RULES配置格式:
4.3 rsyslog 应用实例
4.3.1 将ssh服务的日志单独设置
实验步骤:
步骤1:修改rsyslog服务的配置文件/etc/rsyslog.conf,设置LOCAL0对应的日志路径。
步骤2:修改ssh服务的配置文件/etc/ssh/sshd_config,将ssh的日志修改为记录在LOCAL0对应的路径下。
步骤3:重启 rsyslog 服务和 ssh 服务。
步骤4:打开第二台机器,远程连接原服务器。故意输错2次密码,稍后查看原服务器的日志。
4.3.2 网络日志(远程日志功能)
远程日志,即通过网络,将本地的日志远程备份到另一台机器,这样,就算本机系统崩溃,我们可以查看另一台机器备份的日志,来排查故障。
实验思路:
假设服务器A需要将日志备份到服务器B,那么A是发送方,B是接收方。
接受双方需要开启TCP功能(或UDP功能)和514接口,发送方需填写想要传输的日志和接收方的地址。
实验步骤:
步骤1:接收方开启TCP功能和514端口(编辑rsyslog的配置文件 /etc/rsyslog.conf)。
关闭防火墙;
编辑配置文件,开启TCP功能和514端口(去掉这两行原有的#号);
重启rsyslog 服务;
检查514端口是否开启。
步骤2:发送方填写需要传输的日志和接收方的IP地址(编辑配置文件 /etc/rsyslog.conf)。
关闭防火墙;
编辑配置文件,填写需要传输的日志和接收方地址;
重启rsyslog 服务;
测试日志打印。
步骤3:查看接收方能否成功接收日志记录。
切换到接收方查看日志
5 日志管理工具 journalctl
CentOS 7 以后,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核及系统日志和应用日志)。
日志的配置文件:
/etc/systemd/journald.conf
journalctl命令格式:
journalctl [OPTIONS...] [MATCHES...]
journalctl | 查看所有日志。 默认情况下,只保存本次启动的日志。 |
journalctl -r | -r表示倒序,从尾部看(推荐) |
journalctl -k | 只查看内核日志(不显示应用日志) |
journalctl -b | 查看本次启动的日志 journalctl -b -0,//查看本次启动的日志/ journalctl -b -1,查看上一次启动的日志 |
journalctl --since | 查看指定时间的日志。 "2022-03-05 18:10:30" "20 min ago" yesterday "2022-03-05" --until "2022-03-10 03:00" 09:00 --until "1 hour ago" |
journalctl -n | 显示尾部指定行数。默认10行。 |
journalctl -f | 实时滚动显示最新日志(显示最新10行) |
journalctl /usr/lib/systemd/systemd | 查看指定服务的日志 |
journalctl _PID=1 | 查看指定进程的日志 |
journalctl _UID=33 | 查看指定用户的日志 |
journalctl -u | 查看某个 Unit 的日志 |
journalctl -p | 查看指定优先级的日志,表示仅显示小于或等于此等级的日志 |
journalctl --vacuum-time=1years | 指定日志文件保存多久 |
journalctl --no-pager | 日志默认分页输出,--no-pager 改为正常的标准输出 |