1. inode与block
1.1 inode和block概述
- 文件数据包括元信息与实际数据
- 文件存储在硬盘上,硬盘最小存储单位是“扇区",每个扇区存储512字节
- block (块)
- 连续的八个扇区组成一个block(一个块是4K大小)
- 是文件存取的最小单位
- inode (索引节点)
- 中文译名为“索引节点”,也叫节点
- 用于存储文件元信息
- 是文件读取的最小单位
总结: 操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。一个文件必须占用一个inode,但至少占用一个block
1.2 inode的内容
- inode包含文件的元信息
- 文件的字节数
- 文件拥有者的User ID
- 文件的Group ID
- 文件的读、写、执行权限
- 文件的时间戳
- `不包含文件名`
- 用stat和ls命令可以查看某个文件的inode信息
[root@localhost opt]# stat aa.txt
atime(accesstime): 当使用这个文件的时候就会更新这个时间。
mtime(modification time): 当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别。
ctime(status time): 当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,更像是change time,只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间。
[root@localhost opt]# ls -i
- inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区,存放 inode 所包含的信息。
- 每个 inode 的大小,一般是 128 字节或 256 字节。
- 通常情况下不需要关注单个 inode 的大小,而是需要重点关注 inode 总数。inode 的总数在格式化时就给定了,执行 “df -i” 命令即可查看每个硬盘分区对应的的 inode 总数和已经使用的inode 数量。
[root@localhost ~]# df -i
1.3 inode号的特殊作用
由于 inode 号码与文件名分离,导致Linux 系统具备以下几种特有的现象
- 文件名包含特殊字符,可能无法正常删除。这时直接删除 inode,能够起到删除文件的作用;
[root@localhost opt]# find ./ -inum 33554505 -exec rm -i {} \;
- 移动文件或重命名文件,只是改变文件名,不影响 inode 号码;
[root@localhost data]# mv a.txt /opt/123.txt
[root@localhost data]# ls -i /opt/
-
打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。
-
使用 vi 编辑器修改文件数据保存后,会生成一个新的 inode号码。
1.4 文件存储小结
- 访问文件的简单流程
用户访问文件时,通过文件名找到对应的inode号,通过Inode号获取inode信息,根据inode信息判断用户是否有权限访问文件,有则指向对于的数据block并读取数据,无则拒绝访问
- 磁盘分区后的结构
1.5 inode号小实验
- 问:磁盘空间还有,但无法创建文件
`答:inedo应该已经用完了`
- 实验验证: inode节点耗尽故障处理
使用fdisk创建分区/dev/sdb1,分区大小10M即可
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1 `使用ext4系统类型inode号误差会很小`
[root@localhost ~]# mkdir /test
[root@localhost ~]# mount /dev/sdb1 /test/ ##挂载
模拟inode节点耗尽故障
[root@localhost test]#for ((i=1; i<=2549; i++));do touch /test/file$i;done
或
[root@localhost test]#touch file{1..2549}.txt
新建文件看是否可以再创建
[root@localhost test]# touch 1.txt
删除文件恢复
[root@localhost test]#rm -rf /test/*
2. 软连接与硬连接
2.1链接文件
- 为文件或目录建立链接文件
- 链接文件分类 ||软链接|硬链接| |---|---|---| |删除原始文件后|失效|仍旧可用| |使用范围|适用于文件或目录|只可用于文件| |保存位置|与原始文件可以位于不同的文件系统中| 必须与原始文件在同一个文件系统(如一个Linux分区)内|
3. 恢复误删的文件
3.1 ext类型文件恢复
- 先将磁盘分区
[root@localhost ~]# fdisk /dev/sdb
- 刷新磁盘并查看磁盘分区
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# fdisk -l
- 格式化分区
[root@localhost ~]# mkfs.ext3 /dev/sdb1
- 磁盘分区挂载
[root@localhost ~]# mkdir /test
[root@localhost ~]# mount /dev/sdb1 /test/
[root@localhost ~]# df -Th
[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs ##下载依赖包
- 通过xftp将我们所需要的extundelete-0.2.4.tar.bz2压缩包上传到/test目录,进入/test目录并进行解压
[root@localhost test]# tar -xf extundelete-0.2.4.tar.bz2
- 进入extundelete-0.2.4目录,进行编译安装
[root@localhost test]# cd extundelete-0.2.4
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete &ake && make install
- 将/usr/local/extundelete/bin下所有的文件都软连接到/usr/bin下面,进入test目录创建文件
[root@localhost extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/ #*/
[root@localhost extundelete-0.2.4]# cd /test/
[root@localhost test]# echo a>a
[root@localhost test]# echo b>b
[root@localhost test]# echo c>c
[root@localhost test]# echo d>d
- 查看文件系统/dev/ode1下存在哪些文件。i节点是从2开始的,2代表该文件系统最开始的目录。
[root@localhost test]# extundelete /dev/sdb1 --inode 2
- 模拟删除实验
[root@localhost test]# rm -rf a b
[root@localhost test]# extundelete /dev/sdb1 --inode 2
- 对磁盘内容进行恢复
[root@localhost ~]# extundelete /dev/sdb1 --restore-all
- 恢复后会在当前目录下出现一个 RECOVERED_FILES文件,里面会存放被删除的文件
3.2 xfs 类型文件备份和恢复
-
CentOS7系统默认采用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命令查看)
- 实验配置
使用fdisk创建分区/dev/sdb1,格式化xfs文件系统
[root@localhost ~]# fdisk /dev/sdb
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# mkfs.xfs /dev/sdb1
[root@localhost ~]# mkdir /test1
[root@localhost ~]# mount /dev/sdb1 /test1/
在test1文件夹下添加文件准备实验
[root@localhost ~]# cd /test1/
[root@localhost ~]# cp /etc/passwd ./
[root@localhost ~]# mkdir abc
[root@localhost ~]# touch abc/123.txt
使用 xfsdump 命令备份整个分区
[root@localhost ~]# yum install -y xfsdump
[root@localhost ~]# rpm -qa | grep xfsdump
[root@localhost ~]# xfsdump -f /opt/dump_sdb1 /dev/sdb1
模拟数据丢失并使用 xfsrestore 命令恢复文件
[root@localhost ~]# cd /test1/
[root@localhost test1]# rm -rf ./* ##*/
[root@localhost test1]# ls
[root@localhost test1]# xfsrestore -f /opt/dump_sdb1 /test1/
4. 分析日志文件
4.1日志的功能
- 用于记录系统、程序运行中发生的各种事件
- 通过阅读日志,有助于诊断和解决系统故障
4.2 日志文件的分类
- 日志保存位置:
- 默认位于:/var/log 目录下
- 内核及系统日志
- 由系统服务rsyslog统一进行管理,日志格式基本相似
- 主配置文件/etc/rsyslog.conf
[root@localhost ~]# vim /etc/rsyslog.conf #查看rsyslog.conf配置文件
规则配置格式:[设备.级别 动作]
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info #表示info等级及以上的所有等级的信息都写到对应的日志文件里
mail.none #表示某事件的信息不写到日志文件里(这里比如是邮件)
- 用户日志
- 记录系统用户登录及退出系统的相关信息
- 程序日志
- 由各种应用程序独立管理的日志文件,记录格式不统一
注: Linux操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下
4.3 常见的一些日志文件:
- 内核及公共消息日志
/var/log/messages:记录Linux内核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。- 公共日志/var/log/messages 文件的记录格式
- 时间标签:消息发出的日期和时间。
- 主机名:生成消息的计算机的名称。
- 子系统名称:发出消息的应用程序的名称。
- 消息:消息的具体内容。
-
计划任务日志
- /var/log/cron:记录crond计划任务产生的事件信息。
-
系统引导日志
- /var/log/dmesg:记录Linux系统在引导过程中的各种事件信息。
-
邮件系统日志
- /var/log/maillog:记录进入或发出系统的电子邮件活动。
-
用户登录日志
/var/log/secure:记录用户认证相关的安全事件信息。- /var/log/lastlog:记录每个用户最近的登录事件。二进制格式
- /var/log/wtmp:记录每个用户登录、注销及系统启动和停机事件。二进制格式
- /var/run/btmp:记录失败的、错误的登录尝试及验证事件。二进制格式
4.4 用户日志分析
- 程序自己维护日志记录,httpd 网站服务程序使用两个日志文件
access_log #记录客户访问事件
error_log #记录错误事件。
也可以使用tail -f 实时跟踪日志信息
[root@localhost ~]# tail -f /var/log/secure
-
设备字段说明 |设备字段|说明| |---|---| |auth | 用户认证时产生的日志 |authpriv | ssh、ftp等登录信息的验证信息 |daemon | 一些守护进程产生的日志 |ftp | FTP产生的日志 |lpr | 打印相关活动 |mark | rsyslog服务内部的信息,时间标识 |news | 网络新闻传输协议(nntp)产生的消息。 |syslog | 系统日志 |uucp | Unix-to-Unix Copy 两个unix之间的相关通信 |console | 针对系统控制台的消息。 |cron | 系统执行定时任务产生的日志。 |kern | 系统内核日志 |local0~local7 | 自定义程序使用 |mail | 邮件日志 |user | 用户进程
-
由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf。
- 软件包:rsyslog-8.24.0-12.el7.x86_64 (可使用 ”rpm -q“ 命令查看)
- 主要程序:/sbin/rsyslogd
- 配置文件:/etc/rsyslog.conf (可使用 ”rpm -qc“ 命令查看)
-
Linux系统内核日志消息的优先级别(数字等级越小,优先级越高,消息越重要)
| 等级 | 说明 |
|---|---|
| 0 | EMERG(紧急):会导致主机系统不可用的情况。如系统崩溃 |
| 1 | ALERT(警告):必须马上采取措施解决的问题。如数据库被破坏 |
| 2 | CRIT(严重):比较严重的情况。如硬盘错误,可能会阻碍程序的部分功能 |
| 3 | ERR(错误):运行出现错误。不是非常紧急,尽快修复的 |
| 4 | WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。不是错误,如磁盘用了85%等 |
| 5 | NOTICE(注意):不会影响正常功能,但是需要注意的事件。无需处理 |
| 6 | INFO(信息):一般信息。正常的系统信息 |
| 7 | DEBUG(调试):程序或系统调试信息等。包含详细开发的信息,调试程序时使用 |
| none | 没有优先级,不记录任何日志消息。 |
- 举例:
mail.info /var/log/maillog :比指定级别更高的日志级别,包括指定级别自身,保存到/var/log/maillog中
mail.=info /var/log/maillog :明确指定日志级别为info,保存至/var/log/maillog
mail.!info /var/log/maillog :除了指定的日志级别(info)所有日志级别信息,保存至/var/log/maillog
*.info /var/log/maillog :所有facility的info级别,保存至/var/log/maillog
mail.* /var/log/maillog :mail的所有日志级别信息,都保存至/var/log/maillog
mail.notice;news.info /var/log/maillog :mail的notice以上记得日志级别和news的info以上的级别保存至/var/log/maillog
mail,news.crit -/var/log/maillog :mail和news的crit以上的日志级别保存/var/log/maillog中;“-”代表异步模式
5. 配置日志服务器收集日志
- rsyslog是一个C/S架构,可以通过套接字来进行监听记录工作,可以基于TCP和UDP工作,默认的监听端口是514,只需要在MODULES打开即可。
发送服务器:客户端 192.168.80.20
收集服务器:服务端 192.168.80.30
- 关闭服务端和客户端防火墙、selinux
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
- 修改客户端配置文件,并启动服务
[root@localhost ~]# vim /etc/rsyslog.conf
#### MODULES ####
#将下面四行前的注释取消掉
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
#### RULES ####
#添加下列内容
$template myFormat, "%timestamp% %hostname% %syslogseverity-text% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate myFormat
*.info;mail.none;authpriv.none;cron.none @@192.168.200.100:514
[root@localhost ~]#systemctl restart rsyslog
#%timestamp% :时间戳
#%fromhost-ip% :接收的信息来自于哪个节点的 IP
#%hostname% :主机名
#%syslogseverity-text% :日志等级
#%syslogtag% :服务进程
#%msg% :日志内容
#接收方 IP 前面一个 @ 表示 TCP 传输,两个 @ 表示 UDP 传输
- 修改服务端配置文件,并启动服务
[root@localhost ~]#vim /etc/rsyslog.conf
#将下面四行前的注释取消掉
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
#添加以下内容
$AllowedSender tcp, 192.168.80.0/24 #允许 192.168.80.0 网段内的主机以tcp协议来传输
$template Remote,"/data/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log" #定义模板,接受日志文件路径,区分了不同主机的日志
:fromhost-ip, !isequal, "127.0.0.1" ?Remote #过滤掉 server 本机的日志
[root@localhost ~]#systemctl restart rsyslog
- 在服务端创建/data/log目录,以接受大量日志信息,配置文件中的路径应当与该路径一致
[root@localhost ~]#mkdir -p /data/log
- 验证
- 客户端的终端命令行输入或者重启一个服务
[root@localhost ~]#logger "hello world"
- 在服务端查看日志文件
[root@localhost ~]#tree /data/log/
6. journalctl 日志管理工具
-
日志管理工具journalctl是centos7上专有的日志管理工具,该工具是从messages这个文件里读取信息。 Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。
-
日志的配置文件是/etc/systemd/journald.conf
-
查看所有日志(默认情况下,只保存本次启动的日志)
journalctl
journalctl -r #-r表示倒序,从尾部看(推荐)
- 查看内核日志(不显示应用日志)
journalctl -k
- 查看系统本次启动的日志
journalctl -b [-0]
- 查看上一次启动的日志(需更改设置,如上次系统崩溃,需要查看日志时,就要看上一次的启动日志)
journalctl -b -1
- 显示尾部指定行数的日志
查看的是/var/log/messages的日志,但是格式上有所调整,如主机名格式不一样而已
journalctl -n 20 [-f]
- 查看某个服务的日志
journalctl -u nginx.service [-f]
- 查看指定进程的日志
journalctl _PID=1
- 查看指定用户的日志
journalctl _UID=0 --since today
journalctl -xe
-x 是目录(catalog)的意思,在报错的信息下会,附加解决问题的网址
-e pager-end 从末尾开始看
7. rsyslog 收集 apache 日志
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
ErrorLog logs/error_log
- 方法一
ErrorLog syslog #修改配置表示对 error_log 启用 syslog
LogLevel notice #notice 及以上的 log 全部记录,默认的 facility 是 local7
- 方法二
ErrorLog "|/usr/bin/logger -p local5.notice"
#error_log 全部通过管道写入 syslog,并且 log 的 facility 配置为 local5
#LogLevel warn
#CustomLog logs/access_log combined
CustomLog "|/usr/bin/logger -p local4.info" combined
#access_log全部通过管道写入syslog,并且log的facility配置为local4
#logger -p 指定输入消息的优先级,优先级可以是数字或者指定为 "facility.level" 的格式