文章目录
深入理解LinuX 文件系统
1.1 .inode与block 详解
崭新的操作系统的文件数据除了实际内容外,通常含有非常多的属性,例加
Linux操作系统的文件权限(rwx)与文件属性(所有者、群组、时间参数等)。文件系统通常会将这两部分分别存放在inode 和block 中。
1.1.1 inode和block概述
文件上是存储在硬盘上的,硬盘的最小存储单位叫做"扇区"(sector),每个扇区存储512字节。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块", 是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个sector组成一个block。
文件数据存储在"块"中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为"索引节点",也叫i节点。因此,一个文件必须占用一个inode, 但至少占用一个 block
1.1.2inode的内容
inode包含很多的文件元信息,但不包含文件名,例如:
- 文件的字节数
- 文件拥有者的UserID
- 文件的GroupID
- 文件的读、写、执行权限
- 文件的时间戳
使用stat命令即可查看某个文件的inode 信息。
root(@localhost~]# stat /opt
Linux系统文件有三个主要的时间属性,分别是ctime (change time)、atime(aces5 ime)、mtime(modify time).
●ctime(change time)是最后一次改变文件或目录(属性)的时间,例如执行chmod、chown等命令。
●atime(acesstime)是最后一次访问文件或目录的时间。
●mtimce(modifytime)是最后一次修改文件或目录(内容)的时间.
1.1.3inode的内容
刚才说inode中并不包括文件名,其实,文件名是存放在目录当中的.Linux系统中一切皆文件,因此目录也是一种文件,下图为目录文件的结构。
文件名1 | inode号码1 |
---|---|
文件名2 | inode号码2 |
每一行称为一个目录项
每个inode都有一个号码,操作系统用inode号码来识别不同的文件,Limux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode 号码便于识别的别称
1.1.4inode的号码
表面上,用户是通过文件名来打开文件,实际上,在系统内部这个过程分成三步:
(1)系统找到这个文件名对应的 inode号码。
(2)通过 inode号码,获取 inode信息。
(3)根据inode信息,找到文件数据所在的block,读出数据。
常见查看inode号码有这么几种方式
ls -i命令:直接查看当前目录文件名的所对应的inode信息
ls-ai命令:直接查看当面目录的文件及隐藏文件的所对应的inode信息
stat命令:通过查看文件inode信息而查看到inode号码
示例查看文件名为a的文件
[root@localhost opt]# ls -i
[root@localhost opt]# ls -ai
[root@localhost opt]# stat a
当一个用户在Limux系统中试图访问一个义件时,系统会先根据文生名去查找它的mode,看该用户是否具有访问这个文件的权限,如果有,就指向相对脸的数据block,如果没有,就返回Permision denied。而一块硬盘分区后的结构则是下图所示
1.1.5.inode的大小
inode也会消耗硬盘空间,每个inode的大小,一般是128字节或256字节。imode 的总数,在格式化时就给定。执行命令"df-i"即可查看每个硬盘分区的inode总数和已经使用的数量。查看每个inode的大小,可以用命令
由于inode号码与文件名分离,这种机制导致了一些UNIXLinux系统特有的现象。
●有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode,就能起到删除文件的作用。
●移动文件或重命名文件,只是改变文件名,不影响inode号码。
●打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。这使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。
二:硬链接与软连接
- 软链接:一似于Windows的快捷方式功能的文件,可以快速连接到目标文件或目录
- 硬链接:通过文件系统的inode链接文件来产生新的文件名,而不是产生新文件
2.1:硬链接
一般情况下,文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。但是Linux系统允许多个文件名指向同一个inode号码,这意味着,可以不同的文件名访问同样的内容
ln命令创建硬链接
命令基本格式
ln 源文件 目标 (不能对目录做硬链接)
2.2:软链接
软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名
例如:文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。
读取文件A时,系统会自动将访问者导向文件B
此时,文件A就称为文件B的“软链接(soft link)”或者“符号链接(symbolic link)”
这表示,文件A依赖于文件B而存在,如果删除了文件B ,打开文件A就会报错
这是软链接与硬链接的最大不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode“链接数”不会因此产生变化。
软链接的创建命令的基本格式为:
ln -s 源文件或目录 目标文件或目录
[root@localhost]# ln -s aaa.txt aaa_link.txt
[root@localhost]# ls -l aaa.txt
abcd aaa.txt
[root@localhost]# ls -l aaa_link.txt
cdef aaa_link.txt
2.3:软链接与硬链接总结
链接文件是为文件或目录建立链接文件
软链接与硬链接对比
删除原始文件后,软链接无法找到原始文件的文件名,所以会报错。硬链接与原始文件inode相同,所以不影响访问,仍旧可用。
删除一个文件,实际上并不清除inode节点和block的数据,只是在这个文件的父目录里面的block中,删除这个文件的名字
Linux是通过link的数量来控制文件的删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除
三:恢复误删除的文件
3.1:实验:恢复XFS类型的文件
3.1.1:xfsdump命令格式
xfsdump -f 备份存放位置 要备份的路径或者设备文件
-
xfsdump备份级别(默认为0)
0:完全备份
1-9:增量备份
-
xfsdump常用选项:-f,-L,-M,-s
-
xfsrestore命令格式
3.2:xfsdump使用限制
只能备份已挂载的文件系统
必须使用root的权限才能操作
只能备份xfs文件系统
备份后的数据只能用xfsrestore解析
不能备份两个具有相同UUID的文件系统
3.3:实验过程:在CentOS 7.6中恢复ext类型的数据
A:添加一块磁盘备用,安装环境’
[root@localhost ~]# fdisk /dev/sdb #添加一块磁盘然后进行分区
[root@localhost opt]# yum -y install e2fsprogs-devel e2fsprogs-libs
#在编译安装 extundelete 之前需要先安装两个依赖包 e2fsprogs-libs 和 e2fsprogs-devel
[root@localhost opt]# yum -y install wget #下载weget下载软件
B** :安装extundelete-0.2.4软件及环境
'需要安装一个extundelete-0.2.4.tar.bz2软件,软件在Windows系统中,所以要将软件所在文件夹(cccc)共享,并挂载到Linux中,挂载点我创建为/data
[root@localhost opt]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 #下载extundelete 软件包
--2020-07-5 18:02:35-- http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
正在解析主机 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)... 140.110.96.69, 2001:e10:ffff:1f02::17
正在连接 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)|140.110.96.69|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:108472 (106K) [application/octet-stream]
正在保存至: “extundelete-0.2.4.tar.bz2”
100%[==============================>] 108,472 8.68KB/s 用时 12s
2020-07-5 18:02:58 (8.68 KB/s) - 已保存 “extundelete-0.2.4.tar.bz2” [108472/108472])
[root@localhost opt]# yum -y install bzip2
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* extras: mirrors.163.com
* updates: mirrors.163.com
软件包 bzip2-1.0.6-13.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@localhost opt]# tar jxvf 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 #配置指定安装目录/usr/local/extundelete
#make编译成二进制文件
#make install安装
[root@localhost extundelete-0.2.4]# cd /usr/local/extundelete/bin
[root@localhost bin]# ln -s /usr/local/extundelete/bin/* /usr/sbin/
[root@localhost bin]# yum -y install gcc automake autoconf libtool make
#make是gcc的编译器,一定要安装
[root@localhost bin]# yum install gcc gcc-c++
1234567891011121314151617181920212223242526272829303132333435
C:格式化分区为ext4并挂载分区
[root@localhost bin]# mkfs.ext4 /dev/sdb1
[root@localhost bin]# mkdir /data
[root@localhostbin]# mount /dev/sdb1 /data
第四步:在挂载点创建文并查看该文件系统的使用情况
[root@localhost ~]# cd /data
[root@localhost data]# ll
总用量 0
[root@localhost data]# echo a>a && echo a>b && echo a>c && echo a>d #创建测试文件
[root@localhost data]# ls
a b c d
[root@localhost data]# extundelete /dev/sdb1 #查看该文件系统的使用情况
......省略
files and make recovering those files impossible. You should unmount the
file system and check it with fsck before using extundelete.
Would you like to continue? (y/n)
y #输入y
..........
E :删除文件,恢复测试
[root@localhost data]# rm -rf a b
[root@localhost data]# ls
c d lost+found
[root@lpf data]# cd ~
[root@localhost ~]# umount /data/ #先解除挂载,防止block被读写占用
[root@localhost ~]# extundelete /dev/sdb1 --restore-all #执行恢复操作
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 160 groups loaded.
Loading journal descriptors ... 22 descriptors loaded.
Searching for recoverable inodes in directory / ...
2 recoverable inodes found.
Looking through the directory structure for deleted files ...
0 recoverable inodes still lost.
[root@localhost ~]# ll
总用量 12
-rw-r--r--. 1 root root 0 7月 5 18:28 1
-rwxr-xr-x. 1 root root 11 7月 5 18:28 2.txt
-rw-------. 1 root root 1746 4月 23 20:58 anaconda-ks.cfg
-rw-r--r--. 1 root root 1794 4月 23 21:01 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 24 7月 5 18:29 RECOVERED_FILES #恢复的文件目录
[root@localhos ~]# cd RECOVERED_FILES/
[root@localhos RECOVERED_FILES]# ll
总用量 8
-rw-r--r--. 1 root root 2 7月5 18:29 a
-rw-r--r--. 1 root root 2 7月 518:29 b
3.4:实验过程:在CentOS 7.6中恢复xfs类型的数据
extundelete 工具仅可以恢复 EXT 类型的文件,无法恢复 CentOS 7 系统默认采用 xfs 类型的文件。
针对 xfs 文件系统目前也没有比较成熟的文件恢复工具,所以建议提前做好数 据备份,以避免数据丢失。
xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。
-f:指定备份文件目录;
-L:指定标签 session label;
-M:指定设备标签 media label;
-s:备份单个文件,-s 后面不能直接跟路径
步骤
A 创建一块磁盘并挂载
[root@localhost ~]# fdisk /dev/sdb 分区
[root@localhost ~]# mkfs.xfs /dev/sdb1 格式化为xfs格式
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=19660736 blks
B挂载
[root@localhost ~]# mkdir /data
[root@localhost ~]# cd /data/
[root@localhost data]# cp /etc/passwd ./
[root@localhost data]# mkdir test
[root@ localhost data]# touch test/a
[root@localhost data]# yum -y install tree 安装tree 用于查看文件的树形结构
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* extras: mirrors.163.com
* updates: mirrors.163.com
软件包 tree-1.6.0-10.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@localhost data]# tree /data
/data
├── passwd
└── test
└── a
1 directory, 2 files
C 安装xfsdump并备份文件
[root@localhost data]# yum install -y xfsdump
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
软件包 xfsdump-3.1.7-1.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@localhost data]# xfsdump -f /opt/dump_sdb1 /dev/sdb1
…
xfsdump: stream 0 /opt/dump_sdb1 OK (success)
xfsdump: Dump Status: SUCCESS
[root@localhost data]# xfsdump -I
D:删除文件并尝试恢复’
[root@localhost data]# cd /data/
[root@localhost data]# ll
总用量 4
-rw-r–r--. 1 root root 2301 7月 5 19:13 passwd
drwxr-xr-x. 2 root root 15 7月 5 19:14 test
[root@localhost data]# rm -rf *
[root@localhost data]# xfsrestore -f /opt/dump_sdb1 /data/ #数据恢复
…
xfsrestore: stream 0 /opt/dump_sdb1 OK (success)
xfsrestore: Restore Status: SUCCESS
[root@localhost data]# ll
总用量 4
-rw-r–r--. 1 root root 23017月 5 19:13 passwd
drwxr-xr-x. 2 root root 15 7月 5 19:14 test
四:日志文件分析
分析日志文件的目的在于通过浏览日志查找关键信息,对系统服务进行调试,以及判断发生故障的原因等
对于大多数文本格式的日志文件(如内核及系统日志,大多数的程序日志),只要使用tail,more,less,cat等文本处理工具就可以查看日志内容
对于一些二进制格式的日志文件(如用户日志),需要使用特定的查询命令
4.1:内核及系统日志
4.1.1:由系统服务rsyslogd统一管理
软件包:rsyslog-7.4.7-16.el7.x86_64
主要程序:/sbin/rsyslogd
配置文件:/etc/rsyslog.conf
4.1.2:日志消息的级别-重要
1) 受rsyslogd服务管理的日志文件都是Linux系统中最重要的日志文件,它们记录了Linux系统中内核,用户认证,邮件,计划任务等最基本的系统消息
2)在Linux内核中,根据日志消息的重要程度不同,将其分为不同的优先级(数字等级越小,优先级越高,消息越重要)
3)内核及大多数系统消息都被记录到公共日志文件/var/log/messages中,而其他一些程序消息被记录到各自独立的日志文件中
4)日志消息还可以记录到特定的存储设备中,或者直接发送给指定用户
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7lW4ajD6-1593956632394)(C:\Users\LIU\AppData\Roaming\Typora\typora-user-images\image-20200705211213046.png)]
4.2:用户日志
4.2.1:保存目录
保存了用户登录,退出系统等相关信息
/var/log/lastlog:最近的用户登录事件
/var/log/wtmp:用户登录,注销及系统开,关机事件
/var/log/utmp:当前登录的每个用户的详细信息
/var/log/secure:与用户验证相关的安全性事件
4.2.2:分析工具
-
分析工具
users,who,w,last,lastb -
查询当前登录的用户情况:users,who,w命令
-
user命令只简单的输出当前登录的用户名称,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数who命令用户报告当前登录到系统中的每个用户的信息
使用该命令,系统管理员可以查看当前系统存在哪些不合法用户,从而对其进行审计和处理 -
who命令用户报告当前登录到系统中的每个用户的信息
使用该命令,系统管理员可以查看当前系统存在哪些不合法用户,从而对其进行审计和处理
who命令的默认输出包括用户名,终端类型,登录日期及远程主机[root@localhost ~]# w18:11:36 up 5:33, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/1 20.0.0.1 17:09 0.00s 0.10s 0.03s w root pts/2 20.0.0.1 15:12 1:57m 0.26s 0.03s -bash [root@localhost ~]# who root pts/1 2020-07-05 17:09 (20.0.0.1) root pts/2 2020-07-05 15:12 (20.0.0.1) [root@localhost ~]# users root root
查询用户登录的历史记录:last,lastb命令
- last命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面
- 通过last命令可以及时掌握Linux主机的登录情况,若发现未经授权的用户登录过,则表示当前主机可能已被入侵
[root@localhost data]# last
root pts/1 20.0.0.1 Sun Jul 5 20:29 still logged in
root pts/0 20.0.0.1 Tue Jun 16 12:15 still logged in
root :0 :0 Tue Jun 16 09:05 still logged in
reboot system boot 3.10.0-957.el7.x Tue Jun 16 09:03 - 21:21 (19+12:18)
root pts/0 20.0.0.1 Mon Jun 15 13:36 - 17:47 (04:10)
root :0 :0 Mon Jun 15 13:36 - crash (19:26)
reboot system boot 3.10.0-957.el7.x Mon Jun 15 13:35 - 21:21 (20+07:45)
root pts/0 20.0.0.1 Mon Jun 15 11:01 - down (00:15)
root pts/1 20.0.0.1 Sun Jun 14 15:29 - 08:42 (17:13)
root pts/0 20.0.0.1 Sun Jun 14 09:20 - 15:56 (06:35)
root pts/0 20.0.0.1 Fri Jun 12 10:48 - 17:46 (06:57)
root :0 :0 Fri Jun 12 10:44 - 11:17 (3+00:32)
reboot system boot 3.10.0-957.el7.x Fri Jun 12 10:42 - 11:17 (3+00:35)
root pts/0 20.0.0.1 Thu Jun 11 09:32 - crash (1+01:09)
root pts/0 20.0.0.1 Thu Jun 11 07:57 - 09:32 (01:35)
root pts/0 20.0.0.1 Thu Jun 11 05:46 - 06:58 (01:12)
root :0 :0 Thu Jun 11 05:45 - crash (1+04:56)
lastb命令用于查询登录失败的用户记录,如登录的用户名错误,密码不正确等情况都会记录在案。
登录失败的情况属于安全事件,因为这表示可能有人在尝试猜出你的密码
除了使用lastb命令查看以外,还可以直接从安全日志文件/var/log/secure中获得相关信息
[root@localhost data]# lastb
tom1 ssh:notty 20.0.0.1 Sun Jul 5 20:29 - 20:29 (00:00)
tom1 ssh:notty 20.0.0.1 Sun Jul 5 20:29 - 20:29 (00:00)
tom1 ssh:notty 20.0.0.1 Sun Jul 5 20:29 - 20:29 (00:00)
root :0 :0 Thu Jun 11 05:44 - 05:44 (00:00)
btmp begins Thu Jun 11 05:44:59 2020
或者
[root@localhost data]# tail /var/log/secure
Jul 5 20:29:20 localhost sshd[13166]: pam_unix(sshd:auth): check pass; user unknown
Jul 5 20:29:20 localhost sshd[13166]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=20.0.0.1
Jul 5 20:29:22 localhost sshd[13166]: Failed password for invalid user tom1 from 20.0.0.1 port 50436 ssh2
Jul 5 20:29:33 localhost sshd[13166]: pam_unix(sshd:auth): check pass; user unknown
Jul 5 20:29:34 localhost sshd[13166]: Failed password for invalid user tom1 from 20.0.0.1 port 50436 ssh2
Jul 5 20:29:36 localhost sshd[13166]: error: Received disconnect from 20.0.0.1 port 50436:0: [preauth]
Jul 5 20:29:36 localhost sshd[13166]: Disconnected from 20.0.0.1 port 50436 [preauth]
Jul 5 20:29:36 localhost sshd[13166]: PAM 1 more authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=20.0.0.1
Jul 5 20:29:45 localhost sshd[13179]: Accepted password for root from 20.0.0.1 port 50438 ssh2
Jul 5 20:29:46 localhost sshd[13179]: pam_unix(sshd:session): session opened for user root by (uid=0)
4.3:程序日志
4.3.1:由相应的程序独立进行管理
1)web服务:/var/log/httpd/
access_log,error_log(httpd网站服务程序使用的两个日志文件access_log和error_log,分别记录客户访问事件,错误事件。)
2)代理服务:/var/log/squid/
access.log , cache.log
3)FTP服务:/var/log/xferlog
4.3.2:分析工具
1)文本查看,grep过滤检索,webmin管理套件中查看
2)awk,sed等文本过滤,格式化编辑工具
3)webalizer,awstats等专用日志分析工具
4.3.3:日志管理策略
1)及时做好备份和归档
2)延长日志保存期限
3)控制日志访问权限
4)日志中可能会包含各类敏感信息,如账户,口令等
5)几种管理日志
6)将服务器的日志文件发到统一的日志文件服务器
7)便于日志信息的统一收集,整理和分析
ion opened for user root by (uid=0)
### 4.3:程序日志
#### 4.3.1:由相应的程序独立进行管理
1)web服务:/var/log/httpd/
access_log,error_log(httpd网站服务程序使用的两个日志文件access_log和error_log,分别记录客户访问事件,错误事件。)
2)代理服务:/var/log/squid/
access.log , cache.log
3)FTP服务:/var/log/xferlog
#### 4.3.2:分析工具
1)文本查看,grep过滤检索,webmin管理套件中查看
2)awk,sed等文本过滤,格式化编辑工具
3)webalizer,awstats等专用日志分析工具
#### 4.3.3:日志管理策略
1)及时做好备份和归档
2)延长日志保存期限
3)控制日志访问权限
4)日志中可能会包含各类敏感信息,如账户,口令等
5)几种管理日志
6)将服务器的日志文件发到统一的日志文件服务器
7)便于日志信息的统一收集,整理和分析