LINUX 文件系统

本贴最后更新于 2198 天前,其中的信息可能已经渤澥桑田

磁盘构成及分区

磁盘物理结构

本文只讨论机械磁盘,SSD 不在本文讨论范围之内。对于管理磁盘,分磁盘面、磁头、磁道、柱面和扇区。

  1. 磁盘面:磁盘是由一叠磁盘面组成,见下左图。
  2. 磁头(Heads):每个磁头对应一个磁盘面,负责该磁盘面上的数据的读写。
  3. 磁道(Track):每个盘面会围绕圆心划分出多个同心圆圈(磁道)。
  4. 柱面(Cylinders):所有盘片上的同一位置的磁道组成的立体叫做一个柱面。
  5. 扇区(Sector):以磁道为单位管理磁盘仍然太大,所以计算机前辈们又把每个磁道划分出了多个扇区,见下右图


  Linux 上可以通过 fdisk 命令,来查看当前系统使用的磁盘的这些物理信息。

  以上是我本人的一台虚拟机的磁盘物理信息。可以看出我的磁盘有 255 个 heads,也就是说共有 255 个盘面。3263 个 cylinders,也就是说每个盘面上都有 3263 个磁道, 63sectors/track 说的是每个磁道上共有 63 个扇区。命令结果也给出了 Sector size 的值是 512bytes。那我们动笔算一下该磁盘的大小吧。

  255 盘面 * 3263 柱面 * 63 扇区 * 每个扇区 512bytes = 26839088640byte。

结果是 26.8G,和磁盘的总大小相符。

  另外查看了其它两台机器的磁盘情况,发现个有意思的事情。无论磁盘的容量大或者是小,其磁头数和每磁道扇区数都是不变的,只是磁道变多了而已 , 也就是说磁盘容量大就是其磁道更多而已

分区

  分区是操作系统对磁盘进行管理的第一步,这也是我们任何一个计算机使用者都非常熟悉的概念。例如 Windows 下的 C、D、E、F 盘。那么请思考一下,

思考:前面的磁盘的详细物理结构已经有了,如果让你把整块磁盘分成 C、D 等分区,你会怎么分呢?

  1. 方案一: 255 个盘面,C 盘是 0-100 盘面, D 盘是 101-200 个盘面,……
  2. 方案二:3263 个柱面,C 盘 0-1000 个柱面,D 盘 1001-20001 个柱面,……(此方案更优)

  先说下磁盘 IO 时的过程。第一步,首先是磁头径向移动来寻找数据所在的磁道。这部分时间叫寻道时间。第二步,找到目标磁道后通过盘面旋转,将目标扇区移动到磁头的正下方。第三步,向目标扇区读取或者写入数据。到此为止,一次磁盘 IO 完成,故:

单次磁盘 IO 时间 = 寻道时间(找到磁道) + 旋转延迟(找到扇区) + 存取时间(存取数据)。

  对于旋转延时,现在主流服务器上经常使用的是 1W 转/分钟的磁盘,每旋转一周所需的时间为 60*1000/10000=6ms,故其旋转延迟为(0-6ms)。对于存取时间,一般耗时较短,为零点几 ms。对于寻道时间,现代磁盘大概在 3-15ms,其中寻道时间大小主要受磁头当前所在位置和目标磁道所在位置相对距离的影响。

  其实采用哪一种,最主要看的是那种方式性能更快。因为同一分区下的数据经常会一起读取,假如采用第一种,那么这样磁头就需要在 3000 多个磁道间不停地跳来跳去,这样磁盘的寻道时间就会翻倍,磁盘性能就会下降。而对于方案二,假如对于磁盘 C,只需要在磁头在 1-1000 个磁道间移动就可以了,大大降低了寻道时间。(实际上分区并不是从 0 开始的,磁盘的第一个磁道对应的柱面会被用来安装引导加载程序以及磁盘分区表)。所以,方案二的分区方式可以降低磁盘 IO 时间中的寻道时间部分,所以所有的操作系统采用的都是方案二,没有用方案一的。

目录与文件

引子

首先,来提个几个小小的问题

  1. 为什么目录占用的空间是 4096?
  2. 为什么空文件占用的空间却是 0?
  3. 如果空文件真占用 0byte 空间,那么该文件的文件名、创建者以及权限-rw-rw-r—等文件夹相关的信息都存到哪儿去了?

空文件不占用空间?

  为了解开这个谜底,需要借助 df 命令。输入 df –i,

  Linux 结果中红框位置处显示的是 inodes 的相关信息,如果你对 inode 的概念不熟悉,你可以暂时把它当成一个操作系统秘密管理的一个家伙,会占用空间就行了。接下来我 touch 一个空的文件后再次 df -i。

  虽然前面操作系统告诉我们,一个新建的空文件占用的空间是 0。但是这个实验却证明操作系统“欺骗”了我们,它消耗掉了一个 inode。那么 inode 的节点大小是多少呢,使用 dumpe2fs 命令可以帮助我们查看到这个东东的实际大小:256。它告诉我们每个 inode 的大小是 256Byte。当然这个大小每台机器都会不一样,它实际上是在系统格式化磁盘的时候决定的。

  所以新建一个空的文件是会占用磁盘空间的,实际占用的是 256Byte。准确的说应该是一个 inode size,具体的值是在格式化时决定的。

  再说说新建空目录吧,前面说了新建空目录会占用 4KB 的磁盘空间。那么仅仅如此吗? 我们同样在新建目录前后都使用 df –i 来监视系统 inode 的占用。原来新建目录也是会占用一个 inode 节点的,新建一个空目录会占用磁盘空间 4KB + inode size。 哦,这个在你的系统上也不一定是 4K,它实际上一个 block size。同样在 dumpe2fs 下可以看到。
那么,总结一下,一个空目录占一个block size(4k)+一个inode size(256byte),一个空文件占一个inode size,这两个数值的大小都可以在磁盘格式化的时候设定。

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    946 引用 • 943 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...