Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。
之前提到我搭建了一台NAS,用的是J4105,虽然这玩意比J3455性能高了那么一丢丢,但如果用来视频转码的话,HEVC 1080P 60fps的视频已经会卡的一顿一顿的了,而且我还想在上面跑点游戏服务器什么的,所以升级配置就成了我的下一步计划(你说直接上服务器?准备起飞嘛?
我准备在升级配置后使用虚拟化平台,一是方便管理,二是方便迁移,虽然我现在还没钱买硬件,但可以在虚拟机中预演嘛!
安装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
编辑宿主机网卡配置:
先添加一块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系统安装界面:
没错!这就是命令行版本的安装程序,其实长得和图形版的差不多,命令行安装操作比较麻烦,注意多看提示,用键盘选选选就行了,系统安装这里也不多说了,估计能到这里的也不会有什么问题了……
选好开始安装,安装完成后回车重启进系统:
(双重虚拟机之术!
当然,如果你不喜欢命令行安装程序,使用图形化安装界面也是可以的,只需要改两行:
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
在虚拟机的配置文件中找到驱动器相关配置这段,把红框部分全删掉:
然后找到启动项这段:
把这一段
<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,556次
哦,写的太棒了,等我搬完家,新家也打算上虚拟机,虽然感觉 esxi 对小白更友好23333
谢谢~KVM的网上教程的确有点杂了,我也是慢慢摸索出来的😂