家里有一台ubuntu18的迷你主机作为服务器长期运行,由于之前装了24G的内存以及之前的业务长期只占用一个核心且消耗不了几GB的内存,大量的资源都长时间闲置,造成了一定的浪费,并且某些服务需要用到Windows server,我想着与其再去购入一台能流畅运行windows server的vps,不如充分利用资源,使用该迷你主机虚拟化一个windows server的vps出来使用。
技术介绍
常见虚拟化技术
- Xen:
它是基于硬件的完全分割,物理上有多少的资源就只能分配多少资源,因此很难超售。Xen是不能超售内存和硬盘的,当母服务器只有16G内存以及100G硬盘时,当开Xen架构(任意一个虚拟化)的1G内存、25G硬盘的子机时,会直接占用服务器1G内存,以及25G硬盘,所以Xen的性能,相比OpenVZ在超售的情况下要好。
- OpenVZ:
用SWsoft的Virutozzo虚拟化服务器软件产品的内核,是基于Linux平台的操作系统级服务器虚拟化架构。当然 OpenVZ可以超售,意思味着一台服务器总共16G内存,他可以开出配置为1G内存×17台以上的子服务器。因为他的虚拟架构关系属于:客户用多少,就扣除母服务器多少。另一个特点是,它是直接调用母服务器的内核,所以会导致部分软件无法使用,以及部分内核文件是无法修改。
- KVM:
KVM是全功能虚拟化架构,甚至拥有独立的BIOS控制,所以对母服务器性能影响较大,所以基于KVM的VPS较贵,但KVM VPS相对其它架构的VPS较为自由。性能比Xen略低。
- Hyper-V :
微软的一款虚拟化产品,大部分国内的VPS服务商使用这个架构,主要是因为其转为Windows定制,管理起来较为方便。目前的Hyper-V也支持Linux,只不过性能损失比较严重。
- VMWare
是全球桌面到数据中心虚拟化解决方案的领导厂商开发的一款全功能完全虚拟化的软件。这个大家应该最熟悉。Windows上装VMWare跑linux 的很多。不过因为授权很贵,普通VPS很少用这个的。和OpenVZ架构一样,子机用多少内存,就扣除系统多少内存,所以也存在超售可能。
目前VPS提供商主要是OpenVZ,因为便宜。KVM相对贵一些,提供Xen的并不是很多。
QEMU和KVM的关系
我们用的是kvm来进行虚拟化,但是我们又经常能看见qemu的身影,那么它们之间到底是什么关系呢?
转载自: https://zhuanlan.zhihu.com/p/48664113
首先KVM(Kernel Virtual Machine)是Linux的一个内核驱动模块,它能够让Linux主机成为一个Hypervisor(虚拟机监控器)。在支持VMX(Virtual Machine Extension)功能的x86处理器中,Linux在原有的用户模式和内核模式中新增加了客户模式,并且客户模式也拥有自己的内核模式和用户模式,虚拟机就是运行在客户模式中。KVM模块的职责就是打开并初始化VMX功能,提供相应的接口以支持虚拟机的运行。
QEMU(quick emulator)本身并不包含或依赖KVM模块,而是一套由Fabrice Bellard编写的模拟计算机的自由软件。QEMU虚拟机是一个纯软件的实现,可以在没有KVM模块的情况下独立运行,但是性能比较低。QEMU有整套的虚拟机实现,包括处理器虚拟化、内存虚拟化以及I/O设备的虚拟化。QEMU是一个用户空间的进程,需要通过特定的接口才能调用到KVM模块提供的功能。从QEMU角度来看,虚拟机运行期间,QEMU通过KVM模块提供的系统调用接口进行内核设置,由KVM模块负责将虚拟机置于处理器的特殊模式运行。QEMU使用了KVM模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化加速以提高虚拟机的性能。
KVM只模拟CPU和内存,因此一个客户机操作系统可以在宿主机上跑起来,但是你看不到它,无法和它沟通。于是,有人修改了QEMU代码,把他模拟CPU、内存的代码换成KVM,而网卡、显示器等留着,因此QEMU+KVM就成了一个完整的虚拟化平台。
KVM只是内核模块,用户并没法直接跟内核模块交互,需要借助用户空间的管理工具,而这个工具就是QEMU。KVM和QEMU相辅相成,QEMU通过KVM达到了硬件虚拟化的速度,而KVM则通过QEMU来模拟设备。对于KVM来说,其匹配的用户空间工具并不仅仅只有QEMU,还有其他的,比如RedHat开发的libvirt、virsh、virt-manager等,QEMU并不是KVM的唯一选择。
所以简单直接的理解就是:QEMU是个计算机模拟器,而KVM为计算机的模拟提供加速功能。
部署vps
检查是否支持虚拟化
我们首先要检查我们的系统/硬件是否支持硬件虚拟化。egrep -c '(vmx|svm)' /proc/cpuinfo
,查看结果,只要不是0都可以(如果在虚拟机上运行该命令,输出的就是0)。如果你的CPU支持虚拟化,但是这里输出的还是0,可以重启电脑进入BIOS尝试开启VT之后再次尝试。
安装cpu-checker软件查看我们的电脑是否支持kvm虚拟化。sudo apt install cpu-checker
,然后执行sudo kvm-ok
,如果输出如下就代表可以使用kvm来进行加速了。
INFO: /dev/kvm exists
KVM acceleration can be used
安装依赖
sudo apt update
sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
开启libvirt服务
libvirt为我们提供了操作虚拟机的接口,我们需要先开启该项服务。
sudo service libvirtd start
sudo update-rc.d libvirtd enable
service libvirtd status
网桥配置
参考 https://notesail.com/posts/kvm-bridge.html ,假设宿主机之前的eno1网卡上的ip为192.168.0.100,那么我们新建一个网桥并为其分配该ip。
# ubuntu18使用netplan管理网络设备,我们编辑配置文件(配置文件的名字并不一定相同,但是类似)
sudo nano /etc/netplan/01-network-manager-all.yaml
#修改成下面的内容
network:
ethernets:
eno1:
dhcp4: no
bridges:
br0:
interfaces: [eno1]
dhcp4: no
addresses: [192.168.0.100/24]
gateway4: 192.168.0.1
parameters:
stp: true
forward-delay: 4
nameservers:
addresses: [192.168.0.1]
version: 2
最后使用sudo netplan apply
使其生效,ssh连接可能会断开,建议直接在机器上操作,之后使用ifconfig
,可以看到我们已经多了一个名为br0的设备,并使用了之前eno1网卡分配的ip,到这我们已经在系统层面添加了网桥了。
创建vps
创建vps首先需要系统镜像,iso,vhd,img之类的格式都是可以的。我直接使用了秋水逸冰制作的windows server镜像(当然你直接去msdn下载也是可以的)。.gz文件用gunzip解压即可,gunzip解压没有进度显示,所以需要等上一段时间。
下载镜像后开始创建虚拟机,该操作可以在纯命令行环境中使用virsh进行,也可以在图形环境下使用virt-manager进行,由于图形界面下还是比较方便操作,所以我直接vnc到服务器上进行操作。更建议直接服务器接显示器进行操作。
virt-manager图形化创建虚拟机
linux服务器上使用vncserver -geometry 1920x1080
开启vnc服务,一般端口为5901,vnc到服务器上后打开一个终端,执行virt-manager
命令打开virt-manager。
点击第一个按钮开始创建一个虚拟机,注意使用vhd/img格式的系统镜像的话要选择第四个方式,不然会无法开机。
选择系统镜像(vhd格式没办法直接在这选,要选择到文件管理器里浏览本地文件选择),并设置好分配的硬盘,cpu和内存资源之后来到了最后一步,网络设置,我们在这里填写之前创建的网桥名字br0。
完成这一步之后就可以启动虚拟机了,我们如果是使用vnc来控制virtmanager的话可能会感觉很难控制虚拟机的图形界面,所以我们需要前往该虚拟机的设置界面将Display Spice的Type改为VNC server,并重启虚拟机即可。另外还建议吧NIC修改为e1000,使虚拟机使用虚拟的千兆网卡(默认百兆)。
另外通过VNC使用virt-manager访问虚拟机图形界面的时候,大概率会遇到鼠标错位的问题,这是正常现象。如果该界面没有显示无法连接到网络的提示,那么建议你直接前往路由器管理界面查看新设备(虚拟机)分配到的ip(虽然网桥使用的是192.168.0.100的ip,虚拟机也使用了该网桥,但是虚拟机的ip是另外分配的!),并直接使用windows的远程桌面来进行控制。
之后只需要设置好路由器的端口转发之类的,自建vps就大功告成了!
virt-install命令行创建虚拟机
如果你的Linux服务器没有装图形界面,或者是vnc异常又没办法直接接显示器操作,那么也可以直接使用纯命令行的方式来创建虚拟机。
命令行中创建一个脚本文件start.sh,写入如下内容,并执行bash start.sh,注意,我是用的vhd镜像所以这样写,如果你是用的是iso文件进行安装,那么要做出相应的改变,更多参数请查看wiki或者直接man virt-install
。
virt-install \
--name=virwin \
--os-type=windows \
--bridge=br0 \
--import --disk=/mnt/sda/kvm/cn_windows2019 \
--graphics spice --ram=4096 --vcpus=4
前往路由器管理界面查看分配的ip即可连接。理论上直接使用virsh也可以查看分配的ip,但是我这不是所有的方法都生效了,不知道为什么 https://adam.younglogic.com/2017/10/vm-ip-virsh/。
在我这,下面这种查看ip的方法生效了。
virsh domiflist virwin
#获得了虚拟机的虚拟网卡MAC
Interface Type Source Model MAC
-------------------------------------------------------
vnet1 bridge br0 rtl8139 52:54:00:6e:3a:ff
#使用arp -e |grep 52:54:00:6e:3a:ff 来查找该mac对应的ip
192.168.0.111 ether 52:54:00:6e:3a:ff C br0
之后也可以在命令行中使用virsh相关命令对vps进行管理。
命令 | 解释 |
---|---|
virsh list –all | 查看虚拟机和状态 |
virsh start test | 启动该虚拟机 |
virsh reboot test | 重启虚拟机 |
virsh suspend test | 虚拟机处于paused暂停状态,一般情况下是被admin运行了virsh suspend才会处于这种状态,但是仍然消耗资源,只不过不被超级管理程序调度而已。 |
virsh resume test | 把虚拟机唤醒,使其恢复到running状态 |
virsh shutdown test | 关闭指令,是虚拟机进入shutoff状态,系统提示虚拟机正在被关闭,却未必能成功 |
virsh destroy test | 强制关闭该虚拟机,但并非真的销毁该虚拟机,只是关闭而已。 |
virsh save test a | 将该虚拟机的运行状态存储到文件a中 |
virsh restore a | 根据文件a恢复被存储状态的虚拟机的状态,即便虚拟机被删除也可以恢复(如果虚拟机已经被undefine移除,那么恢复的虚拟机也只是一个临时的状态,关闭后自动消失) |
virsh undefine test | 移除虚拟机,虚拟机处于关闭状态后还可以启动,但是被该指令删除后不能启动。在虚拟机处于Running状态时,调用该指令,该指令暂时不生效,但是当虚拟机被关闭后,该指令生效移除该虚拟机,也可以在该指令生效之前调用define+TestKVM.xml取消该指令 |
virsh edit test | 修改TestKVM的配置文件,效果等于先dumpxml得到配置文件,然后vi xml,最后后define该xml文件(建议关机修改,修改完virsh define防止不生效) |
virt-clone -o test -n test01 –file /data/test01.img | 在-o后面为被克隆虚拟机名称,-n后克隆所得虚拟机名称,file为克隆所得虚拟机镜像存放地址。 克隆的好处在于,假如一个虚拟机上安装了操作系统和一些软件,那么从他克隆所得的虚拟机也有一样的系统和软件,大大节约了时间。 |
暂无评论内容