linux很强悍,inux服务器也急剧显得越来越强悍了。无论是估算、网络、存储,都越来越牛。诸如,显存动不动就是百G显存,网路设备一个端口的带宽才能有几十G甚至上百G,储存在数据中心起码是PB级别的。并且也有其益处:
为了解决这种问题,可以在化学机上创建虚拟机。每位虚拟机都有自己单独的操作系统、灵活的尺寸,一个命令才能启动上去。每次创建都是新的操作系统,挺好的解决了前面不灵活的问题。
并且要使用虚拟机,还有一些问题须要解决一下。
我们晓得,操作系统上的程序分为两种,一种是用户态的程序,例如work,Excel等,一种是内核态的程序,例如内核代码、驱动程序等。
为了分辨内核态和用户态,CPU专门设置四个特权等级0、1、2、3来做这个事情。
当时写linux内核的时侯,恐怕大牛们还不晓得将来虚拟机会大放异彩。大牛们想,一共两级特权,一个内核态、一个用户态,却有四个等级,很奢华、很丰富,于是就敞开了用。内核态运行在第0等级,用户态运行在第3等级,占了两头,中间的都不用,太不会过日子了。
大牛们在写linux内核的时侯,假如用户态程序做事情,就将扳手掰到第3等级,一旦要申请使用更多的资源,就须要申请把扳手掰到第0等级linux更改ip地址,内核能够在高权限访问那些资源,申请完资源,返回到用户态,扳手再掰回来。
这个程序仍然十分顺利的运行着,直至虚拟机出现了
三种虚拟化形式
假如你安装virtualBox桌面版,你可以用这个虚拟机软件创建虚拟机,在虚拟机上面根据一个linux,外边的操作吸引也可以是linux。VirtualBox这个虚拟化软件,和你的Excel一样,都是在你的任务栏上面并排放着,是一个普通的应用。
当你步入虚拟机的时侯,虚拟机上面的Excel也是一个普通的应用。
这个时侯麻烦的事情出现了,当你设身处地地站在虚拟机的内核角度,去思索一下人生,你还会出现困扰了,会想,我究竟是啥?
在硬件上的操作系统来看,我是一个普通的应用,只能运行在用户态。而且大牛们“生“我的时侯,我的每一行代码都告诉我,我是个内核啊,应当运行在内核态。当虚拟机上面的Excel要访问网路的时侯,向我恳求,我的代码就要努力地去操作网卡。虽然我努力,然而我做不到啊,我没有权限!
我分裂了……
如何办呢?虚拟化层,也就是Virtualbox会帮你解决这个问题linux 网卡虚拟化命令,它有三种虚拟化的形式。
我们先来看第一种方法,完全虚拟化(Fullvirtualization)。虽然说白了,这是一种“骗人”的形式。虚拟化软件会模拟假的CPU、内存、网络、硬盘给到我,让我自我觉得良好,觉得自己总算又像个内核了。
然而,真正的工作模式虽然是下边这样的。
虚拟机内核说:我要在 CPU 上跑一个指令!
虚拟化软件说:没问题,你是内核嘛,可以跑!
虚拟化软件转过头去找物理机内核说:报告,我管理的虚拟机里面的一个要执行一个 CPU 指令,帮忙来一小段时间空闲的 CPU 时间,让我代它跑个指令。
物理机内核说:你等着,另一个跑着呢。(过了一会儿)它跑完了,该你了。
虚拟化软件说:我代它跑,终于跑完了,出来结果了。
虚拟化软件转头给虚拟机内核说:哥们儿,跑完了,结果是这个。我说你是内核吧,绝对有权限,没问题,下次跑指令找我啊!
虚拟机内核说:看来我真的是内核呢,可是,哥,好像这点儿指令跑得有点慢啊!
虚拟化软件说:这就不错啦,好几个排着队跑呢!
显存的申请模式是下边这样的。
虚拟机内核说:我启动需要 4G 内存,我好分给我上面的应用。
虚拟化软件说:没问题,才 4G,你是内核嘛,我马上申请好。
虚拟化软件转头给物理机内核说:报告,我启动了一个虚拟机,需要 4G 内存,给我 4 个房间呗。
物理机内核:怎么又一个虚拟机啊!好吧,给你 90、91、92、93 四个房间。
虚拟化软件转头给虚拟机内核说:哥们,内存有了,0、1、2、3 这个四个房间都是你的。你看,你是内核嘛,独占资源,从 0 编号的就是你的。
虚拟机内核说:看来我真的是内核啊,能从头开始用。那好,我就在房间 2 的第三个柜子里面放个东西吧!
虚拟化软件说:要放东西啊,没问题。但是,它心里想:我查查看,这个虚拟机是 90 号房间开头的,它要在房间 2 放东西,那就相当于在房间 92 放东西。
虚拟化软件转头给物理机内核说:报告,我上面的虚拟机要在 92 号房间的第三个柜子里面放个东西。
好了,说完了CPU和显存的反例,网路和硬碟就不细说了,情况也是类似的,都是虚拟化软件模拟一个给虚拟机内核看的,虽然啥事儿都须要虚拟化软件转一遍。
这些方法一个益处就是,慢,但是常常慢到不能忍受。
于是,虚拟化软件想,我能不能不当传话筒,要让虚拟机内核正视自己的身分。别说你是内核,你还真喘上了。你不是化学机,你是虚拟机!
然而,如何解决权限等级问题呢?于是,Intel的VT-x和AMD的AMV-V从硬件层面帮上了忙。曾经谁让大家这种写内核的大牛用等级如此奢华,用完了0,就是3,也不省着点儿用,没办法,只得另起炉具弄一个新的标志位,表示当前是在虚拟机状态下,还是在真正的数学机内核下。
对于虚拟机内核来讲,只要将标志位设为虚拟机状态,我们就可以直接在CPU上执行大部份的指令,不须要虚拟机软件在中间转述,除非碰到非常敏感的指令linux游戏,才须要将标志位设为化学机内核态运行,这样大大提升了效率。
所以,安装虚拟机的时侯,我们勿必要将化学CPU的这个标志位打开。想晓得是否打开,对于Intel,你可以查看grep“vmx”/proc/cpuinfo;对于AMD,你可以查看grep“svm”/proc/cpuinfo
这叫作硬件辅助虚拟化(Hardware-AssistedVirtualization)。
另外就是访问网路或则硬碟的时侯,为了取得更高的性能,也须要让虚拟机内核加载特殊的驱动,也是让虚拟机内核从代码层面就重新定位自己的身分,不能像访问数学机一样访问网路或则硬碟,而是用一种特殊的模式。
我晓得我不是化学机内核,我晓得我是虚拟机,我没这么高的权限,我很可能和好多虚拟机共享化学资源,所以我要学会排队,我写硬碟虽然写的是一个数学机上的文件,那我的写文件的缓存方法是不是可以变一下。我发送网路包,根本就不是发给真正的网路设备,而是给虚拟的设备,我可不可以直接在显存上面拷贝给它,等等等等。
一旦我晓得我不是化学机内核,痛定思痛,只得重新认识自己,反倒能找出好多形式来优化我的资源访问。
这叫作半虚拟化(Paravirtualization)。
对于桌面虚拟化软件,我们多采用VirtualBox,假如使用服务器的虚拟化软件,则有另外的选型。
服务器上的虚拟化软件,多使用qemu,其中关键字emu,全称是emulator,模拟器。所以,单纯使用qemu,采用的是完全虚拟化的模式。
qemu向GuestOS模拟CPU,也模拟其他的硬件,GuestOS觉得自己和硬件直接打交道,虽然是同qemu模拟下来的硬件打交道,qemu会将这种指令转译给真正的硬件。因为所有的指令都要从qemu上面过一手,因此性能都会比较差。
根据前面的介绍,完全虚拟化是极其慢的,所以要使用硬件辅助虚拟化技术Intel-VT,AMD-V,所以须要CPU硬件开启这个标志位,通常在BIOS上面设置。
当确认开始了标志位以后,通过KVM,GuestOS的CPU指令不用经过Qemu转译,直接运行,大大提升了速率。
所以,KVM在内核上面须要有一个模块,来设置当前CPU是GuestOS在用,还是HostOS在用。
下边,我们来查看内核模块中是否富含kvm,lsmod|grepkvm。
KVM内核模块通过/dev/kvm曝露插口,用户态程序可以通过ioctl来访问这个插口。比如,你可以通过下边的流程编撰程序。
Qemu将KVM整合进来,将有关CPU指令的部份交由内核模块来做,就是qemu-kvm(qemu-system-XXX)。
qemu和kvm整合以后,CPU的性能问题解决了。另外Qemu都会模拟其他的硬件linux 网卡虚拟化命令,如网路和硬碟。同样,全虚拟化的形式也会影响那些设备的性能。
于是,qemu采取半虚拟化的形式,让GuestOS加载特殊的驱动来做这件事情。
比如,网路须要加载virtio_net,储存须要加载virtio_blk,Guest须要安装这种半虚拟化驱动,GuestOS晓得自己是虚拟机,所以数据会直接发送给半虚拟化设备,经过特殊处理(比如排队、缓存、批量处理等性能优化方法),最终发送给真正的硬件。这在一定程度上提升了性能。
至此,整个关系如右图所示。
总结