文件数据包括元信息与实际数据,一个文件必须占用一个inode,但至少占用一个block。node
扇区:文件存储在硬盘上,硬盘的最小存储单位是扇区,每一个扇区存储空间是512字节。
block(块):连续的八个扇区组成一个block,block是文件存取的最小单位,用来存储文件数据。
inode(索引节点):也叫i节点,用于存储文件元信息。linux
(1)inode包含文件元信息:c++
- 文件的字节数
- 文件拥有者的User ID(UID)
- 文件的Group ID(GID)
- 文件具备的读、写、执行权限
- 文件的时间戳(atime、ctime、mtime)
当咱们想查看某个文件的inode信息时,使用的是“stat”命令,后面直接接文件的路径和名称便可。windows
[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)文件的三个主要时间属性:session
- atime(access time):最后一次访问文件或目录的时间
- ctime(change time):最后一次改变文件或目录(属性)的时间
- mtime(modify time):最后一次修改文件或目录(内容)的时间
每一inode都有一个号码,操做系统是经过inode号码来识别不一样文件的。Linux系统内部是不使用文件名来识别文件的,对系统而言inode号码才是文件的名字。而文件名只是便于用户去记忆的名字,至关于inode号码的别称。其实这就至关于我们的手机通信录,我们平时只要记住联系人的名字就能够拨通他的手机,但真正用来链接通话的是你保存在通信录中的手机号码。移动或重命名文件时,只会改变文件名,inode号码是不变的。ide
(1)用户经过文件名打开文件时,系统内部过程以下:工具
- 系统首先会找到这个文件名对应的inode号码
- 经过inode号码获取inode信息(查看元信息,看是否有访问权限)
- 根据inode信息,找到文件数据所在的block,读出数据
(2)查看inode号码的方法:this
ls -i命令:查看文件名对应的inode号码操作系统
[root@localhost opt]# ls -i test/ 34964204 test01.txt [root@localhost opt]#
stat命令:查看文件inode信息中的inode号码3d
[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]#
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]#
当咱们删除文件的文件名中包含有没法用键盘敲出的特殊字符,就致使咱们没法删除文件。此时咱们能够直接经过inode来删除文件。
在linux系统中有种文件是连接文件,能够为解决文件的共享使用。连接的方式能够分为两种,一种是硬连接(Hard Link),另外一种是软连接或者也称为符号连接(Symbolic Link)。
在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]#
安装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/”目录中就能看到恢复的文件了。
xfsdump命令:备份系统文件
格式:xfsdump -f 备份存放位置 要备份的路径或设备文件
经常使用选项:
-f:-------------------指定备份文件位置 -L:------------------指定备份会话标签(免交互) -M:-----------------指定设备标签(免交互) -s:------------------备份指定的文件,使用相对路径,相对于备份的文件系统路径
xfsrestore命令:恢复备份的系统文件
格式:xfsrestore -f 恢复文件的位置 存放恢复后文件的位置
经常使用选项:
-f:-----------------------指定备份文件位置 -s:----------------------恢复指定文件恢复 -t:-----------------------查看文件的内容及详细信息
首先添加一块硬盘,而后对其进行配置分区,再格式化将文件类型格式化为xfs格式,挂载到新建的目录“/data/”下。
复制passwd文件到“/data/”目录下,而后在“/data/”目录里新建一个“test”目录,并在目录里建立一个空文件。
退出“/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/”目录下的全部文件,模拟文件误删。
删除完毕咱们经过xfsrestore命令将文件恢复到“/data/”目录中去。
xfsdump使用限制:
- 只能备份已挂载的文件系统
- 必须使用root的权限才能操做
- 只能备份XFS文件系统
- 备份后的数据只能让xfsrestore解析
- 不能备份两个具备相同UUID的文件系统