当前位置: 首页 > news >正文

Linux 文件存储和删除原理

目录

    • 1、Linux 文件存储原理
    • 2、Linux 创建文件过程
    • 3、Linux 删除文件过程
    • 4、Linux 目录文件大小
    • 5、删除大量文件速度慢
    • 6、删除大量文件速度优化
    • 7、两种删除方式效率对比

1、Linux 文件存储原理

可以这样简单理解,将硬盘格式化以后,将整个硬盘的空间分为了三部分

  1. inode 区域:简单理解为占整块硬盘存储空间的1%
  2. block 区域:简单理解为占整块硬盘存储空间的99%
  3. 目录项区域:是特殊的block块,也是blocak区域的一部分。

存储某个文件时,大约是将这个文件分为三部分来存储

  1. 元数据:也就是文件的属性信息(包括权限、属主、大小、时间戳、数据块指针等,不包括文件名),存储在inode区域。
  2. 实际数据:也就是该文件实际的内容,block 区域。一个文件会使用若干个block来存放数据。
  3. 文件名:存储在目录项(目录块)中,目录块其实就是一个特殊的block块,特殊点在于它不是存真正数据的,而是存该目录下的 “文件名 ↔ inode号” 的映射关系。

2、Linux 创建文件过程

  1. 在inode区域中为该文件分配一块一个inode区域,这块区域通过一个唯一的inode索引号标识。

  2. 根据文件的大小,在block区域中分配一定数量的数据块用于存放文件数据部分,这个block数据块的信息也会被记录到该文件的inode区域中。

  3. 在该文件所在的上级目录的目录项中添加“文件名 → inode号”的映射。

说明:目录文件是一个特殊的文件,目录文件的属性信息也是存inode区域的,特殊点在于目录文件的实际内容存储的不是类似于普通文件中的实际数据文件,而是该目录下所有文件和文件inode索引的映射关系。


3、Linux 删除文件过程

  1. 系统会先找到该文件所在上级目录,然后从该目录文件的数据部分将“文件名 → inode编号”的映射关系移除掉。

  2. 将 inode 的引用计数减 1,如果计数为 0 且无进程占用,则inode区域和所有对应的 block 数据块都会被释放掉;


4、Linux 目录文件大小

Linux 中目录文件大小一般都是4KB的原因

简单理解,就是一般Linux的文件系统都是ext4。格式化时默认分配block空间时,单个block的大小就是4KB。

目录本质上也是一个“特殊的文件”,只不过数据部分存放的是该目录下所有文件名与 inode 号的映射记录(不会包含子目录中的内容,子目录的内容记录在它自己的目录文件中)

一个普通目录项一般就30多个字节左右,所以一般一个目录里面的文件在130个以内,目录文件的大小就是4KB,超过130个的话,目录文件的大小就会超过4KB。


5、删除大量文件速度慢

Linux 中某个目录下多个小文件删除很慢的原因

  • 删除该目录下的所有文件:因为删除文件的第一步就是将该文件的文件名和inode索引号除名,假设有几百万个小文件,挨着查找目录项,然后删除对应目录项的过程就会很慢。

  • 连带存放文件目录也删除:因为就算是删除整个目录,系统也会该目录下的每个子目录、读取目录项、解析文件名。然后逐个删除目录项。所以简单理解就是删除一个目录,意味着清空它的目录项再删它自己。


6、删除大量文件速度优化

Linux 中需要删除上百万个小文件的优化方法

rsync --delete empty_dir/  target_dir/
  • --delete:源目录总没有的文件,而目标文件中有,就删除掉。
  • empty_dir:是一个创建好的空目录。
  • target_dir:要清空文件的目标目录。

7、两种删除方式效率对比

Linux 中 rm 和 rsync 两种方式删除文件原理对比

rm -rf 删除目录的实现过程

  • 首先递归遍历整个目录树(也就是会遍历该目录下的所有文件,如果存在子目录,子目录中的所有文件也要遍历),

  • 然后删除每一个文件时,都会查找其在父目录中的目录项,再删除文件名 → inode 的映射,再更新回收硬盘inode索引号,再回收inode区域和block区域。(如果有子目录,则继续递归删除子目录中的文件,最终删除子目录本身。)

rsync --delete 删除文件过程

  • 首先扫描源目录和目标目录的文件结构,一次找到所有目标目录中存在、而源目录中没有的文件/目录

  • 批量执行删除操作,而不是每发现一个就删一个,这样效率就更高,系统调用更集中,速度也更快。

http://www.dtcms.com/a/99855.html

相关文章:

  • Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能
  • Kafka消息丢失全解析!原因、预防与解决方案
  • 如何查看 SQL Server 的兼容性级别
  • 基于ruoyi快速开发平台搭建----超市仓库管理(修改记录1)
  • 《C++11:通过thread类编写C++多线程程序》
  • 编辑器场景视窗扩展
  • SpringBean模块(一)定义如何创建生命周期
  • 《C++Linux编程进阶:从0实现muduo 》-第6讲.C++死锁问题如何分析调试-原子操作,互斥量,条件变量的封装
  • 稻壳模板下载器(Windows):免费获取WPS稻壳模板的利器
  • Java中优先级队列的实现
  • 蓝桥杯备考------>双指针(滑动窗口)
  • 华为OD机试2025A卷 - 最大值(Java Python JS C++ C )
  • PyTorch 2.6.0没有对应的torch-sparse版本,不要下载pytorch最新版本,否则用不了图神经网络torch_geometric
  • vmware_unbantu刷新IP
  • EtherNet/IP转ProfiNet协议转换网关驱动西门子PLC与流量计的毫秒级压力同步控制
  • 洛谷题单1-P5706 【深基2.例8】再分肥宅水-python-流程图重构
  • MySQL单表查询、多表查询
  • linux实现rsync+sersync实时数据备份
  • Redis-快速入门
  • GPT Actions
  • 【硬件测试】基于FPGA的16QAM+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
  • 【Find My全球市场观察:中国制造如何改写游戏规则?】
  • 游戏引擎学习第191天
  • 【Python】工作笔记:返回当月第一天、昨天;上月第一天、当天;全年节假日
  • 淘宝客户端动态化页面搭建
  • Linux课程学习一
  • 【区块链安全 | 第五篇】DeFi概念详解
  • Kubernetes比同规格虚拟机性能相差多少?
  • 《Express:Node.js 里的 “闪电侠”》
  • Playwright从入门到实战:比Selenium更快的数据爬取案例实战