为什么linux下空目录大小也是4kb?

2023-10-24 20:59
文章标签 linux 大小 空目录 4kb

本文主要是介绍为什么linux下空目录大小也是4kb?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    前几天同学问我:我用ls -l看目录大小。怎么都是4kb?

如图

    test目录下面有个空目录tt,tt的实际大小为4096。如果我在tt下面创建几个新的文件,tt的大小结果还是4096。也就是说,目录的大小的概念他不是很清楚。

    本人之前也未仔细想过这个问题。翻阅《深入理解linux内核》也未得到答案。于是寻思半天,给出一个答案,不知是否正确,还请有了解的赐教了。

    文件的大小大家都知道,比如一个文件1kb,由于簇的关系,实际占用4kb(假设)。如果我要读取这个文件的全部内容,我是alloc 1kb还是 4kb的内存呢?想必大家都是清楚的,应该是1kb。

    目录在linux下也是相当于一个文件,为了读取目录里面的目录项,我就必须读取它的全部内容。而这个大小就是盘块大小(或者几个盘块大小,视目录项个数决定)。由于目录项并不是连续排列的,比如tt目录里原先有500个文件,删了499个文件,剩下的1个目录项在哪里?是的,可能在一开始,也可能在最后。为了得到里面的那个目录项,我只能把盘块全部读取出来。在没有读取盘块之前,你是没有办法知道里面的目录项的!

    由于目录的特殊性,目录的实际大小就是占用空间的大小(上图就是4096)。这样子,可以使得读取目录和读取文件一样,可以统一起来了。

    话说的有点啰嗦了,不知道有过同样疑问的各位是否能够看懂,如果你有自己的想法,也欢迎讨论~~~


补充:

    这是资料截图。inode 指i_node节点编号,rec_len指离下个目录项的偏移,后面的看看也知道的吧。由于name不丁长,所以需要name_lens。所以一个目录项至少12字节。一个目录块4096字节,可以放多少目录项呢。答案是2+339 =341 。2指 . 和 .. 两个目录项 , 339 为自己创建的文件的目录项。通过测试也证明了我的猜测。你如果创建340个文件,那目录块就会立马变大到12kb。(为什么不是8kb,有谁知道?)。

下面的原文如是说:

The directory entries must be aligned on 4 bytes boundaries and there cannot be any directory entry spanning multiple data blocks. If an entry cannot completely fit in one block, it must be pushed to the next data block and the rec_len of the previous entry properly adjusted.(一个放不下,就放到下一个去,前面的目录项的rec_len字段做相应调整)

    事实上,你删除目录里的文件把目录项删除后,空余的盘块是不会回收的。也就是说,目录的大小只增不减。

原文如下:

A directory is a filesystem object and has an inode just like a file. It is a specially formatted file containing records which associate each name with an inode number. Later revisions of the filesystem also encode the type of the object (file, directory, symlink, device, fifo, socket) to avoid the need to check the inode itself for this information.

The inode allocation code should try to assign inodes which are in the same block group as the directory in which they are first created.

The original Ext2 revision used singly-linked list to store the filenames in the directory; newer revisions are able to use hashes and binary trees.
Also note that as directory grows additional blocks are assigned to store the additional file records. When filenames are removed, some implementations do not free these additional blocks.(记住:如果目录项很多,就会有多个额外的盘块来保存,但当里面的文件删除后,某些实现并不删除这些多余的盘块)

各位可以在自己的pc上试试。欢迎讨论.

转载于:https://my.oschina.net/u/225495/blog/122578

这篇关于为什么linux下空目录大小也是4kb?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277718

相关文章

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Linux:alias如何设置永久生效

《Linux:alias如何设置永久生效》在Linux中设置别名永久生效的步骤包括:在/root/.bashrc文件中配置别名,保存并退出,然后使用source命令(或点命令)使配置立即生效,这样,别... 目录linux:alias设置永久生效步骤保存退出后功能总结Linux:alias设置永久生效步骤

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用