导图
1.inode表结构
元数据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个
1.1硬链接和软连接
软连接 类似于windows里快捷方式,软连接,符号连接
- 文件的类型
- 文件的权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
查看inode号 [root@localhost data]# ls 123 1.txt 2.txt 3.txt 4.txt 5.txt data1 data2 [root@localhost data]# ls -i //方法1 35802872 123 35802838 1.txt 35802839 2.txt 35802840 3.txt 35802841 4.txt 35802842 5.txt 2420054 data1 35802875 data2 [root@localhost data]# stat /data/1.txt //方法2 文件:"/data/1.txt" 大小:0 块:0 IO 块:4096 普通空文件 设备:fd00h/64768d Inode:35802838 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 环境:unconfined_u:object_r:default_t:s0 最近访问:2022-10-12 18:52:31.654822781 +0800 最近更改:2022-10-12 18:52:31.654822781 +0800 最近改动:2022-10-12 18:52:31.654822781 +0800 创建时间:- 3个时间戳: 最近访问atime:最后一次差看文件 最近更改mtime:最近更改文件内容的时间,注意:更改完内容之后,ctime也会改变 最近改动ctime:最近更改文件元信息的时间,比如改变权限等
1.3用户访问文件的原理/过程:
- 用户访问文件时 先去查找 自己 文件夹中的目录项 ,
- 文件名和inode之间对应的关系,
- 通过 inode号利用指针(直接指针/间接指针)去指向 实际数据
直接指针:直接指向数据块
间接指针:不直接指向数据块,要经过中间数据块,最后指向数据块
图解:
1.4补充:文件相关
-
文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。
-
一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。
-
文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在“块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode表。 因此,一个文件必须占用一个inode,并且至少占用一个block。
-
inode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
-
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个或多个文件名。
唯一 同一文件系统() 不同的文件
-
所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码:通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。
tops:
硬盘上最小的存储单位为扇区(512字节)
-
-
owner info:所有者
-
size:大小
-
inode号与命令cp,rm,mv的关系:
cp 命令:
-
分配一个空闲的inode号,在inode表中生成新条目
-
在目录中创建一个目录项,将名称与inode编号关联
-
拷贝数据生成新的文件
rm 命令:
-
硬链接数递减,从而释放的inode号可以被重用
-
把数据块放在空闲列表中
-
删除目录项
-
数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
mv 命令:
- 如果mv命令的目标和源在同一设备,不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
#可以通过inode号来删除指定文件 [root@localhost data]# ls -i 35802872 123 35802838 1.txt 35802839 2.txt 35802840 3.txt 35802841 4.txt 35802842 5.txt 2420054 data1 35802875 data2 [root@localhost data]# find -inum 35802872 -delete //命令1 [root@localhost data]# find -inum 35802872 -exec rm {} /; //命令2 [root@localhost data]# ls 1.txt 2.txt 3.txt 4.txt 5.txt data1 data2
删除文件空间不释放,解决方法 [root@localhost opt]#lsof |grep delete //列出文件 过滤已删除 [root@localhost opt]#echo " " > /boot/bigfile //写空字符导给文件
2.文件恢复extundelete
删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录 里面的 block 中,删除这个文件的名字。
Linux 是通过 Link 的数量来控制文件删除的,只有 当一个文件不存在任何 Link 的时候,这个文件才会被删除。
在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情 况,尤其对于客户企业中一些新手。
当然,这里所指的是彻底删除,即已经不能通过“回收 站”找回的情况,比如使用“rm -rf”来删除数据。
针对 Linux 下的 EXT 文件系统,可用的恢复 工具有 debugfs、ext3grep、extundelete 等。
其中 extundelete 是一个开源的 Linux 数据 恢复工具,支持 ext3 文件系统。