目录
一. inode 与 block 详细描述
1.2 inode 的内容结构
1.3 目录 与 inode
1.4 inode的大小
1.5 inode耗尽的故障处理
二. 恢复误删除的文件
三. 分析日志文件
3.2 三大类的日志
1. 内核和公共日志
2. 用户日志
2.1 查询当前登录的用户情况
1)users
2)who
3)w
2.2 查询用户登录的历史记录
1)last
2)lastb
3. 程序日志
1. 文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。
2. 一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的(4k一读,8个扇区一读)。
3. 文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在“块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode表。 因此,一个文件必须占用一个inode,并且至少占用一个block。
4. inode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
5. 每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码(唯一 性)对应一个或多个文件名。同一文件系统包括了不同的文件。
6. 所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码:通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。
注:硬盘上最小的存储单位为扇区(512字节) 文件存储的最小单位为块8个扇区组成为4k
每个文件的属性信息,比如:文件的大小,时间,类型,权限等,称为文件的元数据(meta data 元信息 )
元数据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。
每一个inode表记录对应的保存了以下信息:
inode number 节点号
文件类型
权限
UID
GID
链接数(指向这个文件名路径名称个数)
该文件的大小和不同的时间戳
指向磁盘上文件的数据块指针
有关文件的其他数据...
可以使用 stat命令查看某个文件的inode信息,如下图所示:
Linux系统文件有三个主要的时间属性,分别是如下(也可以看到上图):
最近访问 atime: 最后一次查看访问文件或目录的时间
最近更改 mtime:最近修改文件内容的时间,注意:更改完内容之后,ctime也会改变
最近改动 ctime: 最近更改文件元信息的时间,比如改变权限等
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系,一个目录是目录下的文件名和文件inode号之间的映射。
那么文件是如何找到实际数据的呢?
解:linux 通过文件夹中会有一张 文件名和inode一一对应关系的表 (名字) 去找inode号 inode指向对应的实际数据
其具体关联如下图:
2.然后通过文件名和inode之间对应的关系,去获取inode信息
3. 最后通过inode信息利用指针去指向实际数据
inode也会消耗硬盘空间,每个inode大小一般是128字节或256字节。执行 “df -i” 可以查看每个硬盘分区的inode总数和已经使用的数量。
几个命令对 inode 信息带来的变化
cp 命令与inode:
分配一个空闲的inode号,在inode表中生成新条目,在目录中创建一个目录项,将名称与inode编号关联,拷贝数据生成新的文件。
rm 命令与inode:
硬链接数递减,从而释放的inode号可以被重用,把数据块放在空闲列表中,删除目录项,数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖。
mv命令和inode:
如果mv命令的目标和源在同一设备,不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!删除旧的目录对应关系新建目录对应关系。
由于每个文件都必须有一个inode,因此有可能出现inode已经被用光,但是硬盘还没有被存满的情况,此时也无法在硬盘上继续创建新文件。
此时,我们可以通过df命令查看到该分区实际上还有可用的剩余空间的话,说明是inode不够,这时我们只需要找出该分区中占用大量i节点的细小文件移除或者删除就OK的。当然,对于很多用户公用的文件系统,我建议还是为相关的用户设置磁盘限额(包括文件数量,磁盘空间)。
删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录里面的 block 中,删除这个文件的名字。Linux 是通过 Link 的数量来控制文件删除的,只有 当一个文件不存在任何 Link 的时候,这个文件才会被删除。
在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情 况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过“回收 站”找回的情况,比如使用“rm -rf”来删除数据。针对 Linux 下的 EXT 文件系统,可用的恢复 工具有 debugfs、ext3grep、extundelete 等。 其中 extundelete 是一个开源的 Linux 数据 恢复工具,支持 ext3 文件系统。
可以使用extundelete /dev/sdb1 --inode 2 用来查看文件系统/dev/sdb1 下存在哪些文件,以及具体的使用情况。其中--inode 2 代表从 i 节点为 2 的文件开始查看,一般文件系统格式化挂 载之后,i 节点是从 2 开始的,2 代表该文件系统最开始的目录。 在恢复前.需要先解挂载。
内核及系统日志由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置。
Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下。其中,一部分程序共用一个日志文件,一部分程序使用单个日志文件,有些大型服务器由于日志文件不止一个,所以会在/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等命令查看 |
/var/log/btmp |
记录失败的,错误的登录尝试及验证事件,可以使用lastab命令查看 |
这样既保证了日志文件目录的结构清晰,又能快速定位日志文件。
rsyslog服务使用的配置文件为/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 中,而其他一些程序
消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者
直接发送给指定用户。/var/log/messages内容如图所示:
对于 rsyslog 服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的。
以公共日志/var/log/messages 文件的记录格式为例,其中每一行表示一条日志消息,每
一条消息均包括以下四个字段。
在某些时候我们可以设置rsyslog,让它在把日志信息记录到文件的同时将日志信息发送到打印机进行打印,这样无论网络入侵如何修改日志都无法清除其入侵的痕迹。
在 wtmp、btmp、lastlog 等日志文件中,保存了系统用户登录、退出等相关的事件消息。
但是这些文件都是二进制的数据文件,不能直接使用 tail、less 等文本查看工具进行浏览,
需要使用 who、w、users、last 和 lastb 等用户查询命令来获取日志信息。
users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。 如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数
who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可
以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用
户名、终端类型、登录日期及远程主机
w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的 输出内容要丰富一些。
last 命令用于查询成功登录到系统的用户记录,
最近的登录情况将显示在最前面。通过 last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前 主机可能已被入侵。
lastb 命令用于查询登录失败的用户记录,
如登录的用户名错误、密码不正确等情况都 将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除 了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息。
在Linux系统中,还要相当一部分的应用程序并没有使用rsyslog服务来管理日志,而是由程序自己维护日志记录,不同的应用程序的日志记录格式差别较大,没有严格的使用统一的格式。
我作为一名合格的系统管理人员,需要时刻警惕,随时注意各种可疑情况,定期并随机检查各种系统的日志文件。出现以下现象时就应该倍加注意:
但是,日志有时候又不完全可靠,万一厉害的黑客入侵后清除了其入侵痕迹,单靠查看日志就很难检测,所以我们需要综合运用系统命令,综合检测,不要断章取义。