Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。

之前提到我搭建了一台NAS,用的是J4105,虽然这玩意比J3455性能高了那么一丢丢,但如果用来视频转码的话,HEVC 1080P 60fps的视频已经会卡的一顿一顿的了,而且我还想在上面跑点游戏服务器什么的,所以升级配置就成了我的下一步计划(你说直接上服务器?准备起飞嘛?

我准备在升级配置后使用虚拟化平台,一是方便管理,二是方便迁移,虽然我现在还没钱买硬件,但可以在虚拟机中预演嘛!

使用KVM(基于内核的虚拟机)+ QEMU的虚拟化。 需要具有Intel VT或AMD-V功能的CPU。

安装KVM

首先安装KVM环境:

yum install -y qemu-kvm qemu-kvm-tools qemu-img libvirt libvirt-python virt-install python-virtinst bridge-utils

 

其中kvm相关安装包及其作用如下:

  • qemu-kvm  主要的KVM程序包
  • qemu-kvm-tools  KVM调试工具
  • qemu-img  qemu组件,创建磁盘、启动虚拟机等
  • libvirt  C语言工具包,提供libvirt服务,虚拟机管理工具
  • virt-install  基于libvirt服务的虚拟机创建命令
  • python-virtinst  创建虚拟机所需要的命令行工具和程序库
  • bridge-utils  创建和管理桥接设备的工具

配置网络

配置网络链接设置,在libvirt中运行KVM网络有两种方法:NAT和Bridge,默认是NAT。

两种模式区别如下:

  • 用户模式,即NAT方式。这种方式是默认网络,数据包由NAT方式通过主机的接口进行传送,可以访问外网,但是无法从外部访问虚拟机网络。
  • 桥接模式。这种模式允许虚拟机像一台独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持,一般有线网卡都支持。

由于是定位是NAS,所以肯定使用桥接啦!

防火墙使用iptables,配置略过,参考linux下IPTABLES配置详解——CentOS 7 配置iptables

CentOS7使用了新的网卡命名模式,接口名称被自动基于固件,每台机器的网卡名都不一定一样哦!

编辑宿主机网卡配置:

先添加一块br0:

vim /etc/sysconfig/network-scripts/ifcfg-br0

#输入以下内容
TYPE=Bridge
BOOTPROTO=static  #如果宿主机是静态ip这里就是static,建议
#BOOTPROTO=dhcp  #如果宿主机是使用的dhcp
NAME=br0
DEVICE=br0
ONBOOT=yes
DEFROUTE=yes

IPADDR=192.168.0.103  #如果宿主机是静态ip的话,需要在这里配置宿主机ip等,当然如果是dhcp的话这后面一段都不需要了
PREFIX=24
GATEWAY=192.168.0.1
DNS1=192.168.0.1
DNS2=1.1.1.1

 

然后更改原网卡配置:

vim /etc/sysconfig/network-scripts/ifcfg-ens33

#输入以下内容
TYPE=Ethernet
BOOTPROTO=none
NAME=ens33
UUID=6bede161-b5c1-45c1-a3e4-7676c51d60c4
DEVICE=ens33
ONBOOT=yes
BRIDGE="br0"

 

配置完成后重启网络服务:

systemctl restart network

 

检查网络配置:

ifconfig

#使用Minimal安装的CentOS需要先安装net-tools工具包
yum install -y net-tools

 

如下图:

其中virbr0是由宿主机虚拟机支持模块安装时产生的虚拟网络接口,也是一个switch和bridge,负责把内容分发到各虚拟机,这里我们不用管它。

创建并安装CentOS虚拟机

先找个目录放置系统镜像:

mkdir -p /home/kvm/images

 

把下载好的系统镜像丢进去就行了。

然后为虚拟机创建镜像文件,关于虚拟机镜像,有很多种类型:raw、qcow2、vmdk等,这里推荐使用 qcow2 格式的镜像,因为 qcow2 格式的镜像支持快照,使用的比较广泛。

在创建虚拟机之前需要手动去创建 qcow2 格式的镜像磁盘文件,以供安装虚拟机时使用。

虚拟机的映像默认放置在/var/lib/libvirt/images作为存储池,但这里我们在/home中新建目录作为存储池(在哪个目录下看个人配置,问题不大,注意权限就行。

mkdir -p /home/kvm/data
qemu-img create -f qcow2 /home/kvm/data/vm1.qcow2 10G

 

现在可以开始为虚拟机安装系统了:

virt-install \
--virt-type=kvm \
--name=vm1 \
--vcpus=1 \
--memory=512 \
--location=/home/kvm/images/CentOS-7-x86_64-Minimal-1810.iso \
--disk path=/home/kvm/data/vm1.qcow2,size=10,format=qcow2 \
--network bridge=br0 \
--graphics none \
--extra-args='console=ttyS0'

 

virt-install常用参数说明:

–-name  指定虚拟机名称
–-memory  分配内存大小。
–-vcpus  分配CPU核心数,最大与实体机CPU核心数相同
–-disk  指定虚拟机镜像
  # size  初始磁盘大小,以 GB 为单位
  # format  镜像格式,如qcow2、img
–-network  网络类型,我们用的是bridge桥接,bridge=br0指定桥接网卡的名称。
–-accelerate  加速
–-cdrom  指定系统安装镜像
–-vnc  启用VNC远程管理,一般安装系统都要启用。
–-vncport  指定VNC监控端口,默认端口为5900,端口不能重复。
–-vnclisten  指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0。
–-os-type  系统类型,可选linux,windows
–-os-variant  系统版本,如rhel7.2
--location  指定安装介质路径,如光盘镜像的文件路径
--graphics  图形化显示配置
  # 全新安装虚拟机过程中可能会有很多交互操作,比如设置语言,初始化 root 密码等等。
  # graphics 选项的作用就是配置图形化的交互方式,可以使用 vnc(一种远程桌面软件)进行链接。
  # 我们这列使用命令行的方式安装,所以这里要设置为 none,但要通过 --extra-args 选项指定终端信息,
  # 这样才能将安装过程中的交互信息输出到当前控制台。
--extra-args 根据不同的安装方式设置不同的额外选项

 

其他选项请自行man查看。

运行上面的命令之后,我们进入了熟悉(大雾)的CentOS系统安装界面:

没错!这就是命令行版本的安装程序,其实长得和图形版的差不多,命令行安装操作比较麻烦,注意多看提示,用键盘选选选就行了,系统安装这里也不多说了,估计能到这里的也不会有什么问题了……

选好开始安装,安装完成后回车重启进系统:

(双重虚拟机之术!

只要安装时配置网络为bridge,那么虚拟机安装后网络也是自动配置好的!

当然,如果你不喜欢命令行安装程序,使用图形化安装界面也是可以的,只需要改两行:

virt-install \
--virt-type=kvm \
--name=vm2 \
--vcpus=1 \
--memory=512 \
--location=/home/kvm/images/CentOS-7-x86_64-Minimal-1810.iso \
--disk path=/home/kvm/data/vm2.qcow2,size=10,format=qcow2 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0

 

VNC相关会在下面提到。

好啦,跟CentOS相关的基本到这里就结束了。Ctrl+] 退出虚拟机,我们再来安装一个windows吧!

创建并安装Windows虚拟机

首先说明一点,KVM安装Windows默认使用的是qemu虚拟化IDE硬盘模式,在这种情况下,IO性能比较低,因此更推荐使用virtio。virtio接口是半虚拟化,能提供更好的IO性能。

首先一样先把系统镜像丢到镜像目录里面放好,然后创建虚拟机镜像:

qemu-img create -f qcow2 /home/kvm/data/win.qcow2 20G

 

然后我们去这里下载Virtio ISO或者软盘镜像,目前Virtio最新版本为0.1.171-1。

很多教程使用的是软盘镜像,主要是软盘镜像比较小而且不会出现引导项问题,燃鹅软盘镜像的驱动不全,比如0.1.171-1版本就只有win7、8、8.1、10的驱动,根本没有windows server 2008的,因此这里使用的是ISO文件。

一切准备好后开始安装虚拟机系统:

virt-install \
--virt-type=kvm \
--name=winS2008 \
--memory=2048 \
--vcpus sockets=1,cores=1,threads=2 \
--cdrom=/home/kvm/images/cn_windows_server_2008_standard_enterprise_and_datacenter_with_sp2_x64_dvd_x15-41319.iso \
--boot cdrom,menu=on \
--os-type windows \
--os-variant win2k8 \
--disk path=/home/kvm/data/virtio-win-0.1.171.iso,device=cdrom \
--disk path=/home/kvm/data/win.qcow2,bus=virtio,size=20 \
--network bridge=br0,model=virtio \
--graphics vnc,listen=0.0.0.0

 

回车之后需要通过VNC来继续完成系统的安装,我使用的是Ultra VNC

但是,当你打开VNC时,你会发现刚刚开始就走不下去了QAQ:

这里基本100%报错,原因就是virtio的ISO会占据启动项第一位,然后就GG。解决方法很简单,看到黄框内容了吗,我们保持VNC界面,先来发送个Ctrl+Alt+Del强制重启,然后再来个Esc进菜单手动选啊!

当然,这个需要一点点手速,一次不行多试几次就ok啦,不过我相信大家基本都不会手残到连个启动项选择界面都进不去吧ο(=•ω<=)ρ⌒☆

进启动项菜单页面后,我们看到真·系统镜像被排到了第四位,怪不得启动失败,我们手动选择4就行了:

之后就是真·熟悉的系统安装界面啦!

需要注意的是,使用virtio的话,在安装过程中,在选择磁盘界面会找不到磁盘:

这个时候就需要点击加载驱动程序-浏览-CD驱动器,之后后找到server 2008即可,对应的virtio驱动如图所示:

驱动加载完成后,磁盘就出现了,然后就能继续安装了:

后面一路点点点就行啦!

安装完成后由于同样的启动项的原因,系统启动会失败的,我们不可能每次都手动去选择启动项,因此要改一下虚拟机的配置。

我们编辑虚拟机配置:

virsh edit winS2008

 

请不要直接用vim编辑虚拟机的配置文件

在虚拟机的配置文件中找到驱动器相关配置这段,把红框部分全删掉:

然后找到启动项这段:

把这一段

<boot dev='cdrom'/>
<bootmenu enable='yes'/>

 

直接修改成:

<boot dev='hd'/>

 

没错,<bootmenu enable=’yes’/>这行删掉直接就行了,最后:wq保存退出。

重启虚拟机,就可以直接进入系统了:

但是这时候你会发现,咦,我网卡呢?

问题不大,只要把virtio的ISO再挂上去,把相关驱动都装好就行啦(别问我刚刚为什么还要先卸载了,问就是技术调整.jpg

先关机,挂载ISO:

virsh attach-disk winS2008 /home/kvm/data/virtio-win-0.1.171.iso hdb --type=cdrom --config

 

重启系统,光驱已经挂载了,然后挨个补驱动就行了,手动更新驱动,直接搜索光盘,懒得选文件夹了:

忽略签名问题:

完成,其他缺失驱动同样方法装好就行,可能需要重启。

之后卸载掉ISO就行了(其实这段是在教怎么挂载设备啊

virsh detach-disk winS2008 hdb --config

 

挂载设备

既然提到挂载设备了,那么这里就用几个例子说明一下吧:

例1:挂载硬盘

virsh attach-disk --domain vm1 --source /home/kvm/data/vm1_ex.qcow2 --target vdb --targetbus virtio --driver qemu --subdriver qcow2 --type disk --print-xml

# --print-xml表示输出xml格式配置
# 删掉就是实时挂载
# 改成--config即可写入配置(有的设备不能实时挂载,需要重启虚拟机

 

输出:

<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/home/kvm/data/vm1_ex.qcow2'/>
  <target dev='vdb' bus='virtio'/>
</disk>

 

例2:挂载iso

virsh attach-disk --domain vm1 --source /home/kvm/data/virtio-win-0.1.171.iso --target hdb --targetbus ide --driver qemu --subdriver raw --type cdrom --print-xml

 

输出:

<disk type='file' device='cdrom'>
  <driver name='qemu' type='raw'/>
  <source file='/home/kvm/data/virtio-win-0.1.171.iso'/>
  <target dev='hdb' bus='ide'/>
</disk>

 

例3:新增网卡

挂载设备与硬盘不同,只能通过xml配置文件进行挂载,首先新建一个:

vim interface.xml

 

写入以下内容:

<interface type='bridge'>
  <source bridge='br0'/>
  <model type='virtio'/>
</interface>

 

然后:

 virsh attach-device --domain vm1 --file ./interface.xml --config

 

就可以了

如果查看虚拟机配置的话你会发现多了这样一段:

<interface type='bridge'>
  <mac address='52:54:00:03:15:ab'/>
  <source bridge='br0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<interface type='bridge'>    #这段是新增的
  <mac address='52:54:00:1b:09:8f'/>    #mac等硬件属性会自动生成
  <source bridge='br0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</interface>

 

对比一下这三个例子相信大家能学会挂载设备啦!

虚拟机管理

KVM虚拟机管理主要通过virsh命令进行:

virsh help                         #获取帮助

virsh list --all                   # 查看所有运行和没有运行的虚拟机
virsh list                         # 查看在运行的虚拟机
virsh dumpxml vm-name              # 查看kvm虚拟机配置文件

virsh start vm-name                # 启动kvm虚拟机
virsh shutdown vm-name             # 正常关机
virsh destroy vm-name              # 非正常关机,强制关闭虚拟机(相当于物理机直接拔掉电源)

virsh undefine vm-name             # 删除vm的配置文件
virsh define file-name.xml         # 根据配置文件定义虚拟机

virsh suspend vm-name              # 挂起,终止
virsh resumed vm-name              # 恢复被挂起的虚拟机

virsh autostart vm-name            # 开机自启动vm
virsh autostart --disable vm-name  # 取消开机自启动vm

virsh  snapshot-create vm-name     # 创建虚拟机快照
virsh  snapshot-current vm-name    # 查看虚拟机快照版本信息
virsh  snapshot-list vm-name       # 查看快照信息
virsh  snapshot-revert vm-name <snapshot-id>    #恢复虚拟机至某快照状态
virsh  snapshot-delete vm-name <snapshot-id>    #删除快照

virt-clone -o <old-vm-name> -n <new-vm-name> -f <disk>    #虚拟机克隆

virsh console <虚拟机名称>          # 连接虚拟机

 

例如我想要让虚拟机随系统启动而自启动:

virsh autostart winS2008

2019.5.26  v1.0 初版完成

2019.8.8  做了一点微小的改动


本文被阅读了:7,453次

作者头像
关于  Ailitonia

正因站在了巨人的肩膀上,才越发觉得自己渺小。不求成为巨人,但求与其同行。 把自己所见所闻,记录下来。

→查看所有由Ailitonia发布的文章