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 ...
随机推荐
- [LeetCode]198. 打家劫舍(DP)
题目 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个 ...
- SpringCloud实战 | 第四篇:SpringCloud整合Gateway实现API网关
一. 前言 微服务实战系列是基于开源微服务项目 有来商城youlai-mall 版本升级为背景来开展的,本篇则是讲述API网关使用Gateway替代Zuul,有兴趣的朋友可以进去给个star,非常感谢 ...
- spring cloud微服务快速教程之(十二) 分布式ID解决方案(mybatis-plus篇)
0-前言 分布式系统中,分布式ID是个必须解决的问题点: 雪花算法是个好方式,不过不能直接使用,因为如果直接使用的话,需要配置每个实例workerId和datacenterId,在微服务中,实例一般动 ...
- JVM强引用、软引用、弱引用、虚引用、终结器引用垃圾回收行为总结
JVM引用 我们希望能描述这样一类对象: 当内存空间还足够时,则能保留在内存中:如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象. -[既偏门又非常高频的面试题]强引用.软引用.弱引用.虚引 ...
- 关于java基础_方法的学习
方法: 方法就是把一堆需要反复执行的代码封装起来,如果项目需要调用这段代码时,直接调用方法名即可 方法相当于榨汁机, 材料:水果 产出物:果汁 参数(材料):进入方法的数据 返回值(产出物):就是方法 ...
- Node.js 从零开发 web server博客项目[日志]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- Latex博客转载
\[{e^{ix}=cosx+isinx} \] \[[博客地址](https://www.cnblogs.com/Sinte-Beuve/p/6160905.html) \]
- Java基础一篇过(五)Map这篇就够了
文章更新时间:2020/03/03 一.Map介绍 Map是Java的一个接口,没有继承,以Key--Value的形式来储存元素信息,常用到的有3个子类实现: HashMap 底层数据结构是散列桶(数 ...
- Mysql的ONLY_FULL_GROUP_BY
今天在测试环境遇到一个问题,本地测试是没有问题,在测试环境sql报错了: nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntax ...
- 微服务实战系列(五)-注册中心Eureka与nacos区别
1. 场景描述 nacos最近用的比较多,介绍下nacos及部署吧,刚看了下以前写过类似的,不过没写如何部署及与eureka区别,只展示了效果,补补吧. 2.解决方案 2.1 nacos与eureka ...