一、inode与block

1.inode和block概述

文件数据包括元信息与实际数据,一个文件必须占用一个inode,但至少占用一个block。

扇区:文件存储在硬盘上,硬盘的最小存储单位是扇区,每个扇区存储空间是512字节。
block(块):连续的八个扇区组成一个block,block是文件存取的最小单位,用来存储文件数据。
inode(索引节点):也叫i节点,用于存储文件元信息。

2.inode的理解

(1)inode包含文件元信息:

  • 文件的字节数
  • 文件拥有者的User ID(UID)
  • 文件的Group ID(GID)
  • 文件具有的读、写、执行权限
  • 文件的时间戳(atime、ctime、mtime)

当我们想查看某个文件的inode信息时,使用的是“stat”命令,后面直接接文件的路径和名称即可。

[root@localhost opt]# stat test/
  文件:"test/"
  大小:24         块:0          IO 块:4096   目录
设备:802h/2050d   Inode:33574981    硬链接:2
权限:(0755/drwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2019-08-28 11:39:33.953003238 +0800
最近更改:2019-08-28 11:39:20.023004045 +0800
最近改动:2019-08-28 11:39:20.023004045 +0800
创建时间:-
[root@localhost opt]# 

(2)文件的三个主要时间属性:

  • atime(access time):最后一次访问文件或目录的时间
  • ctime(change time):最后一次改变文件或目录(属性)的时间
  • mtime(modify time):最后一次修改文件或目录(内容)的时间

3.inode号码

每一inode都有一个号码,操作系统是通过inode号码来识别不同文件的。Linux系统内部是不使用文件名来识别文件的,对系统而言inode号码才是文件的名字。而文件名只是便于用户去记忆的名字,相当于inode号码的别称。其实这就相当于咱们的手机通讯录,咱们平时只要记住联系人的名字就可以拨通他的手机,但真正用来连接通话的是你保存在通讯录中的手机号码。移动或重命名文件时,只会改变文件名,inode号码是不变的。

(1)用户通过文件名打开文件时,系统内部过程如下:

  • 系统首先会找到这个文件名对应的inode号码
  • 通过inode号码获取inode信息(查看元信息,看是否有访问权限)
  • 根据inode信息,找到文件数据所在的block,读出数据

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

(2)查看inode号码的方法:

ls -i命令:查看文件名对应的inode号码

[root@localhost opt]# ls -i test/
34964204 test01.txt
[root@localhost opt]#

stat命令:查看文件inode信息中的inode号码

[root@localhost opt]# stat test/test01.txt 
  文件:"test/test01.txt"
  大小:13         块:8          IO 块:4096   普通文件
设备:802h/2050d   Inode:34964204    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2019-08-28 11:39:34.875003185 +0800
最近更改:2019-08-28 11:39:20.023004045 +0800
最近改动:2019-08-28 11:39:20.023004045 +0800
创建时间:-
[root@localhost opt]# 

4.inode的大小

inode也会消耗硬盘空间,每个inode的大小一般是128字节或256字节,在格式化文件系统时会确定inode的总数。

df -i命令:查看每个硬盘分区的inode总数和已使用数量

[root@localhost opt]# df -i
文件系统          Inode        已用(I)        可用(I)       已用(I)% 挂载点
/dev/sda2      10485760  121223   10364537          2% /
devtmpfs         229705     368          229337           1% /dev
tmpfs            233378        1                233377         1% /dev/shm
tmpfs            233378         599           232779       1% /run
tmpfs            233378        16             233362         1% /sys/fs/cgroup
/dev/sda5     5241856     144          5241712       1% /home
/dev/sda1     3145728     328          3145400       1% /boot
tmpfs            233378         6             233372         1% /run/user/42
tmpfs            233378         20           233358         1% /run/user/0
[root@localhost opt]# 

5.inode的特殊作用

当我们删除文件的文件名中包含有无法用键盘敲出的特殊字符,就导致我们无法删除文件。此时我们可以直接通过inode来删除文件。

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

二、硬链接与软链接

在linux系统中有种文件是链接文件,可以为解决文件的共享使用。链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link)。

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

在Linux系统中,多个文件名指向同一个inode,一般这种链接就称为硬链接。硬链接的作用之一是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件,以防止误删重要文件,不过硬链接只能在同一文件系统中的文件之间进行链接,而且不能对目录进行创建。文件名其实就相当于硬链接,当我们给文件建立了硬链接后,再去删除它的源文件,就相当于删除了其中一个硬链接。但它的元信息和数据任然在inode与block中存储着。当最后一个硬链接被删除后,它的元信息和数据任然在,但是系统会将它的inode号码释放到号码池,当有一个新文件获取了这个inode号码后,它的元信息和数据才会被覆盖。

软链接,其实与windows系统中的快捷方式很相似,与硬链接不同,软链接就是一个普通文件,只是数据块内容有点特殊,文件用户数据块中存放的内容是另一文件的路径名的指向,通过这个方式可以快速定位到软连接所指向的源文件实体。软链接可对文件或目录创建,当源文件被删除后,软链接也就失效了。

ln命令:创建硬链接。

