---
layout: post
title: 关于虚拟化的学习记录
tags: [虚拟化, 记录]
---

  虚拟机……感觉有点哲学。<!--more-->   

# Mayx的虚拟化学习史
## PC上的虚拟机使用史
  在我小的时候，我就玩过虚拟机，那时候Windows10还没有出来，用的还是WindowsXP的系统，那时候我使用的虚拟机软件是VMWare Workstation。过去的VMWare和现在的感觉区别不大，十年过去了感觉加的功能也不多，非要说哪个功能有更新的话可能也就是随着现在的物理机更新一样增加了一些比如UEFI之类的功能吧。   
  后来我用上了Windows10，那时候我还是第一批用上Windows10的人，正式版还没有出来，我就已经用上了技术预览版，不过直到正式版出来我依然使用的是VMWare做虚拟机。后来我在系统里乱逛的时候发现了Hyper-V，那是一个比VMWare更轻量，更底层的一个虚拟机，不需要下载其他程序，就能在Windows10里直接打开，非常方便。   
  自从我知道了Hyper-V后就再不用VMWare了，除了两个不能共存的原因之外还有就是Hyper-V感觉更稳定，速度更快，而且与Windows的结合更好。不过有一个缺点就是没有办法挂载USB设备，这个就很麻烦……   
  以前我在用VMWare的时候经常遇到一个问题就是有时候虚拟机里面的系统卡死了，但是我点关机的时候用的是客户机关机，然后VMWare就卡死了。这时候就算结束掉它用来获取计算资源的进程`vmware-vmx.exe`也没用，就算是注销也不行，只能关机，重启之后也经常会因为锁的原因而出现打不开的问题就很麻烦。但是自从我用了Hyper-V之后就再也没有遇到过这种情况，大概是因为Hyper-V对资源的管控更好吧，基本上不会出现虚拟机把物理机怼死的情况。   
  说到这里就让我想起最近我安装的ESXi了，由于我的主电脑用的是Hyper-V，垃圾ESXi没有Hyper-V网卡的驱动，然后就怎么装都装不上，然后没办法我就只能用我的旧电脑安，结果安好之后发生了一个很神奇的事情，就是用ESXi创建一个虚拟机然后启动之后物理机就直接断电重启了，这就有点不太合适了，虚拟机无论怎么搞能影响到物理机就不太合格了啊。   
  总的来说可以发现PC机虚拟化的软件基本上都是依靠CPU内置的虚拟化指令来运行的，所以效率很高。
## 手机的虚拟机使用史
  手机上我也安装过不少种类的虚拟机，最早我用的手机性能很差，好像还是清华紫光的CPU。那个垃圾手机当时我还拿来当服务器使。虽然我也知道其他的虚拟机但是那个手机带不起来，我记得最早我用的是DOSBox Turbo，在那个上面我安装了一个Windows3.2的系统。不过这个软件除了这一个虚拟机就不能再开别的系统了，而且基本上没有隔离，它可以直接访问手机里的文件，这就不太好。   
  后来我用上了一个稍微好一点的手机，那时候我知道了Bochs，不过那个系统不是我自己装的，那个软件的配置文件对那时候的我来说太复杂了，我看不懂，所以是直接用的贴吧上的镜像。   
  知道了Bochs之后我就了解到了Limbo，那是一个基于qemu的虚拟机，用起来要比Bochs简单很多，不用写配置文件就可以直接使用。所以这个东西只要不是用的需要一些特别的指令都没问题，我试着装了WindowsXP以及MenuetOS、KolibriOS、TempleOS等等基本上都可以正常运行。   
  后来我还试了试别的软件，比如VMOS，好像也是一个基于qemu的虚拟机，不过它是ARM指令集的，安装的是Android系统，在很多时候运行一些有可能有问题的软件很方便。   
  还有一个是ExaGear，是基于Wine制作的，它只能在一定程度上运行Windows的程序，而且因为它也是跨指令集的，其实效率不这么高。   
  以上我们可以发现手机上的虚拟机基本上都是软件模拟的（指令集都不一样想怎么搞虚拟化指令？），虽然ARM的CPU应该支持硬件虚拟化，但是目前我的了解是没发现有类似的软件。
## 其他平台的虚拟机
  除了在电脑和手机上的虚拟机，还有在浏览器上运行的虚拟机（真就JS创造宇宙呗）。qemu的作者Fabrice Bellard曾经写过一个叫做[JSLinux](https://bellard.org/jslinux/)的项目，可以运行比如x86指令集的系统，相当厉害。
  
# 对虚拟化概念的探索
  说完对虚拟化平台的使用，我觉得虚拟机的概念和实现还是比较神奇的。什么是虚拟机？我觉得应该只要是在逻辑上提供运算及存储资源的东西都可以称作是虚拟机，包括人也可以作为一种虚拟化平台。我以前听说过一个故事讲的是图灵下国际象棋，他写了一个下国际象棋的程序，但是那时候还没有电脑。于是他自己就模拟电脑的执行方式和朋友下完了象棋。我觉得他在执行这个程序的时候就相当于开了一个虚拟机，在逻辑上构造了一台可以运行他程序的机器，毕竟图灵是人，不是机器，所以我觉得应该可以叫做虚拟机。   
  但是这么来说的话，只要不是实模式的操作系统我觉得应该都算是虚拟机，因为程序没有真正享用到电脑的所有运算与存储资源，它们的资源都是由操作系统所分配，这么来看操作系统岂不是也是虚拟机？那么这种虚拟机的意义就和实际的虚拟机意义不相符了，我觉得应该再加一些限制条件。   
  操作系统的特点是BIOS将代码载入到内存中，程序的特点则是操作系统将代码载入到内存中。这么来看的话我觉得就可以得出需要BIOS载入代码，并提供运算和存储资源的东西应该才能叫虚拟机……但是BIOS又算什么呢……emmmm所以就是这种原因导致了我感觉虚拟机有些哲学。   
  除此之外还有像沙箱、Docker这些对资源再次分配的程序，它们只是进行资源限制，但是程序的代码不是由它们载入的……这就更迷了……
  
# 未解决的问题
  一般我们认为虚拟化是将一台电脑的资源合理分配，把一台电脑当作很多台来用，但是我听说有一种叫做虚拟化集群的东西，可以把一大堆电脑模拟成一台电脑来用。但是这时候我觉得就会有一些问题，比如一般程序会有比如进程间通讯之类的功能，但是两个进程假如放在了不同的两个电脑，它们的通讯岂不是要通过网线？正常情况下应该是通过内存进行通讯吧？这个速度估计得差几千倍，就算是多CPU的服务器之间也是通过总线连接。拿网线连接真的能用吗？这就让我对虚拟化集群这个感到有些迷惑，不知道那些虚拟化软件是怎么搞的。
