一、 inode(索引节点/i节点)与block(块)
1.inode与block的概念
1.1 什么是block?
文件储存在硬盘上的,硬盘最小的存储单位叫“扇区”,每个扇区存储512个字节
一般连续8个扇区会组成一个“块”(block),一个块是4K大小,是文件存取的最小单位。
文件名存储在目录文件当中
文件数据包含实际数据与元信息(类似于文件属性),文件数据是存储在“块”当中,
1.2 什么是inode?
存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域叫做inode(除文件名以外的所有文件属性和信息) 。因此,一个文件必须占用一个inode,并且至少占用一个块。
inode不包括文件名,文件名是存放在目录当中的,Linux系统中一切皆文件,因此目录也是一种文件。
每个inode都有一个号码,操作系统是用inode号来识别不同的文件。Linux系统内部不使用文件名来识别文件,而是使用inode号来识别文件。对于系统来说,文件名只是inode号便于识别的别称,文件名与inode号使一一对应关系,每个inode号对应一个文件名。
1.3 如何查看inode号
查看文件对应的inode号有以下两种方式:
- ls -i
2. stat +[指定文件]
2. inode的内容
2.1 Linux系统文件的三个主要时间属性
1.ctime(change time)
最后一次改变文件或目录(属性)的时间
2.atime(access time)
最后一次访问文件或目录的时间
3.mtime(modify time)
最后一次修改文件或目录(内容)的时间
举例:
PS:修改文件的内容会影响文件的大小,文件大小属于文件属性内容,所以mtime,ctime均会改变。
2.2 inode与文件/目录对应关系
-
目录文件的结构
- 目录也是一种文件
- 目录文件的结构
-
每个inode都有一个号码,操作系统用inode号码来识别不同的文件
-
Linux系统内部不适用文件名,而使用inode号来识别文件
-
对于用户、文件名只是inode号码便于识别的别称
2.3 系统访问文件的过程
-
用户通过文件名打开文件时,系统内部的过程
- 系统找到这个文件名对应的inode号码
- 通过inode号码,获取inode信息
- 根据inode信息的权限,查看用户是否具有访问文件的权限,有权限则找到文件数据所在的block,读出数据;没有权限则拒绝访问
2.4 如何删除inode号?
由于inode号与文件名分离,导致Linux系统具备以下几种特有的现象:
- 文件名包含特殊字符,可能无法正常删除。这时直接删除inode号,能够起到删除文件的作用
- 移动文件或重命名文件,只是改变文件名,不影响inode号码
- 打开一个文件以后,系统就以inode号来识别这个文件,不再考虑文件名
- 使用vi编辑器修改文件数据保存后,会生成一个新的inode号
rm命令只能通过文件名删除,无法通过inode号码删除,遇到含有特殊字符的文件,只能通过inode号进行删除,如果想通过inode号删除有以下三种方法:
补充:vim编辑器修改文件内容,实际上是将一个新的文件与原文件进行替换操作
我们在一个端口打开我们创建的123.txt文件:
然后我们观察另一个端口文件所在目录:
从上图我们可以看到,vim编辑文件时会创建一个隐藏文件,编辑保存后,会将该文件与原文件进行替换操作,所以inode号会有所改变,使用echo直接修改文件内的内容不会改变文件inode号。
2.5 inode号实验
实验:模拟inode号已经被使用耗尽,存在可用空间却无法创建新文件的情况
实验条件:拥有额外的两块硬盘
如上图,我们为什么要创建ext4类型的文件系统没有使用xfs的常用格式,是因为xfs类型的文件系统统计空间时并不没有ext4格式那么准确,本身的可创建数量可能偏高于给出的可用数量
接下来我们要创建相对应数量的文件(2549个):
从上面操作,我们可以看到虽然我们分区仍然有可用空间,但是我们的inode号已经使用完了,因此无法创建文件。
3. 实验:如何恢复EXT类型的文件
首先我们需要使用到一个名为extundelete的数据恢复工具,这款开源的Linux数据恢复工具,仅支持ext3、ext4文件系统类型的磁盘恢复数据,其中(ext4的文件类型只能在centos6版本中恢复),所以我们这次实验仅使用ext3的文件类型作为恢复用的磁盘文件类型。
3.1 实验准备
建立一个文件系统类型为ext3的磁盘分区:
3.2 Linux系统中下载文件
命令1:
wget http://... [-o] #wget后面跟指定路径 -o指定下载目录
命令2:
curl -L http://... [-o] #curl -L选项指定下载的路径 -o指定下载的目录
以上两种方式如果不加-o选项,那么下载的内容将保存在当前路径
3.3 编译安装extundelete
- 安装依赖包
- e2fsgprogs-libs-1.41.12-18.el6.x86_64rpm
- e2fsgprogs-devel-1.41.12-18.el6.x86_64rpm
- 配置、编译及安装
- extundelete-0.2.4.tar.bz2
配置configure配置文件
3.4 演示误删除操作
extundelete /dev/sdc1 --inode 2 #仍然使用该命令查看inode号以2开始的文件
3.5 进行文件的恢复
在我们进行文件的恢复之前,一定要进行解挂载的操作,因为在我们工作环境中,数据是会不断进行写入到磁盘空间中的,为了防止之前被删除文件的内容被其他新的文件所替换,我们第一时间先进行解挂载,然后再进行恢复工作
所以在我们删除文件时,最好情况下是做一个备份文件,在经过一定时间之后,文件仍不被需要,我们再进行删除操作。
二、如何进行文件的备份
2.1 xfs类型文件备份与恢复
- Centos 7 系统默认采用xfs类型的文件,xfs类型的文件可以使用xfsdump与xfsrestore工具进行备份恢复。
- xfsdump的备份级别有两种:0表示完全备份;1-9表示增量备份。sfsdump的备份级别默认为0。
- 完全备份效率较低,占用磁盘空间高,存在每次的备份都有重复数据备份的情况;增量备份只会去备份上次备份结束后新增加的文件数据。
2.2 xfsdump命令
1. xfsdump命令格式
xfsdump -f #指定备份文件存放的位置 选项后加上需要备份的目录
2. 如何进行备份
① 准备工作
准备一个xfs文件类型系统的磁盘,挂载后,将系统文件复制到磁盘中
② 备份磁盘内容
可以在命令后使用-L选项加上指定标签 -M选项加上指定设备标签进行免交互的备份操作
③ 模拟删除磁盘里的文件并使用备份恢复
三、linux日志分析
3.1 日志的功能
- 用于记录系统、程序运行中发生的各种事件
- 通过阅读日志,有助于诊断和解决系统故障
3.2 日志文件的分类
-
内核及系统日志
- 由系统服务rsyslog统一进行管理,日志格式基本相似
- 主配置文件/etc/rsyslog.conf
-
用户日志
- 记录系统用户登录及退出系统的相关信息
-
程序日志
- 由各种应用程序独立管理的日志文件,记录格式不统一
3.3 日志保存位置
- 默认位于/var/log目录下,常用的日志文件如下所示:
| 日志文件及所处位置 | 功能 |
|---|---|
| 内核及公共消息日志(/var/log/message) | 主要记录Linux内核消息及各种应用程序的公共日志信息,包括启动、I/O错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以在该日志文件中获得相关的时间记录信息 |
| 计划任务日志(/var/log/cron) | 记录crond计划任务产生的时间信息 |
| 系统引导日志(/var/log/dmesg) | 记录Linux系统在引导过程中的各种事件信息 |
| 邮件系统日志(/var/log/maillog) | 记录进入或发出系统的电子邮件活动 |
| 用户登录日志(/var/log/)(secure;lastlog;wtmp;btmp) | secure记录用户认证相关的安全事件信息; lastlog记录每个用户最近的登陆事件(二进制格式); wtmp记录每个用户登录、注销及系统启动和停机事件(二进制格式); btmp记录失败的、错误的登录尝试及验证事件(二进制格式) |
3.4 日志配置文件详情
系统日志由系统服务rsyslog统一管理
主要程序:/sbin/rsyslogd
配置文件:/etc/rsyslog.conf
1. 日志配置文件字段相关含义
首先,进入/etc/rsyslog.conf配置文件中查看配置内容
*.info #表示info等级及以上的所有等级的信息都写道对应的日志文件中
cron.none #表示某事件的信息不写入日志文件中(比如计划任务所产生的时间信息)
- 设备字段说明: 字段 | 含义 | | ------------- | ------------------------------ | | 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 | 用户进程|
2. 日志消息优先级
- Linux系统内核日志消息的优先级别(数字越小,优先级越高,消息越重要)
| 数字 | 优先级 |
|---|---|
| 0(EMERG) | 紧急:会导致主机系统不可用的情况。比如系统崩溃 |
| 1(ALERT) | 警告:必须马上才需措施解决的问题。比如数据库被破坏 |
| 2(CRIT) | 严重:比较严重的情况。比如硬盘错误,可能会阻碍程序的部分功能。 |
| 3(ERR) | 错误:运行出现错误。并不是需要尽快修复,非常紧急的 |
| 4(WARNING) | 提醒:可能影响系统功能,需要提醒用户的重要事件。不属于错误,比如磁盘空间使用过多。 |
| 5(NOTICE) | 注意:不会影响正常功能,但是需要注意的事件,无需处理。 |
| 6(INFO) | 信息:一般信息,正常的系统信息。 |
| 7(DEBUG) | 程序或系统调试信息等。包含详细开发的信息,调试程序时使用。 |
| none(相当于除去前面的日志) | 没有优先级,不记录任何日志消息。 |
举例:
mail.info /var/log/maillog #比指定级别更高的日志级别,包括指定级别自身,保存到/var/1og/maillog中
mail.=info /var/log/maillog #明确指定日志级别为info,保存至/var/log/maillog
mail.!info /var/1og/maillog #除了指定的日志级别(info)所有日志级别信息,保存至/var/1og/maillog中
*.info /var/1og/maillog #所有文件info级别以上的日志,保存至/var/1og/maillog
mail.* /var/1og/maillog #mail的所有日志级别信息,都保存至/var/1og/maillog
mail.notice;news.info /var/log/maillog #表示mail的notice级别以上的日志和news的info级别以上的日志都保存至/var/log/maillog