[root@localhost test]# ls
test01.txt
[root@localhost test]# ls -l
总用量 4
-rw-r--r--. 1 root root 13 8月  28 11:39 test01.txt
[root@localhost test]# ln test01.txt t01.txt
[root@localhost test]# ls -i
34964204 t01.txt  34964204 test01.txt
[root@localhost test]# ls -l
总用量 8
-rw-r--r--. 2 root root 13 8月  28 11:39 t01.txt
-rw-r--r--. 2 root root 13 8月  28 11:39 test01.txt
[root@localhost test]#

我们可以看到,文件和它的硬链接的inode号码是相同的,所以无论我们用哪个打开它的内容都是相同的。

ln -s命令:创建软链接

[root@localhost test]# ls
test01.txt
[root@localhost test]# ln -s test01.txt t01.txt
[root@localhost test]# ls
t01.txt  test01.txt
[root@localhost test]#

file命令:查看文件类型

[root@localhost test]# file test01.txt 
test01.txt: ASCII text
[root@localhost test]# cd ../
[root@localhost opt]# file test/
test/: directory
[root@localhost opt]# 

三、恢复误删文件

1.恢复Linux6版本的EXT4类型的文件

安装extundelete软件包,先安装它的依赖包。

输入:cd /mnt/Packages/
输入:rpm -ivh e2fsprogs-libs-1.41.12-18.el6.x86_64.rpm
输入:rpm -ivh e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm
输入:rpm -ivh libcom_err-devel-1.41.12-18.el6.x86_64.rpm
输入:rpm -ivh e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

我们先新建一个目录,再将我们本地的工具包挂载到目录中。

输入:mkdir /extundel
输入:mount.cifs //192.168.100.50/share/ /extundel/
输入:df -h

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

将挂载过来的工具压缩包解压到“/opt/”目录中

输入:cd /extundel/
输入:tar jxvf extundelete-0.2.4.tar.bz2 -C /opt/

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

用“cd”命令进入“/opt/extundelete-0.2.4/”目录,安装编译器,因为现在的源码包是用C语言写的,不能直接用。

输入:cd /opt/extundelete-0.2.4/
输入:yum install gcc gcc-c++ -y

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

编译安装extundelete工具。

输入:./configure
输入:make
输入:make install

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

添加一块磁盘,对磁盘进行配置,配置完后,将磁盘分区格式化,文件格式为ext4,再创建一个目录“/data/”,并将磁盘分区挂载到目录下。

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

进入到“/data/”目录,创建三个文件a、b、c。然后再将三个文件删除,模拟文件误删。

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

我们先返回宿主目录,然后将sdb1解挂载。然后用“extundelete /dev/sdb1 --restore-all”来恢复删除的所有文件。注意:当你误删文件后,第一时间一定要将设备解挂载,因为如果有新的文件将删除的文件inode号给占用了就无法恢复了。(工作环境中一定要注意备份)

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

我们用“cd”命令进入到“RECOVERED_FILES/”目录中就能看到恢复的文件了。

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

2.恢复Linux7版本中的XFS类型文件。

xfsdump命令:备份系统文件

格式:xfsdump -f 备份存放位置 要备份的路径或设备文件
常用选项:

-f:-------------------指定备份文件位置
-L:------------------指定备份会话标签(免交互)
-M:-----------------指定设备标签(免交互)
-s:------------------备份指定的文件,使用相对路径,相对于备份的文件系统路径

xfsrestore命令:恢复备份的系统文件

格式:xfsrestore -f 恢复文件的位置 存放恢复后文件的位置

常用选项:

-f:-----------------------指定备份文件位置
-s:----------------------恢复指定文件恢复
-t:-----------------------查看文件的内容及详细信息

首先添加一块硬盘,然后对其进行配置分区,再格式化将文件类型格式化为xfs格式,挂载到新建的目录“/data/”下。

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

复制passwd文件到“/data/”目录下,然后在“/data/”目录里新建一个“test”目录,并在目录里创建一个空文件。

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

退出“/data/”目录,然后将sdb1分区的文件备份到“/opt/”目录下,命名为“xfs_dump”

[root@localhost ~]# xfsdump -f /opt/xfs_dump /dev/sdb1                //备份命令
                                  ..................................                                           //省略部分
please enter label for this dump session (timeout in 300 sec)
 -> xfs_dump                                                                                       //输入备份后文件名
session label entered: "xfs_dump"
                                  .....................................                                     //省略部分
please enter label for media in drive 0 (timeout in 300 sec)
 -> sdb1                                                                                            //输入备份分区
media label entered: "sdb1"
                                   .........................................                           //省略部分
xfsdump: Dump Status: SUCCESS

删除“/data/”目录下的所有文件,模拟文件误删。

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

删除完毕我们通过xfsrestore命令将文件恢复到“/data/”目录中去。

浅析Linux文件(一)inode与block、硬链接与软链接、恢复误删文件

xfsdump使用限制:

  • 只能备份已挂载的文件系统
  • 必须使用root的权限才能操作
  • 只能备份XFS文件系统
  • 备份后的数据只能让xfsrestore解析
  • 不能备份两个具有相同UUID的文件系统