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 ...
随机推荐
- 纯java代码在控制台运算电话本(不使用数据库)
分享学习 Task_08 package cn.rzpt; import java.util.List; import java.util.Scanner; public class Task_08 ...
- RXJAVA源码之多线程
在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件:在哪个线程生产事件,就在哪个线程消费事件.如果需要切换线程,就需要用到 ...
- 栈的Java实现-分别使用数组和链表
栈是非常重要的数据结构,栈具有后进先出的特点. 在JVM内部,每个线程维护一个栈,对于每个方法调用,入栈一个元素,成为栈帧,当方法执行完成后,对应的栈帧出栈. 栈帧中,也包含一个栈,称为操作数栈. 一 ...
- switch-case 选择语句
0. 语句模型 Go 里的选择语句模型是这样的 switch 表达式 { case 表达式1: 代码块 case 表达式2: 代码块 case 表达式3: 代码块 case 表达式4: 代码块 cas ...
- hw小技巧(转载)
小弟也第一次参加hw,经过5天hw,确实也学到了许多的东西,但就本次分享而言,我分享一些我认为在hw里面值得注意的东西以及一些小技巧 0x01 信息收集 信息收集这个多西当然都是老生常谈了,你收集的东 ...
- Centos-删除文件或目录-rm
rm 删除目录或者文件,如果是链接文件,则只删除这个链接文件而不是链接指向的文件 相关选项 -r 递归删除目录 -f 忽略不存在提示和确认提示,本身确认提示系统默认添加-i参数 -i 删除文件前提示, ...
- Springer editorial manager上传latex文件
Springer的投稿系统editorial manager在初次投稿时只需要上传pdf文件,修改后要求上传Latex源文件.上传过程遇到好多问题,花了快两天才搞定,整理如下: 1. 主要上传的文件包 ...
- Java学习day06
[方法] [可以在不是main的方法中调用其他方法] [方法调用时的参数问题] [方法调用] [上面定义了两个class,实际上不推荐] [递归调用] [方法的返回值] [retu ...
- DMZ是什么
刚刚接触安全域,实在是佩服自己真的是菜,,,啥都不懂,看看过段时间能有多大进步吧... 概念 DMZ:它是一个缓冲区,一个隔离区.它是位于两台防火墙之间的区域,相对于INTER网来说安全级别高一些,但 ...
- vs工程生成dll文件及其调用方法
转载:https://blog.csdn.net/weixin_44536482/article/details/91519413 vs工程生成dll文件及其调用方法 ...