11深入理解LinuX 文件系统

深入理解LinuX 文件系统

1.1 .inode与block 详解

崭新的操作系统的文件数据除了实际内容外,通常含有非常多的属性,例加

Linux操作系统的文件权限(rwx)与文件属性(所有者、群组、时间参数等)。文件系统通常会将这两部分分别存放在inode 和block 中。

1.1.1 inode和block概述

文件上是存储在硬盘上的,硬盘的最小存储单位叫做"扇区"(sector),每个扇区存储512字节。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块", 是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个sector组成一个block。

文件数据存储在"块"中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为"索引节点",也叫i节点。因此,一个文件必须占用一个inode, 但至少占用一个 block

mark

1.1.2inode的内容

inode包含很多的文件元信息,但不包含文件名,例如:

  • 文件的字节数
  • 文件拥有者的UserID
  • 文件的GroupID
  • 文件的读、写、执行权限
  • 文件的时间戳

使用stat命令即可查看某个文件的inode 信息。

root(@localhost~]# stat /opt

mark

Linux系统文件有三个主要的时间属性,分别是ctime (change time)、atime(aces5 ime)、mtime(modify time).

●ctime(change time)是最后一次改变文件或目录(属性)的时间,例如执行chmod、chown等命令。

●atime(acesstime)是最后一次访问文件或目录的时间。

●mtimce(modifytime)是最后一次修改文件或目录(内容)的时间.

1.1.3inode的内容

刚才说inode中并不包括文件名,其实,文件名是存放在目录当中的.Linux系统中一切皆文件,因此目录也是一种文件,下图为目录文件的结构。

文件名1inode号码1
文件名2inode号码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

mark

当一个用户在Limux系统中试图访问一个义件时,系统会先根据文生名去查找它的mode,看该用户是否具有访问这个文件的权限,如果有,就指向相对脸的数据block,如果没有,就返回Permision denied。而一块硬盘分区后的结构则是下图所示

mark

1.1.5.inode的大小

inode也会消耗硬盘空间,每个inode的大小,一般是128字节或256字节。imode 的总数,在格式化时就给定。执行命令"df-i"即可查看每个硬盘分区的inode总数和已经使用的数量。查看每个inode的大小,可以用命令

mark

由于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 ~]# w

     18: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)便于日志信息的统一收集,整理和分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值