乐趣区

关于linux:只有1个字节的文件实际占用多少磁盘空间

在前文《新建一个空文件是否占用磁盘空间?占用多少》中咱们理解到了一个空文件的磁盘开销。
明天咱们再思考另外一个问题,如果咱们给文件里只写入 1 个字节,那么这个文件理论的磁盘占用也是 1 个字节吗?

查看 1 个字节的文件

和前文一样,先不谈原理,间接入手操作。

# mkdir tempDir
# cd tempDir
# du -h
0    .
# touch test
# du -h
0    .

在一个目录中创立了一个空的文件当前,通过 du 命令看到的该文件夹的占用空间并没有发生变化。这倒是合乎咱们之前的意识,因为空文件只占用 inode。好,那让咱们批改文件,增加一个字母

echo "a" > test
# du -h
4.0K    .

保留后再次查看该目录的空间占用。咱们发现由原来的 0 减少到了 4K。
所以说,文件里的内容不管多小,哪怕是一个字节,其实操作系统也会给你调配 4K 的。哦,当然了还得再算前文中说到的 inode 和文件夹数据结构中存储的文件名等所用的空间。
所以,不要在你的零碎里保护一大堆的碎文件。文件再小,占用磁盘其实一点都不少!

留神我的试验环境是在 ext 文件系统下进行的。如果是 xfs 可能体现会有些许出入。

持续探讨这个 4K

再把 linux 源代码文件 fs/ext2/ext2.h 里对于 inode 的定义翻出来,咱们找到构造体中定义的指向数据节点用的 block 数组:

struct ext2_inode {
        ......
        __le32  i_block[EXT2_N_BLOCKS]; # 指向存储文件数据的块的数组
        ......

当文件没有数据须要存储的时候,这个数组都是空值。而当咱们写入了 1 个字节当前,文件系统就须要申请 block 去存储了,申请完后,指针放在这个数组里。哪怕文件内容只有一个字节,依然会调配一个整的 Block,因为这是文件系统的最小工作单位。那么这个 block 大小是多大呢,ext 下能够通过 dumpe2fs 查看。

#dumpe2fs -h /dev/mapper/vgroot-lvroot
......
Block size:               4096

在我的机器上,一个 Block 是 4KB。

文件内容再大了怎么办

不晓得你注意没,inode 中定义的 block 数组大小呢,只有 EXT2_N_BLOCKS 个。咱们再查看一下这个常量的定义,发现它是 15,相干内核中定义如下:

#define EXT2_NDIR_BLOCKS                12
#define EXT2_IND_BLOCK                  EXT2_NDIR_BLOCKS
#define EXT2_DIND_BLOCK                 (EXT2_IND_BLOCK + 1)
#define EXT2_TIND_BLOCK                 (EXT2_DIND_BLOCK + 1)
#define EXT2_N_BLOCKS                   (EXT2_TIND_BLOCK + 1)

就按 4K 的 block size 来看,15 个 block 只够存的下 15\*4=60K 的文件。这个文件大小置信你肯定不称心,你存一个 avi 大片都得上 G 了。那 Linux 是怎么实现大文件存储的呢?嗯,其实下面宏的定义过程曾经通知你了,就是只有 12 个数组间接存 block 指针,其余的用来做间接索引(EXT2_IND_BLOCK),二级间接索引(EXT2_DIND_BLOCK)和三级索引(EXT2_TIND_BLOCK)。

这样,一个文件能够应用的空间就指数倍的扩大了。文件小的时候,都用间接索引,磁盘 IO 少,性能好。文件大的时候,拜访一个 block 可能得先进行三次的 IO,性能略慢,不过有 OS 层面的页缓存、目录项缓存的加持,也还好。

论断

文件系统是依照块来治理的,所以不论你的文件多小,哪怕只有一个字节,都会消耗掉整整一个块。这个块大小能够通过 dumpe2fs 等命令来查看。如果想扭转这个块大小怎么办? 对不起,只能从新格式化。



开发内功修炼之硬盘篇专辑:

  • 1. 磁盘开篇:扒开机械硬盘坚挺的外衣!
  • 2. 磁盘分区也是隐含了技术技巧的
  • 3. 咱们怎么解决机械硬盘既慢又容易坏的问题?
  • 4. 拆解固态硬盘构造
  • 5. 新建一个空文件占用多少磁盘空间?
  • 6. 只有 1 个字节的文件理论占用多少磁盘空间
  • 7. 文件过多时 ls 命令为什么会卡住?
  • 8. 了解格式化原理
  • 9.read 文件一个字节理论会产生多大的磁盘 IO?
  • 10.write 文件一个字节后何时发动写磁盘 IO?
  • 11. 机械硬盘随机 IO 慢的超乎你的设想
  • 12. 搭载固态硬盘的服务器到底比搭机械硬盘快多少?

我的公众号是「开发内功修炼」,在这里我不是单纯介绍技术实践,也不只介绍实践经验。而是把实践与实际联合起来,用实际加深对实践的了解、用实践进步你的技术实际能力。欢送你来关注我的公众号,也请分享给你的好友~~~

退出移动版