文章目录
一、深入理解Linux文件系统
一个新的操作系统的文件数据除了内容外,往往还有着非常多的属性,文件系统通常会将这两部分分开存放,分别存放在inode和block中。
那么什么是inode?什么是block呢?
1.1 inode与block
要理解inode与block,我们首先得从文件的存储讲起。
- 文件是存储在硬盘上的,硬盘的最小存储单位是扇区(sector),每一个扇区存储512个字节。
- 操作系统读取硬盘信息,不会一个一个扇区读取,是一次性连续读取多个扇区,也就是一次性读取一个块(block)
- “块”是文件存取的最小单位,最常见的4K,连续的8个扇区组成一个Block块,512字节*8=4096字节,我们固态硬盘分区时要求的4k对齐也就是这个。
- 文件存储在块中,文件的创建者、创建日期、文件大小等属性我们称之为元信息,也需要找一个地方存储,存储元信息的区域就是inode,我们称之为“索引节点”,也就是i节点。
- 一个文件必须占用一个inode,至少占用一个block。
文件的数据包括二部分:1、元信息(inode) 2、实际数据(block)
1.2 inode的内容
我们可以使用stat命令查看某个文件的inode信息。
从上可以看出,inode包括很多的文件元信息,比如文件的字节数、i节点号、文件拥有者的userid、文件的groupid,文件的权限、时间戳等等,但是不包含文件的文件名。
Linux系统文件有三个主要的时间属性,分别是ctime(change time),atime(access time), mtime(modify time)
- ctime(change time) 是最后一次改变文件或目录(属性)的时间,例如执行 chmod, chown 等命令;
- atime(access time)是最后一次访问文件或目录的时间;
- mtime(modify time)是最后一次修改文件或目录(内容)的时间
为什么inode不包括文件名?
因为文件名是存放在目录当中的,在Linux系统中一切皆文件,所以目录也是一种文件,下面的表格就是目录文件的结构,每一列就是一个目录项。
文件名1 | 文件名2 |
---|---|
inode号码1 | inode号码2 |
1.3 inode号码
操作系统用inode号码来识别不同的文件,每个文件都有一个inode号码,Linux系统内部不使用文件名来识别文件,用的就是inode号码来识别文件,对于操作系统来说,文件名就是inode号码。
一个文件被打开,在系统内部的过程大致分以下三步:
- 系统找到文件名对应的inode号码
- 通过inode号码获取inode信息
- 根据inode信息,找到文件数据所在的block,读出数据
除了stat命令查看inode号码,还可以通过ls -i命令查看文件的inode号码
当用户在linux系统中视图访问一个文件时候,系统会根据文件名去查找对应的inode,看该用户是否具有访问这个文件的权限,如果有,就指向对应的数据block,如果没有,就返回 permission deied ,而一块硬盘分区后的结构则如下:
文件-------目录项--------目录
元信息-----inode-------inode表区块
数据------block-------block数据块
1.4 inode的大小
inode也会消耗硬盘空间,每个inode的大小一般是128字节或者256字节。inode的总数在格式化的时候就会给定。执行命令“df -i”就可以查看每个硬盘分区的inode总数和已经使用的数量。
因为文件名与inode是分离的,所以可能会出现以下现象:
- 文件名包含特殊字符,可能无法正常删除。这时直接删除 inode,能够起到删除文件的作用;
- 移动文件或重命名文件,只是改变文件名,不影响 inode 号码;
- 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。
1.5 i节点号耗尽
因为每一个文件都必须占用一个inode号码,且inode号码是有限的,就可能会出现一种状况,就是我们磁盘空间仍然存在,但是我们无法在硬盘上创建新文件。这种情况的发生就是由于我们的inode号码用光导致的。往往是因为我们文件中产生了很多字节小,数量多的缓存文件,一些人也会利用这个进行攻击。
解决方法就是我们找到这些文件的存储位置,对这些小文件进行转移或删除。如果是很多用户公用的文件系统,我们可以用磁盘配额来解决这个问题。
二、 详细解释硬链接与软连接
一般我们所说的软链接类似于微软的快捷方式,硬链接相当于对原文件进行了复制,这种说法在我们刚刚了解了inode与block以后,我们会发现这样的说法不正确。
2.1 硬链接
通过文件系统的inode链接来产生新的文件名,而不是产生新文件,这就是硬链接。inode信息中的链接数会加1。
下图简单的说明了硬链接的特点
- 硬链接产生了新的文件名,新的文件名的inode号码没变,还是指向原来的block
- 我们单独删除硬链接中的任何文件名都不会影响到我们读取原文件
- 当一个文件拥有多个硬连接时,对文件内容修改,会影响所有文件名,但是删除一个文件名,不会影响另外一个文件名称访问,删除一个文件名,只会inode中的连接数减1
- 不能对目录做硬连接
文件名1--------node节点(abc)--------数据
|
文件名2--------node节点(abc)---------
2.2 软链接
软连接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件名称。例如,文件A和B的inode号码虽然不一样,但是文件A的内容是文件B的路径,读取文件A时系统会自动访问者导向文件B,这时,文件A就称为文件B的‘软链接’或者符号连接。这里的链接数不会发生变化。
文件名1--------node节点(abc)--------数据
|
文件名2--------node节点(cde)
软链接特点
- 产生一个新的inode号码,新inode号码指向原来的inode号码
- 删除原来的inode会导致新的inode也无法打开文件
三、 恢复误删文件
我们删除一个文件,只是在这个文件的父目录里面的block中删除了这个文件的额名字,并不会清除inode节点和block数据。Linux是通过link的数量来控制文件删除的,只有当一个文件不存在link时,这个文件才会被删除。
在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过“回收站”找回的情况,比如使用“rm -rf”来删除数据。
接下来我们以extundelete软件恢复误删数据来演示。
3.1 extundelete软件恢复误删数据
extundelete 是一个开源的 Linux 数据恢复工具,支持 ext3、ext4 文件系统。
在数据被误删除后,第一时间要做的就是卸载被删除数据所在的分区,如果是根分区的数据遭到误删,就需要将系统进入单用户模式,并且将根分区以只读模式挂载。这样做的原因很简单,因为将文件删除后,仅仅是将文件的 inode节点中的扇区指针清零,实际文件还存储在磁盘上,如果磁盘继续以读写模式挂载,这些已删除的文件的数据块就可能被操作系统重新分配出去,在这些数据库被新的数据覆盖后,这些数据就真的丢失了,恢复工具也无力回天。所以以只读模式挂载磁盘可以尽量降低数据库中数据被覆盖的风险,以提高恢复数据成功的比例。
使用extundelete软件恢复误删文件步骤:
1.编译安装 extundelete
[root@localhost opt]# yum -y install e2fsprogs-devel e2fsprogs-libs //安装 extundelete软件的两个依赖包
[root@localhost ~]# yum -y install wget //安装wget
[root@localhost opt]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 //用wget下载extundelete软件
[root@localhost opt]# yum -y install bzip2 //下载解压bzip2
[root@localhost opt]# tar xvf extundelete-0.2.4.tar.bz2 //解压
[root@localhost opt]# cd extundelete-0.2.4/ //到这个目录下
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete && make && make install //指定安装目录
cd /usr/local/extundelete/bin //到这个目录下
ln -s /usr/local/extundelete/bin/* /usr/sbin/ //创建软链接,方便管理
yum -y install gcc automake autoconf libtool make //安装编译器
yum install gcc gcc-c++ //安装c++
2、模拟删除并执行恢复操作
虚拟机添加新硬盘,使用 fdisk 命令创建新分区,将其挂载到/data目录下,往该目录下新建一些文件或目录
我们去/root/RECOVERED_FILES/目录下就可以查看恢复文件。
3.2 xfs 类型文件备份和恢复
extundelete 工具仅可以恢复 EXT 类型的文件,无法恢复 CentOS 7 系统默认采用 xfs 类型的文件。
针对 xfs 文件系统目前也没有比较成熟的文件恢复工具,所以建议提前做好数 据备份,以避免数据丢失。
xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。若系统中未安装 xfsdump与xfsrestore工具,
可以通过yum install -y xfsdump命令安装。xfsdump 按照inode 顺序备份一个 xfs 文件系统。xfsdump 的备份级别
有两种:0 表示完全备份;1-9 表示增量 备份。
xfsdump 的备份级别默认为 0。
xfsdump 命令
格式xfsdump -f 备份存放位置 要备份路径或设备文件。
常用的备份参数包括以下几种:
-f:指定备份文件目录;
-L:指定标签 session label;
-M:指定设备标签 media label;
-s:备份单个文件,-s 后面不能直接跟路径。
演示xfs文件被误删恢复
四、 分析日志文件
日志文件是用于记录 Linux 操作系统中各种运行消息的文件,相当于 Linux 主机的“日记”。不同的日志文件记载了不同类型的信息,如 Linux 内核消息、用户登录事件、程序错误等。
4.1 日志文件的分类
在 Linux 操作系统中,日志数据主要包括以下三种类型
- 内核及系统日志:这种日志数据由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置。 系统中有相当一部分程序会把自己的日志文件交由 rsyslog管理,因而这些程序使 用的日志记录也具有相似的格式
- 用户日志:这种日志数据用于记录 Linux 操作系统用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。
- 程序日志:有些应用程序会选择由自己独立管理一份日志文件(而不是交给 rsyslog服务管理),用于记录本程序运行过程中的各种事件信息。由于这些程序只负责管理自己的日志文件,因此不同程序所使用的日志记录格式可能会存在较大的差异。
常见的一些日志文件如下:
/var/log/messages:记录 Linux 内核消息及各种应用程序的公共日志信息,包括启动、I/0 错误、网络错误、程序故障等。
对于未使用独立日志文件的应用程序或服 务,一般都可以从该日志文件中获得相关的事件记录信息
- /var/log/cron:记录 crond 计划任务产生的事件信息
- /var/log/dmesg:记录 Linux 操作系统在引导过程中的各种事件信息
- /var/log/maillog:记录进入或发出系统的电子邮件活动。
- /var/log/lastlog:记录每个用户最近的登录事件。
- /var/log/secure:记录用户认证相关的安全事件信息
- /var/log/wtmp:记录每个用户登录、注销及系统启动和停机事件
- /var/log/btmp:记录失败的、错误的登录尝试及验证事件
4.2 日志文件分析
1.内核及系统日志
内核及系统日志功能主要由默认安装的 rsyslog-7.4.7-16.el7.x86_64.rpm 软件包提供。
从配置文件/etc/rsyslog.conf 中可以看到,受 rsyslogd 服务管理的日志文件都是 Linux 操作系统中主要的日志文件,它们记录了 Linux 操作系统中内核、用户认证、电子邮件、计 划任务等基本的系统消息。在 Linux 内核中,根据日志消息的重要程度不同,将其分为不同 的优先级别(数字等级越小,优先级越高,消息越重要)
- 0 EMERG(紧急):会导致主机系统不可用的情况。
- 1 ALERT(警告):必须马上采取措施解决的问题。
- 2 CRIT(严重):比较严重的情况。
- 3 ERR(错误):运行出现错误
- 4 WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件
- 5 NOTICE(注意):不会影响正常功能,但是需要注意的事件。
- 6 INFO(信息):一般信息。
- 7 DEBUG(调试):程序或系统调试信息等。
内核及大多数系统消息被记录到公共日志文件/var/log/messages 中,而其他一些程序 消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者直接发送给指定用户。
对于 rsyslog 服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的。 以公共日志/var/log/messages 文件的记录格式为例,其中每一行表示一条日志消息,每 一条消息均包括以下四个字段。
- 时间标签:消息发出的日期和时间。
- 主机名:生成消息的计算机的名称。
- 子系统名称:发出消息的应用程序的名称。
- 消息:消息的具体内容。
无论网络入侵者怎样修改日志都不能清除入侵的痕迹。rsyslog 日志服务是一个常会被攻击的显著目标,破坏了它将使管理员难以发现入侵及入侵的痕迹, 因此要特别注意监控其守护进程及配置文件
2、用户日志
在 wtmp、btmp、lastlog 等日志文件中,保存了系统用户登录、退出等相关的事件消息。
但是这些文件都是二进制的数据文件,不能直接使用 tail、less 等文本查看工具进行浏览,需要使用 who、w、users、last 和 lastb 等用户查询命令来获取日志信息
(1)查询当前登录的用户情况——users、who、w 命令
- users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。
- who 命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可 以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用 户名、终端类型、登录日期及远程主机。
2)查询用户登录的历史记录——last、lastb 命令 last 命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。通过 last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前 主机可能已被入侵。
3.程序日志
在 Linux 操作系统中,还有相当一部分应用程序没有使用 rsyslog 服务来管理日志,而是由程序自己维护日志记录。不同应用程序的日志记录格式差别较大,且没有严格使用统一的格式,
管理人员应该定期并随机检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志及用户登录日志记录等。在检查这些日志时,要注意是否有不合常理的时间或操作记录。例如,出现以下现象就应多加注意。
●用户在非常规的时间登录,或者用户登录系统的 IP 地址和以往的不一样。
●用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录。
●非法使用或不正当使用超级用户权限。
●无故或者非法重新启动各项网络服务的记录。
●不正常的日志记录,如日志残缺不全,或者是诸如 wtmp 这样的日志文件无故缺少 了中间的记录文件。
另外,需要提醒管理人员注意的是,日志并不是完全可靠的,高明的黑客在入侵系统后 经常会打扫现场。
所以管理人员需要综合运用以上的系统命令,全面、综合地进行审查和检 测,切忌断章取义,否则将可能做出错误的判断。