设备文件,分区和文件系统辨析
在写上一篇博客时,我发现我没搞清楚块设备(block device),分区(partion)和文件系统(filesystem)这几个概念之间的关系,今早查了一些资料才慢慢理解了它们之间的关系,所以我想写出来,看看我能不能将一个问题描述清楚.下面我依次描述设备文件,分区和文件系统这三个概念.
设备文件(Device file)
在类Unix操作系统中,有”一切皆文件(everything is a file)”的思想,当然硬件设备也不例外.在这个思想下,打印机,CD碟片,硬盘,输入输出硬件都被视为一个文件,而这些被视为文件的物理介质就可以称为设备文件.物理介质分为字符设备和块设备,详细的含义见下.除了物理介质,Unix操作系统还有一类设备文件,叫伪设备,这三类设备文件的具体含义是:
字符设备(Character devices)
每次与系统传输数据时,只传输一个字符.没有缓冲区,系统直接从物理设备读取字符.常用于流设备的通信.因为没有缓存,所以只能顺序读取字符,不支持随机读取.像串口和键盘就是字符设备.
块设备(Block devices)
与字符设备相反,块设备每次与系统传输数据时,是以块(Block)的方式来传输的.由于以块来读取,所以需要一定读取时间,故常设有缓存区,支持随机读取.常见的块设备有硬盘,CD-ROM驱动器和闪存等.
伪设备(Pseudo-devices)
前面两种设备文件是物理设备,而伪设备则不是,它们通常是为操作系统提供特定的功能而存在的.常见的伪设备有:
/dev/null
:接受和丢弃所有输入,即吞下输入,然后什么都不做.
/dev/zero
:产生联系的NULL字符串流,用c语言表示就是”\0\0\0\0\0”
/dev/random
:产生一个随机的字符串流
/dev/full
:模拟一个已经装满了内容的设备
这些伪设备有什么用呢?在实际中,如果巧妙使用这些伪设备的话,可以提高工作效率,像命令
1 | dd if=/dev/zero of=testzero count=1024 bs=1024 |
就会创建一个大小为1024的,文件名为testzero的空文件.
上面就是设备文件的大概内容.在Linux 下,设备文件都在/dev
目录下,并且有特定的前缀,可以看看:
1 | $ cd /dev |
可以看到有很多的设备文件,前面提到的/dev/null
等伪设备也在里面.
对特定类型的设备有特定的前缀,如对硬盘,前缀是sd
,如sda
就是第一块硬盘.对终端设备,前缀是tty
.
像我们的笔记本,一般只有一块硬盘,也就是只有一个块设备,我们可以将所有内容都存在这个设备上,像日志文件,/home
下面的文件都平等的存放,谁东西多就多占点空间.
但这样有个问题,由于日志文件占地方会比较大,如果有一天,将整个设备占满之后,其他文件就没有地方放了,整个系统就没法再正常运转下去了.所有就产生了这种方案:将一块设备划分成好几个部分,比如日志文件放一个部分,/home
文件放另一个部分,相互隔离开.如果日志文件占满了,别的空间还能正常使用,所以分区解决了上述问题.
还有如果你想装双系统,如果不分区,两个操作系统混在一起,可能会发生很多意外,所以分区显得很有必要.
分区(Partition)
从上面我们可以看到,分区其实就像把一个硬盘分成了好几份,就跟把一个大蛋糕切成好几块,一人一块一样.其实从前面的/dev目录下的设备文件我们可以看到,sda
这个设备被分成了6个分区,分别是sda1
,sda2
,….sda6
.就像有些动物通过撒尿来标记自己领地的边界一样,块设备也有特定的标记分区边界的文件,那就是分区表.分区表就像契约一样,规定了硬盘的前多少个空间分给分区1,后面多少空间分给分区2,等等.可以通过fdisk
指令来查看分区详情:
1 | $ sudo fdisk -l |
前面是硬盘的物理信息,如大小,有多少个柱面等等.后面是各个分区的开始位置,结束位置,包含多少个Blocks,系统类型等信息.
分区完成后,我们就可以在不同的分区上干不同的事情了.我把sda2
标记为C盘,把sda3
标记为D盘,把Linux的根目录挂载在sda6
上,把/home
目录挂载在sda5
上,大家互相不再干扰,和谐共处.
文件系统(Filesystem)
在Windows下,我们格式化U盘的时候,会让你选择格式化为FAT16,FAT3或者NTFS等,那么这些东西又是什么东西呢?这些东西就是不同的文件系统格式.
文件系统是一种存储和组织计算机数据的方法,通过文件系统,我们可以使用简单的方式来对物理介质执行操作.比如,没有文件系统,如果我要删除一个文件,那么我就得先找到它在硬盘上的哪个扇区,哪个柱面,然后删除它.有了文件系统,我可以用图形化的界面按Shift
+Delete
删除.这些简便都是文件系统的功劳.如果说分区这个概念是物理上的概念的话,那么文件系统就是纯粹的逻辑上的概念了.
不同的系统支持的文件系统不同,
1 | Windows:FAT16,FAT32,NTFS等 |
如何查看各个分区的文件系统呢?可以用blkid
命令:
1 | $ sudo blkid |
可以看到,/dev/sda1
,/dev/sda2
和/dev/sda3
是ntfs文件系统,/dev/sda5
和/dev/sda6
是ext4文件系统.(/dev/sda4去哪了呢?…)
最后用一个图来总结一下: