linux磁盘和分区,虚拟文件系统
Linux操作系统有三类主要的设备文件:
1.字符设备:以字节为单位进行顺序I/O操作的设备;
2.块设备:以块单位接收输入返回,对于I/O请求有对应的缓冲区,可以随机访问,块设备的访问位置必须能够在介质的不同区间前后移动。在块设备中,最小的可寻址单元是扇区,扇区的大小一般是2的整数倍,常见的大小为512个字节;
3.网络设备:提供网络数据通信服务。
这里主题讨论块设备。
以磁盘为例:
fd:软驱
hd:IDE 磁盘
sd:SCSI 磁盘
tty:terminals
vd:virtio 磁盘
1.扇区(Sectors):任何块设备硬件对数据处理的基本单位。通常,1个扇区的大小为512byte。
2.块(Blocks):由Linux制定对内核或文件系统等数据处理的基本单位。通常,1个块由1个或多个扇区组成。
使用virtio_blk驱动的磁盘显示为“/dev/vda”,这不同于IDE硬盘的“/dev/hda”或者SATA硬盘的“/dev/sda”这样的显示标识。
磁盘分区知识要点
在Linux系统中所有的磁盘以及磁盘中的每个分区都是用文件的形式来表示的。比如在你的电脑中有一块硬盘,硬盘上划分了3个分区,那么在Linux系统中就会有相应的4个设备文件,一个是硬盘的设备文件,另外每个分区也有一个设备文件,所有的设备文件都统一存放在/dev目录中。
不同类型的硬盘和分区的设备文件命名都有统一的规则,具体表述形式如下:
硬盘:对于IDE接口的硬盘设备,表示为“hdX”形式的文件名,对于SATA或SCSI接口的硬盘设备,则表示为“sdX”形式的文件名,其中“X”可以为a、b、c、d等字母序号。例如,将系统中的第1个IDE设备表示为“hda”,将第2个SATA设备表示为“sdb”。
分区:表示分区时,以硬盘设备的文件名作为基础,在后边添加该分区对应的数字序号即可。例如,第1个IDE硬盘中的第1个分区表示为“hda1”、第2个分区表示为“hda2”,第2个SATA硬盘中的第3个分区表示为“sdb3”,第4个分区表示为“sdb4”等。
需要注意的是,由于主分区的数目最多只有四个,因此主分区和扩展分区的序号也就限制在1~4之间,而逻辑分区的序号将始终从5开始。例如,即便第1个IDE硬盘中只划分了一个主分区、一个扩展分区,则新建的第1个逻辑分区的序号仍然是从5开始,应表示为“sda5”,第2个逻辑分区表示为“sda6”。
另外,对于所有使用USB接口的移动存储设备,不论是移动硬盘、优盘,还是USB光驱,都一律使用/dev/sdxx的设备文件。光驱(光盘)的设备文件一般默认为/dev/cdrom,这个就与光驱的接口无关了。
每块硬盘都分为若干个分区,每个分区都有自己的文件系统。
所谓的"挂载"就是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下; 也就是说,进入该目录就可以读取该分区的意思。这个操作我们称为"挂载",那个进入点的目录我们称为"挂载点"。由于整个Linux系统最重要的是根目录,因此根目录一定需要挂载到某个分区的。至于其他的目录则可依用户自己的需求来给予挂载到不同的分区。
Linux的文件结构是单个的树状结构,根目录是“/”,其他目录都要位于根目录下。
每次安装系统的时候我们都会进行分区,Linux下磁盘分区和目录的关系如下:
任何一个分区都必须对应到某个目录上,才能进行读写操作,称为“挂载”。
被挂载的目录可以是根目录,也可以是其他二级、三级目录,任何目录都可以是挂载点。
目录是逻辑上的区分。分区是物理上的区分。
根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。
下图是常见的目录和分区的对应关系:
为什么要分区,如何分区?
可以把不同资料,分别放入不同分区中管理,降低风险。
大硬盘搜索范围大,效率低。
/home、/var、/usr/local 经常是单独分区,因为经常会操作,容易产生碎片。
VFS (虚拟文件系统)
Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的 操作可以跨文件系统而执行。如下图所示,我们可以使用 cp 命令从 vfat 文件系统格式的硬盘拷贝数据到 ext3 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件系统。
过程:VFS调用 vfat 的读文件方法将 a.txt 的数据读入内存;再将 a.txt 在内存中的数据映射到b.txt对应的内存空间后,VFS调用ext3的写文件方法将b.txt写入磁盘;从而实现了最终的跨文件系统的复制操作。
“一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。操作文件时需先打开;打开文件时,VFS 会知道该文件对应的文件系统格式;当VFS把控制权传给实际的文件系统时,实际的文件系统再做出具体区分,对不同的文件类型执行不同的操作。这也就是“一切皆是文件”的根本所在。
从物理介质读文件的具体过程:
当在用户应用程序调用文件 I/O read()操作时,系统调用 sys_read() 被激发,sys_read() 找到文件所在的具体文件系统,把控制权传给该文件系统,最后由具体文件系统与物理介质交互,从介质中读出数据。
看相关链接:
https://www.cnblogs.com/sammyliu/p/4521315.html
https://www.cnblogs.com/okyoung188/p/7190409.html
https://blog.csdn.net/sdulibh/article/details/51802071