ubuntu下KVM虚拟机创建

网上关于KVM虚拟机创建的文章有很多,但是都是只提供命令,没有解释。对于初学者很不友好,这里记录下我自己的实践。
因为我的服务器使用的是ubuntu16.04,所以以下操作都是基于此系统。
我是在windows下使用MobaXterm来连接我自己的服务器的,这里强力推荐这款软件,非常方便。

以下代码’#’后的内容为注释
‘$’后为执行命令

验证主机是否支持硬件虚拟化

1
2
cat /proc/cpuinfo | grep svm # AMD硬件
cat /proc/cpuinfo | grep vmx # Intel硬件

svm是ADM的ADM-V虚拟化技术标识,全称secure virtual machine,vmx是Intel的硬件虚拟化技术VT-x,标识是vmx,全称为virtual machine extension。通过查询cpuinfo文件,可以知道硬件是否支持虚拟化。若返回结果中有svm或者vmx则说明硬件支持虚拟化。

安装必要依赖

1
$ sudo apt install qemu-kvm libvirt-bin virtinst bridge-utils virt-viewer virt-manager
  • kvm:linux系统自带,已经编译进linux内核
  • qemu-kvm:KVM的设备模拟器,因为KVM只负责CPU和内存的虚拟化,独立无法完成整个系统的虚拟化,所以KVM开发者使用成熟的qemu来完成其他部件的虚拟化,qemu负责虚拟机的管理,kvm负责加速
  • libvirt:Libvirt是用于管理虚拟化平台的开源的API,后台程序和管理工具。它可以用于管理KVM、Xen、VMware ESX,QEMU和其他虚拟化技术
  • virtinst: 虚拟机创建(virt-install)和克隆工具(vrit-clone)等
  • birdge-utils: 用于桥接网卡的工具
  • virt-viewer:连接虚拟机屏幕的工具,需要桌面环境支持,使用mobaXterm可以远程使用x11图形界面,非常方便。
  • virt-manager:gui虚拟机管理工具,类似于windows上的vmware workstation

KVM管理工具的一些注解及一些实用工具

  • libvirt:操作和管理KVM虚机的虚拟化API,使用C语言编写,可以由Python,Ruby, Perl, PHP, Java等语言调用。可以操作包括KVM,vmware,XEN,Hyper-v, LXC,virtualbox等 Hypervisor。
  • virsh:基于libvirt的命令行工具,后面需要大量使用
  • virt-v2v:虚机格式迁移工具,该工具与virt-sysprep都包含在包libguestfs-tools中,后面布署中会用到
  • virt-install:创建KVM虚机的命令行工具
  • virt-viewer:连接到虚拟机屏幕的工具,需要主机有桌面环境,该工具需要单独安装sudo apt-get install virt-viewer
  • virt-clone:虚机克隆工具
  • virt-top:类似于linux系统下的top命令,可以显示所有虚拟机CPU、内存等使用情况,该工具需要单独安装sudo apt-get install virt-top

虚拟机创建

默认情况下,在安装完上述环境后,会自动配置好一个默认的网络环境default,可以使用如下命令查看:

1
$ sudo virsh net-list --all

假如不小心通过brctl(用于管理桥接网络的工具)删除了default网络,可以通过重新加载预置的XML文件来恢复:

1
2
3
4
5
6
$ sudo virsh net-define /usr/share/libvirt/networks/default.xml  #重新定义网络
Network default defined from /usr/share/libvirt/networks/default.xml
$ sudo virsh net-autostart default #设置default开机自动启动
Network default marked as autostarted
$ sudo virsh net-start default #启动网络default
Network default started

这里默认的配置是nat模式,即guestOS可以通过host上网,而在外部看不到guest。

为了让非root用户可以直接使用virsh命令管理虚拟机,需要将普通用户加入到kvm和libvirt用户组中:

1
2
$ sudo adduser <youruser> kvm
$ sudo adduser <youruser> libvirtd

centos 使用:

1
2
$ sudo gpasswd -a <youruser> kvm
$ sudo gpasswd -a <youruser> libvirt

这个时候重新登录就会使新的用户组成员生效了。

使用virt-manager创建虚拟机

新手推荐使用图形化界面创建虚拟机。使用MobaXterm连接服务器时原生支持x11,所以直接在shell中运行virt-manager就可以了,配置同vmware类似,这里就不多介绍了
注意:在centos 7 上使用virt-manager安装时,显示协议选择spice时,需要gtk支持:

1
$ sudo yum install gtk3

centos 7上安装的virsh的uri默认为qemu:///session,可以在用户目录下使用配置文件更改:

1
2
$ cd /home/{user}/.config/libvirt
$ echo uri_default = "qemu:///system" >> libvirt.conf

使用virsh-install创建虚拟机

使用virsh-install命令可以在命令行下配置虚拟机:

1
2
3
4
5
6
7
8
9
10
11
$ virt-install \
--virt-type=kvm \
--name=ubuntuserver1604 \
--ram=2048 \
--vcpus=2 \
--os-variant=ubuntu16.04 \
--hvm \
--cdrom=/home/colin/vhost/iso/ubuntuServer1604.iso \
--network=default,model=virtio \
--graphics vnc,listen=0.0.0.0 \
--disk path=/home/colin/vhost/image/ubuntuserver1604-2g-original.qcow2,size=20,bus=virtio,format=qcow2

