如何理解linux中文件系统和分区两个概念的区别?【转】


作者:逆风
链接:https://www.zhihu.com/question/408874339/answer/1360179482
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

对于新手,我尽量用简单通俗的话和你说,尽可能不涉及到专业术语,尽量用你见过的东西去解释一个术语,这是最好的理解方式。

首先分区文件系统都是软件概念

分区就是把一块磁盘分成多少个多少个块,然后你可以在这些块上存东西,比如Windows的C盘和D盘,比如Linux的1号分区2号分区。分区在硬盘上的记录形式仅仅是一些数字,比如它在磁盘的最开始处,用数字的方式记录了每个分区有多大每个分区在硬盘的哪里(偏移量)(参考mbr分区表),而操作系统读取这些数字,才有了每个分区有多大,在硬盘的哪里这些概念,断了电仅仅就是一块硬盘里面内容什么都不知道,所以是软件概念。

文件系统的实质其实就是一堆逻辑代码,告诉操作系统以怎样的形式在这个分区上存文件,你想想看,你想存的这么多文件都是有大小的,而硬盘只能一个字节一个字节记录信息,所以要设定一些规则,这个文件的偏移量是多少,这个文件有多大,文件应该分多少块去储存,要怎么记录到分区里,怎样的方式能让分区读写文件的效率尽可能高,空间利用率尽可能高,安全性稳定性尽可能高。


另外你还有很多小疑惑,我一一来说

linux对于分区的概念,其实只有一号分区,二号分区。至于/dev/sda1这些,他们是块设备文件,不要理解为分区。这源于linux的一切皆文件的设计:你对 /dev/sda1的所有读写操作,都会被等同于对一号分区的读写操作;你对 /dev/sda 的所有读写操作都会被等同于对第一块硬盘的读写操作。

至于 tmpfs,rootfs,devtmpfs,procfs,sysfs 等等,他们是虚拟文件系统,是一种特殊的文件系统。我们普通文件系统有 ext3 ext4 ntfs 等等是为了储存自己的一些文件,而虚拟文件系统这个概念的设计,同样也是源于 linux 一切皆文件的设计:

1. 直接把各种设备(硬盘、声卡、显卡等等)的读写等同于对一些文件的读写,是不是方便很多呢?于是产生了 devtmpfs 这个概念,才能让你对 /dev/sda1 的操作等同于对第一块分区的读写,才能让你对 /dev/dsp 的写入等同于对一块声卡的输出从而发出声音,等等等等。是不是很方便?

2. 直接把系统里面的进程信息,映射成一些文件,让你直接访问这些文件就能得到进程的信息,让你不必调用 api 了。于是产生了 procfs 的概念,你对 /proc/1 这个目录里面文件进行读取,就能得到 pid 为1的进程的很多信息。是不是很方便?

这里就举这两个例子,其它的虚拟文件系统的作用可以自己查到相关资料。

可以看出来,虚拟文件系统和普通文件系统的区别在于,虚拟文件系统的设计不是为了让你储存文件,而是为了让你更方便地与操作系统交互,他们都是在系统初始化的时候挂载上的。


最后,还一个小问题。

df命令一般被用来查看各个分区的磁盘使用情况(Disk Free的缩写),至于 df 的第一列输出 Filesystem,是为了告诉你这个文件系统在哪,不代表它的内容就是文件系统。所以没有那么严谨,或许把第一列的名字改成设备 device 会更好一些?这得问 df 的设计者为何要这样设计了,可能是没有别的合适的名字可取。


最后告诉你一个学习的小技巧。学习每个概念之前,最好是先理解它存在的意义,为什么会有人提出这样的概念,解决了什么问题?怎样方便了人类?

正如我这篇回答如何让你理解这些概念一样。