Linux文件元数据和节点表结构
文件元数据
一块硬盘的分区可以认为有两部分组成,保存元数据的成为节点表,用来保存属性等。
元数据中有个小指针,指向数据存放的实际空间。
元数据(Metadata)
又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
inode表结构
每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数
据是存放在node(index node)表中。node 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息
第一个node表记录对应的保存了以下信息:
- inode number 节点号 每个数据都有一个唯一标识 stat查看
- 文件类型
- 权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
[root@C8-1 ~]# ls -i
34011033 a{1-3}.test 34060751 b{1-3}.test 34060752 c{1-3}.test
[root@C8-1 ~]# stat a\{1-3\}.test
File: a{1-3}.test
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 34011033 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-06-19 09:59:08.761754380 -0400
Modify: 2020-06-19 09:59:08.761754380 -0400
Change: 2020-06-19 09:59:08.761754380 -0400
Birth: -
指针
磁盘是一种块文件,以块的方式来存储数据,每块通常都是4K,
- 直接指针
直接指针直接指向存放的位置,直接指针只有12个,12x4K=48K,可以表达48K的数据
一个文件假如是1K或者哪怕是一个字节,也要分配一块4k的空间来存储这个文件,
一个文件假如是10k,分配3块空间来存放,就有3个指针来指向存放的3个块 - 间接指针
指针不是直接指向数据存储的位置,而是指向指针块,指针块也是4K大小,
一个指针放4个字节,一个指针块可以放1024个指针,4Kx1024=4M ,可以表达4M的数据
超过48K低于4M,就可以用间接指针来表示 - 双重间接指针
一个间接指针块指向另一个间接指针块矩阵
4Kx1024x1024=4G,可以表达4G的数据 - 三重间接指针
4Kx1024x1024x1024=4T,可以表达4T的数据
指针是有很多个组合而成的
不同的系统底层并不完全相同,仅此ext格式为例,逻辑相通
如果文件越大,速度越慢!
找一个文件,现在分区中找节点表,
目录
目录是个特殊文件,目录的文件内容保存了此目录中文件的列表及inode number对应关系
节点表里没有文件名,文件名是放在目录中的。在目录块里存放着每个文件的文件名和节点编号的对应关系。
- 文件引用一个是 inode号
- 人是通过文件名来引用一个文件
- 一个目录是目录下的文件名和文件inode号之间的映射
示例:
有一个节点表,每个节点表中放的就是元数据,node1代表着这个文件夹对应的节点表。
dir1的数据块里边存放着两个文件a和b,a对应inode1,b对应inode2,通过节点表对应到他数据的所在位置,
文件命令的本质
cp和inode
cp 命令:
- 分配一个空闲的inode号,在inode表中生成新条目
- 在目录中创建一个目录项,将名称与inode编号关联
- 拷贝数据生成新的文件
rm和inode
rm 命令:
- 链接数递减,从而释放的inode号可以被重用
- 把数据块放在空闲列表中
- 删除目录项
- 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
mv和inode
移动相当于拷贝加删除,在同一分区,只是改一下记录,数据没动
- 如果mv命令的目标和源在相同的文件系统,作为mv 命令
- 用新的文件名创建对应新的目录项
- 删除旧目录条目对应的旧的文件名
- 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
- 如果目标和源在一个不同的文件系统, mv相当于cp和rm
节点编号的限制
节点编号是有使用范围的,可以反复使用。
在一个分区中,节点编号是有限资源。
同一分区移动文件,节点编号不变。
一旦跨了分区,节点编号改变。
查看分区情况和节点编号
每个独立的分区都有自己Inodes可分配额
使用df -i命令查看最多可分配Inodes的数量
[root@C8-1 ~]# df -h ##查看分区使用情况
Filesystem Size Used Avail Use% Mounted on
devtmpfs 886M 0 886M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 8.7M 895M 1% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/cl-root 17G 2.1G 15G 12% /
/dev/sda1 976M 139M 771M 16% /boot
tmpfs 181M 0 181M 0% /run/user/0
[root@C8-1 ~]# df -i ##可以查看最多可分配Inodes的数量
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 226760 376 226384 1% /dev
tmpfs 231191 1 231190 1% /dev/shm
tmpfs 231191 584 230607 1% /run
tmpfs 231191 17 231174 1% /sys/fs/cgroup
/dev/mapper/cl-root 8910848 60173 8850675 1% /
/dev/sda1 65536 309 65227 1% /boot
tmpfs 231191 5 231186 1% /run/user/0
范例:
- 耗尽节点编号
[root@C8-1 ~]# mkdir /boot/testdir ##创建测试文件夹
[root@C8-1 ~]# df -i ##查看Inodes情况
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 226760 376 226384 1% /dev
tmpfs 231191 1 231190 1% /dev/shm
tmpfs 231191 584 230607 1% /run
tmpfs 231191 17 231174 1% /sys/fs/cgroup
/dev/mapper/cl-root 8910848 60173 8850675 1% /
/dev/sda1 65536 310 65226 1% /boot ##还有65226个可用
tmpfs 231191 5 231186 1% /run/user/0
[root@C8-1 ~]# cd /boot/testdir/
[root@C8-1 testdir]# ll
total 0
[root@C8-1 testdir]# touch {1..65526}.test ##创建65526个空文件
touch: cannot touch '65227.test': No space left on device ##创建到65527个文件的时候报错了
[root@C8-1 testdir]# df -i ##查看Inodes情况
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 226760 376 226384 1% /dev
tmpfs 231191 1 231190 1% /dev/shm
tmpfs 231191 584 230607 1% /run
tmpfs 231191 17 231174 1% /sys/fs/cgroup
/dev/mapper/cl-root 8910848 60173 8850675 1% /
/dev/sda1 65536 65536 0 100% /boot ##节点编号已耗尽
tmpfs 231191 5 231186 1% /run/user/0
[root@C8-1 testdir]# df -h ##查看Inodes使用情况
Filesystem Size Used Avail Use% Mounted on
devtmpfs 886M 0 886M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 8.7M 895M 1% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/cl-root 17G 2.1G 15G 12% /
/dev/sda1 976M 141M 769M 16% /boot ##/boot分区仍有可用空间,但已无法创建文件
tmpfs 181M 0 181M 0% /run/user/0
##删除后恢复
[root@C8-1 ~]# rm -rf /boot/testdir/
[root@C8-1 ~]# type rm
rm is aliased to `rm -i'
[root@C8-1 ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 226760 376 226384 1% /dev
tmpfs 231191 1 231190 1% /dev/shm
tmpfs 231191 583 230608 1% /run
tmpfs 231191 17 231174 1% /sys/fs/cgroup
/dev/mapper/cl-root 8910848 60173 8850675 1% /
/dev/sda1 65536 309 65227 1% /boot
tmpfs 231191 5 231186 1% /run/user/0
- 耗尽分区空间
dd可以创建一个大文件
[root@C8-1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 886M 0 886M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 8.7M 895M 1% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/cl-root 17G 2.1G 15G 12% /
/dev/sda1 976M 139M 771M 16% /boot
tmpfs 181M 0 181M 0% /run/user/0
[root@C8-1 ~]# mkdir /boot/testdir/
[root@C8-1 ~]# dd if=/dev/zero of=/boot/bigfile bs=1M count=771
771+0 records in
771+0 records out
808452096 bytes (808 MB, 771 MiB) copied, 6.70666 s, 121 MB/s
[root@C8-1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 886M 0 886M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 8.7M 895M 1% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/cl-root 17G 2.1G 15G 12% /
/dev/sda1 976M 910M 0 100% /boot
tmpfs 181M 0 181M 0% /run/user/0
[root@C8-1 ~]# ll -h /boot/bigfile
-rw-r--r--. 1 root root 771M Jun 20 02:18 /boot/bigfile
当文件被使用时,虽然删掉了,但空间仍然没有释放,因为文件存在于内存中
[root@C8-1 ~]# rm -rf /boot/bigfile
[root@C8-1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 886M 0 886M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 8.7M 895M 1% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/cl-root 17G 2.1G 15G 12% /
/dev/sda1 976M 910M 0 100% /boot
tmpfs 181M 0 181M 0% /run/user/0
使用lsof查看一下已经删掉的文件
[root@C8-1 ~]# lofs |grep delete
-bash: lofs: command not found
[root@C8-1 ~]# lsof |grep delete
systemd-u 704 root 8r REG 253,0 6406312 34011028 /var/lib/sss/mc/group (deleted)
systemd-u 704 root 9r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
auditd 853 root 4r REG 253,0 6406312 34011028 /var/lib/sss/mc/group (deleted)
auditd 853 854 auditd root 4r REG 253,0 6406312 34011028 /var/lib/sss/mc/group (deleted)
auditd 853 856 auditd root 4r REG 253,0 6406312 34011028 /var/lib/sss/mc/group (deleted)
mcelog 878 root 4r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
lsmd 880 libstoragemgmt 3r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
dbus-daem 881 dbus 5r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
dbus-daem 881 dbus 6r REG 253,0 10406312 34011031 /var/lib/sss/mc/initgroups (deletd)
dbus-daem 881 893 dbus-daem dbus 5r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
dbus-daem 881 893 dbus-daem dbus 6r REG 253,0 10406312 34011031 /var/lib/sss/mc/initgroups (deletd)
sssd 883 root 6r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
sssd 883 root 16r REG 253,0 10406312 34011031 /var/lib/sss/mc/initgroups (deletd)
polkitd 884 polkitd 4r REG 253,0 10406312 34011031 /var/lib/sss/mc/initgroups (deletd)
polkitd 884 900 gmain polkitd 4r REG 253,0 10406312 34011031 /var/lib/sss/mc/initgroups (deletd)
polkitd 884 901 gdbus polkitd 4r REG 253,0 10406312 34011031 /var/lib/sss/mc/initgroups (deletd)
polkitd 884 907 JS\x20Hel polkitd 4r REG 253,0 10406312 34011031 /var/lib/sss/mc/initgroups (deletd)
polkitd 884 908 JS\x20Hel polkitd 4r REG 253,0 10406312 34011031 /var/lib/sss/mc/initgroups (deletd)
polkitd 884 923 polkitd polkitd 4r REG 253,0 10406312 34011031 /var/lib/sss/mc/initgroups (deletd)
VGAuthSer 885 root 8r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
vmtoolsd 886 root 3r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
vmtoolsd 886 914 gmain root 3r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
chronyd 892 chrony 5r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
sssd_be 909 root 18r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
sssd_be 909 root 19r REG 253,0 10406312 34011031 /var/lib/sss/mc/initgroups (deletd)
sssd_nss 916 root 17r REG 253,0 8406312 34011025 /var/lib/sss/mc/passwd (deleted)
firewalld 926 root 7u REG 253,0 4096 609362 /tmp/#609362 (deleted)
firewalld 926 1373 gmain root 7u REG 253,0 4096 609362 /tmp/#609362 (deleted)
vim 1796 root 5r REG 8,1 808452096 309 /boot/bigfile (deleted)
发现 309 /boot/bigfile (deleted)正在由root执行vim占用着,所以没有释放空间,还在内存中
直接把占用程序kill掉,可以释放,但不安全。
使用重定向null直接清空大文件,然后再删除,可以快速释放空间。
cat null只是将文件清空,并没有删除文件。可以快速释放空间。
[root@C8-1 ~]# ll -h /boot/bigfile
-rw-r--r--. 1 root root 771M Jun 20 02:57 bigfile
[root@C8-1 ~]# cat /dev/null > /boot/bigfile
[root@C8-1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 886M 0 886M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 8.7M 895M 1% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/cl-root 17G 2.1G 15G 12% /
/dev/sda1 976M 139M 771M 16% /boot
tmpfs 181M 0 181M 0% /run/user/0
[root@C8-1 ~]# ll -h /boot/bigfile
-rw-r--r--. 1 root root 0 Jun 20 02:58 bigfile
Linux文件元数据和节点表结构的更多相关文章
- (3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb)
(3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb) 关键词:mysql日志文件,mysqldumpslow分析工具 目录:日志文件的分类 1. ...
- linux的文件系统及节点表
linux的文件系统及节点表 一 linux的文件系统1 我们都知道当我们安装linux时会首先给系统分区,然后我们会把分区格式化成EXT3格式的文件系统.那么在linux系统中还有没有其他的文件系 ...
- ORACLE 中写入txt文本与从Txt文件中读入数据 修改表结构
--创建一个表 DROP TABLE TEST CASCADE CONSTRAINTS ; CREATE TABLE TEST(A VARCHAR(30),B VARCHAR(30)); --查看具体 ...
- MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据
记录通过.frm和.ibd文件恢复数据到本地 .frm文件:保存了每个表的元数据,包括表结构的定义等: .ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per ...
- 文件描述符、文件表项、V节点表项的一些总结
转自 http://blog.csdn.net/gzzheyi/article/details/7739556 表格可以参见APUE 第三版 P61. 文件描述符(进程级别): 1).在每个进程表中 ...
- MySQL 利用frm文件和ibd文件恢复表结构和表数据
文章目录 frm文件和ibd文件简介 frm文件恢复表结构 ibd文件恢复表数据 通过脚本利用ibd文件恢复数据 通过shell脚本导出mysql所有库的所有表的表结构 frm文件和ibd文件简介 在 ...
- 比较两个mysql数据库表结构的差异
需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异. 数据库表结构的差异 注:操作均在Linux系统下完成 ...
- mysql 表结构及基本操作
说明在mysql语句中,sql语句总共分四种 a.DDL数据定义语句=>常用的ddl语句有(CREATE[创建],DROP[删除],ALTER[修改表结构]) b.DML数据操作语句=>常 ...
- mybatis根据数据库表结构自动生成实体类,dao,mapper
首先, pom需要引入 <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifac ...
随机推荐
- springboot的文件路径,配置文件
生成springboot会指定一个包路径,启动的class文件在这个目录下,其他的controller等也要在这个目录的子目录下,不然会扫不到. 一般我们会维护两三个配置文件:生产环境,开发环境,测试 ...
- 聊聊分布式下的WebSocket解决方案
前言 最近王子自己搭建了个项目,项目本身很简单,但是里面有使用WebSocket进行消息提醒的功能,大体情况是这样的. 发布消息者在系统中发送消息,实时的把消息推送给对应的一个部门下的所有人. 这里面 ...
- 关于KeePass实现ssh协议的自动登录
本文主要介绍一下,在keepass中如何实现linux主机的ssh方式的自动登录 keepass版本:KeePass 2.45 在keepass的URL中,其实默认也是内置了ssh的,其原理是调用pu ...
- spring in action-note-2
1.AOP:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是 ...
- 基础篇:详解JAVA对象实例化过程
目录 1 对象的实例化过程 2 类的加载过程 3 触发类加载的条件 4 对象的实例化过程 5 类加载器和双亲委派规则,如何打破双亲委派规则 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 对象的 ...
- Python-函数式编程-map reduce filter lambda 三元表达式 闭包
lambda 匿名函数,核心是作为算子,处理逻辑只有一行但具有函数的特性,核心用于函数式编程中 三元运算符 其实本质上是if分支的简化版,满足条件返回 if 前面的值,不满足条件返回 else后面的值 ...
- Hbuilder获取手机当前地理位置的天气
前言:前面一段时间,公司项目里有一个需求 是获取当前手机地理位置当天的天气情况 将实时天气信息提供给客户.在网上搜索资料时候,发现知识很零碎,自己实现以后整理出来,方便于各位的学习与使用. 一.获取 ...
- Python练习题 011:成绩打分
[Python练习题 011] 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. ---------------------- ...
- Git多人项目开发流程演练
1. 前言 本文利用 GitHub 平台进行一个多人项目开发流程的演练,以加深课上所学内容. 参考文献:五⼤场景玩转 Git,只要这一篇就够了! 2. 初始化项目 2.1 新建远程项目 一个多人项目通 ...
- 056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用
056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用 本文知识点:数组的实际应用 程序开发中如何应用数组? 程序代码及其运行结果: 不同数据类 ...