我想了解IO如何从虚拟机发送到硬盘块。
有一个XFS或ext3或ext4等真的很重要的虚拟机内,或者它只是依赖于主机的文件系统?
与虚拟机和物理机相比,对IO的影响是什么?
以下只是基于我所知道的我的假设。 请纠正我,如果我错了:
比方说,我正在使用RAW图像!
示例1: Preallocation=full (Virtual Size = Disk Size)
在这个例子中,我完全排除了主机的文件系统。 我无法find一个方法来关联它。
所有这些都是我的巨大假设。 我觉得我对上述想法是错误的。 但我希望有人会纠正我。
示例2: preallocation=off (Disk Size = Actual usage)
所以,回到我的实际问题。 似乎虚拟机上的文件系统会产生影响,因为所有对IO的调用都是从客户操作系统内核启动的。
Huhhh困惑!!!! 🙁
您可以使用或不使用文件系统访问块设备。 你可以做:
echo "hi" > /dev/sda # (please don't do this! :)
你可以做:
mount /dev/sda /mnt echo "hi" > /mnt/myfile
虚拟化系统完全一样。 您可以将它们configuration为使用原始分区或某个文件来模拟来宾硬盘。 在第一种情况下,主机的文件系统并不重要,因为实际上不会有文件系统。 在第二种情况下,您select的文件系统将具有(次要)影响。
我想你主要关心的是第二种方式,所以我们来关注一下。 基于文件的虚拟“硬盘”只是文件。 他们可以是简单的原始文件(你会看到完全相同的位,就像你会发现如果你真的硬盘),他们可以是特殊的格式文件头信息甚至压缩(如qcow)。 无论如何,他们只是文件。
当然,底层(主机)文件系统确实很重要,因为它托pipe了这个大文件。 一些(最现代的)文件系统可以处理稀疏文件 。 有些处理/删除像XFS这样的大文件的工作效果会更好。 有些可以像GlusterFS一样通过networking传播文件。 事实上,你可以有几层。 从虚拟化系统的angular度来看,整个事情是透明的,只需要文件。
访问硬盘上的物理设备块可以很好地抽象出来。 在极端情况下,您可能需要从物理磁盘构build一个RAIDarrays,在该RAID设备上创build一个LVM卷,然后创build一个新的LVM分区,在该分区上创build一个XFS文件系统,从中创build一个GlusterFSnetworking文件系统在其他机器上的一些类似的设置)。 假设您创build了一个使用位于此glusterFS上的qcow文件的虚拟机。 在虚拟机中创build的ext4文件系统上的磁盘写入将在整个层中传播。 来宾内核的磁盘IO将被转换为虚拟层的文件写入,然后由gluster进行处理,然后由XFS,LVM和raid进行处理。 当然这会带来一些开销,肯定比直接访问慢。
在原始文件的情况下,您可以轻松模拟虚拟化的function。 用dd创build一个大文件,在其上创build分区,在该分区上创build一个文件系统。 你将有一个“硬盘”,这是一个文件。 您现在可以挂载该文件系统,复制操作系统,卸载以及使用文件作为磁盘启动虚拟机! (您必须从其他设备(如虚拟CD)启动,或者您必须在磁盘文件的开头安装grub)。