一、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”命令,后面直接接文件的路径和名称即可。
[[email protected] 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
创建时间:-
[[email protected] 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,读出数据
(2)查看inode号码的方法:
ls -i命令:查看文件名对应的inode号码
[[email protected] opt]# ls -i test/
34964204 test01.txt
[[email protected] opt]#
stat命令:查看文件inode信息中的inode号码
[[email protected] 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
创建时间:-
[[email protected] opt]#
4.inode的大小
inode也会消耗硬盘空间,每个inode的大小一般是128字节或256字节,在格式化文件系统时会确定inode的总数。
df -i命令:查看每个硬盘分区的inode总数和已使用数量
[[email protected] 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
[[email protected] opt]#
5.inode的特殊作用
当我们删除文件的文件名中包含有无法用键盘敲出的特殊字符,就导致我们无法删除文件。此时我们可以直接通过inode来删除文件。
二、硬链接与软链接
在linux系统中有种文件是链接文件,可以为解决文件的共享使用。链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link)。
在Linux系统中,多个文件名指向同一个inode,一般这种链接就称为硬链接。硬链接的作用之一是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件,以防止误删重要文件,不过硬链接只能在同一文件系统中的文件之间进行链接,而且不能对目录进行创建。文件名其实就相当于硬链接,当我们给文件建立了硬链接后,再去删除它的源文件,就相当于删除了其中一个硬链接。但它的元信息和数据任然在inode与block中存储着。当最后一个硬链接被删除后,它的元信息和数据任然在,但是系统会将它的inode号码释放到号码池,当有一个新文件获取了这个inode号码后,它的元信息和数据才会被覆盖。
软链接,其实与windows系统中的快捷方式很相似,与硬链接不同,软链接就是一个普通文件,只是数据块内容有点特殊,文件用户数据块中存放的内容是另一文件的路径名的指向,通过这个方式可以快速定位到软连接所指向的源文件实体。软链接可对文件或目录创建,当源文件被删除后,软链接也就失效了。
ln命令:创建硬链接。
[[email protected] test]# ls
test01.txt
[[email protected] test]# ls -l
总用量 4
-rw-r--r--. 1 root root 13 8月 28 11:39 test01.txt
[[email protected] test]# ln test01.txt t01.txt
[[email protected] test]# ls -i
34964204 t01.txt 34964204 test01.txt
[[email protected] 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
[[email protected] test]#
我们可以看到,文件和它的硬链接的inode号码是相同的,所以无论我们用哪个打开它的内容都是相同的。
ln -s命令:创建软链接
[[email protected] test]# ls
test01.txt
[[email protected] test]# ln -s test01.txt t01.txt
[[email protected] test]# ls
t01.txt test01.txt
[[email protected] test]#
file命令:查看文件类型
[[email protected] test]# file test01.txt
test01.txt: ASCII text
[[email protected] test]# cd ../
[[email protected] opt]# file test/
test/: directory
[[email protected] 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
我们先新建一个目录,再将我们本地的工具包挂载到目录中。
输入:mkdir /extundel
输入:mount.cifs //192.168.100.50/share/ /extundel/
输入:df -h
将挂载过来的工具压缩包解压到“/opt/”目录中
输入:cd /extundel/
输入:tar jxvf extundelete-0.2.4.tar.bz2 -C /opt/
用“cd”命令进入“/opt/extundelete-0.2.4/”目录,安装编译器,因为现在的源码包是用C语言写的,不能直接用。
输入:cd /opt/extundelete-0.2.4/
输入:yum install gcc gcc-c++ -y
编译安装extundelete工具。
输入:./configure
输入:make
输入:make install
添加一块磁盘,对磁盘进行配置,配置完后,将磁盘分区格式化,文件格式为ext4,再创建一个目录“/data/”,并将磁盘分区挂载到目录下。
进入到“/data/”目录,创建三个文件a、b、c。然后再将三个文件删除,模拟文件误删。
我们先返回宿主目录,然后将sdb1解挂载。然后用“extundelete /dev/sdb1 --restore-all”来恢复删除的所有文件。注意:当你误删文件后,第一时间一定要将设备解挂载,因为如果有新的文件将删除的文件inode号给占用了就无法恢复了。(工作环境中一定要注意备份)
我们用“cd”命令进入到“RECOVERED_FILES/”目录中就能看到恢复的文件了。
2.恢复Linux7版本中的XFS类型文件。
xfsdump命令:备份系统文件
格式:xfsdump -f 备份存放位置 要备份的路径或设备文件
常用选项:
-f:-------------------指定备份文件位置
-L:------------------指定备份会话标签(免交互)
-M:-----------------指定设备标签(免交互)
-s:------------------备份指定的文件,使用相对路径,相对于备份的文件系统路径
xfsrestore命令:恢复备份的系统文件
格式:xfsrestore -f 恢复文件的位置 存放恢复后文件的位置
常用选项:
-f:-----------------------指定备份文件位置
-s:----------------------恢复指定文件恢复
-t:-----------------------查看文件的内容及详细信息
首先添加一块硬盘,然后对其进行配置分区,再格式化将文件类型格式化为xfs格式,挂载到新建的目录“/data/”下。
复制passwd文件到“/data/”目录下,然后在“/data/”目录里新建一个“test”目录,并在目录里创建一个空文件。
退出“/data/”目录,然后将sdb1分区的文件备份到“/opt/”目录下,命名为“xfs_dump”
[[email protected] ~]# 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/”目录下的所有文件,模拟文件误删。
删除完毕我们通过xfsrestore命令将文件恢复到“/data/”目录中去。
xfsdump使用限制:
- 只能备份已挂载的文件系统
- 必须使用root的权限才能操作
- 只能备份XFS文件系统
- 备份后的数据只能让xfsrestore解析
- 不能备份两个具有相同UUID的文件系统
原文地址:https://blog.51cto.com/14449541/2433415