各个参数解释:
下面是各参数的意义:

  • –virt-type=kvm: 使用KVM作为虚拟机监视器
  • –name=ubuntuserver1604: 虚拟机实例的名字,每个虚拟机的名字都不能一样,不能有空格
  • –ram=2048: 指定虚拟机内存大小,单位是Mb
  • –vcpus=2: 为虚拟机指定分配的虚拟CPU核数
  • –os-variant=ubuntu16.04: 指定虚拟机系统所属系列以优化虚拟机参数,可以通过命令osinfo-query os 来显示所有支持的系统列表,osinfo-query在包libosinfo-bin中 sudo apt-get install libosinfo-bin
  • –hvm: 启用全虚拟化,KVM虚拟机支持全虚拟化,属于优化性参数
  • –cdrom=/home/vhost/iso/ubuntuServer1604.iso: 指定作为虚拟机光驱内容的设备或文件,可以是主机的CDROM或者iso文件。
  • –network network=default,model=virtio: 将虚拟机连接到主机网络,此处连接到一个名为defalut的虚拟网络(即让虚拟机使用NAT模式上网),网卡模式设置为virtio。如果使用桥接模式,则只需要改参数为–network=bridge=br0,model=virtio即可。
  • –graphics vnc: 设置虚拟机的console并将其输出到VNC,这样就可以通过VNC来连接虚拟机了。同时可以指定vnc的端口和监听范围以及密码: –vncport=5910 –vnclisten=0.0.0.0。默认情况下端口为从5900开始的第一个空闲端口,监听范围为本机127.0.0.1,修改为0.0.0.0以使外网主机可以连接。后面会讲对于只支持SSH协议的情况下,如何通过SSH隧道连接,所以是否设置为0.0.0.0没有影响,但能设置为0.0.0.0的话,还是设置为0.0.0.0,毕竟直接通过VNC连接更加方便。这些参数也可以在/etc/libvirt/qemu.conf中修改,以使其对所有虚拟机生效,VNC默认连接没有密码。VNC可以理解为linux下的远程桌面
  • –disk path=/home/vhost/image/ubuntuserver1604-2g-original.qcow2,size=20,bus=virtio,format=qcow2: 指定虚拟机所使用的存储路径,大小为20G,disk bus类型为virtio,磁盘格式为raw,如果不指定fortmat,则默认格式即为raw。

网络和磁盘建议都设置为virtio,virtio即启动优化的虚拟机专用IO驱动,性能更好。
磁盘格式使用qcow2更好,因为qcow2格式即QEMU支持的QEMU Copy On Write磁盘格式,是优化后的磁盘格式,支持快照,并且是使用多少占用多少空间。例如你分配了20G大小,如果是raw格式,则立即占用20G,而qcow2则是从很小开始,用多少,占用多少。之前有些人说qcow2性能不如raw,这两种格式可以使用qemu-img进行转换,qemu-img在包qemu-utils中。

KVM管理常用命令

KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/,该目录下存放了所有创建过的虚拟机配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ virsh list # 查看正在运行的虚拟主机列表
$ osinfo-query os # 查看virt-install所支持的OS参数列表
$ virsh list --all # 查看所有的虚拟机列表
$ virsh dominfo ubuntuserver1604 # 查看虚拟机信息
$ virsh start ubuntuserver1604 # 启动虚拟机
$ virsh shutdown ubuntuserver1604 # 关闭虚拟机
$ virsh suspend ubuntuserver1604 # 挂起虚拟机
$ virsh reboot ubuntuserver1604 #
软重启(安全重启,相当于在虚拟机内部点击重启选项)虚拟机
$ virsh reset ubuntuserver1604 # 硬重启虚拟机(不安全,有可能数据丢失,相当于强制按主机上的重启按钮)
$ virsh autostart ubuntuserver1604 # 设置虚拟机随着宿主主机开机自动启动(开机自动启动的虚拟机配置文件会自动在目录/etc/libvirt/qemu/autostart/目录下生成)
$ virsh autostart --disable ubuntuserver1604 # 取消开机自启动
$ virsh destroy ubuntuserver1604 # 强制关闭虚拟机电源
$ virsh edit ubuntuserver1604 # 编辑虚拟机配置文件
$ virsh uri # 查看当前主机上hypervisor的链接路径
$ virsh undefine ubuntuserver1604 # 移除虚拟机定义,即从虚拟机列表中移除虚拟机 该命令只是删除/etc/libvirt/qemu/目录下名为ubuntuserver1604.xml的配置文件,并不会删除虚拟机磁盘文件
$ virsh define ubuntuserver1604.xml #通过虚拟机配置文件重新定义虚拟机

注意,使用virsh shutdown ubuntuserver1604命令时,由于virsh实际上不能对虚拟机进行关机,只有虚拟机配置了acpid服务之后才能通过virsh进行关机,配置命令为:

1
2
$ sudo chkconfig acpid on
$ sudo service acpid restart # 注意这是指在虚拟机中配置该服务

-------------本文结束啦感谢您阅读-------------
0%