添加虚拟机流程:

1
2
3
4
1. 配置网络
2. 配置存储池
3. 上传镜像
4. 安装虚拟机,指定配置

安装KVM虚拟机

1. 关闭防火墙,selinux

1
2
3
# service iptables stop
# setenforce 0 临时关闭
# chkconfig NetworkManager off

2. 安装kvm虚拟机

1
2
3
4
5
# yum install kvm libvirt libvirt-devel python-virtinst python-virtinst qemu-kvm virt-viewer bridge-utils virt-top libguestfs-tools ca-certificates audit-libs-python device-mapper-libs virt-install
# 启动服务
# service libvirtd restart
下载virtio-win-1.5.2-1.el6.noarch.rpm 如果不安装window虚拟机或者使用带virtio驱动的镜像可以不用安装
# rpm -ivh virtio-win-1.5.2-1.el6.noarch.rpm

3. Libvirt在管理本地或远程Hypervisor时的表现形式如下。

在libvirt内部管理了五部分:

  • 节点:所谓的节点就是我们的物理服务器,一个服务器代表一个节点,上边存放着Hyper和Domain
  • Hypervisor:即VMM,指虚拟机的监控程序,在KVM中是一个加载了kvm.ko的标准Linux系统。
  • 域(Domain):指虚拟机,一个域代表一个虚拟机(估计思路来源于Xen的Domain0)
  • 存储池(Storage Pool):存储空间,支持多种协议和网络存储。作为虚拟机磁盘的存储源。
  • 卷组(Volume):虚拟机磁盘在Host上的表现形式。 上边的五部分,我们必须使用的是前三个,因为很多时候根据业务规则或应用的灵活性并没有使用卷组(其实就是有了编制的虚拟磁盘文件),也就没有必要使用存储池。

配置

1. 修改网络配置

方案一 (推荐)

1
brctl addbr br0 && brctl addif br0 em1 && brctl stp br0 on && ifconfig em1 0.0.0.0 && ifconfig br0 192.168.1.31 netmask 255.255.255.0 && route add default gw 192.168.1.1

方案二

参考

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

DEVICE=br0 TYPE=Bridge BOOTPROTO=static BROADCAST=192.168.1.255 IPADDR=192.168.1.10 NETMASK=255.255.255.0 NETWORK=192.168.1.0 GATEWAY=192.168.1.1 DNS1=119.29.29.29 ONBOOT=yes

1
# vim /etc/sysconfig/network-scripts/ifcfg-em1

DEVICE=em1 BOOTPROTO=none ONBOOT=yes BRIDGE=br0

1
# vim /etc/sysconfig/network-scripts/ifcfg-bond0 

DEVICE=bond0 TYPE=Ethernet NAME=bond0 BONDING_MASTER=yes BOOTPROTO=none BRIDGE=br0 ONBOOT=yes BONDING_OPTS=“mode=5 miimon=100”

方案三

3. 关闭宿主机的GSO与TSO功能

1
2
3
# ethtool -K em1 gso off
# ethtool -K em1 tso off
# systemctl restart network

4. 创建基于文件夹的存储池(目录)

1
# mkdir -p /home/vmdisk

定义存储池与其目录

1
2
# virsh pool-define-as vmDiskPool --type dir --target /home/vmdisk
Pool vmDiskPool defined

创建已定义的存储池

1
2
# virsh pool-build vmDiskPool
Pool vmDiskPool built

查看已定义的存储池,存储池不激活无法使用

1
2
3
4
# virsh pool-list --all
Name State Autostart
-----------------------------------------
vmDiskPool inactive no 

查看存储卷信息

1
2
3
4
5
6
# virsh pool-info vmDiskPool
Name: vmDiskPool
UUID: 3fc996c4-9bfa-7fdc-2960-445e4c551855
State: inactive
Persistent: yes
Autostart: no

激活并自动启动已定义的存储池

1
2
# virsh pool-autostart vmDiskPool
Pool vmDiskPool marked as autostarted

启动存储卷

1
2
# virsh pool-start vmDiskPool
Pool vmDiskPool started

再次查看存储卷信息

1
2
3
4
5
6
7
8
9
# virsh pool-info vmDiskPool
Name: vmDiskPool
UUID: 3fc996c4-9bfa-7fdc-2960-445e4c551855
State: running
Persistent: yes
Autostart: yes
Capacity: 39.25 GiB
Allocation: 47.89 MiB
Available: 39.20 GiB

3. 在存储池中创建虚拟机存储卷(创建卷)

1
# virsh vol-create-as vmDiskPool linux_vm0.qcow2 300G --format qcow2

查看存储卷

1
ll /home/vmdisk/
存储池相关管理命令

删除存储池中的存储卷

1
# virsh vol-delete --pool vmDiskPool linux_vm1.qcow2

取消激活存储池

1
# virsh pool-destroy vmDiskPool

取消定义存储池

1
# virsh pool-undefine vmDiskPool

删除存储池

1
# virsh pool-delete vmDiskPool

4. 安装虚拟机

bridge网络模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# virt-install \
--virt-type kvm \
--os-type=linux \
--os-variant=RHEL7 \
--name=vm0 \
--memory 16384 \
--vcpus 6 \
--disk path=/home/vmdisk/linux_vm0.qcow2,format=qcow2,bus=virtio \
--location /root/CentOS-7-x86_64-Minimal-1708.iso \
--graphics none \
--network bridge=br0,model=virtio \
--autostart \
--boot cdrom,hd,menu=on \
--console pty,target_type=serial \
--extra-args 'console=ttyS0,115200n8 serial' \
--debug

NAT网络模式

1
# virt-install --name=test --ram 512 --vcpus=1 -f /data/kvm/vm/test.qcow2 --cdrom /data/iso/CentOS-6.5-x86_64-bin-DVD1.iso --graphics vnc,listen=0.0.0.0,port=5988, --network network=default,model=virtio --force --accelerate --autostart --boot cdrom,hd,menu=on

安装window主机

1
# virt-install --name=window_24 --ram 12288 --vcpus 4 -c /data/iso/windows2008.iso --disk path=/usr/share/virtio-win/virtio-win-1.5.2.iso,device=cdrom --disk path=/data/kvm/vm/window_24.img,format=qcow2,bus=virtio --network bridge=br0,model=virtio --vnc --vncport=5924 --vnclisten=0.0.0.0 --force --autostart --os-type=windows --accelerate --boot cdrom,hd,menu=on

设置虚拟机网络

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.16
PREFIX=24
GATEWAY=192.168.1.1
DNS1=119.29.29.29

5. 启动

使用virsh list –all查看已安装的kvm

1
2
3
4
[root@localhost ~]# virsh list --all
Id Name State
----------------------------------------------------
5 test running

6. 动态调整cpu个数

1
2
3
4
# virsh setvcpus test --maximum 4 --config #设置test的最大cpu颗数
# virsh setvcpus test 3 #增加到3个CPU
注:使用上面命令修改,虚拟机重启修改的配置会丢失
# virsh edit test #修改CPU个数再保存配置,这样重启之后也会生效

7. 动态调整mem容量

1
2
3
# virsh setmaxmem test 2G --config #设置最大内存
# virsh setmem test 800M --config #重启后生效
# virsh setmem test 800M --config --live #马上生效

8. 查看虚拟化客户机的资源使用情况

1
# virt-top

9. 一些扩展命令

virsh命令行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# virsh list #显示本地活动虚拟机
# virsh list --all #显示本地所有的虚拟机(活动的+不活动的)
# virsh define test.xml #通过配置文件定义一个虚拟机(这个虚拟机还不是活动的)
# virsh start test #启动名字为test的非活动虚拟机
# virsh create test.xml #创建虚拟机(创建后,虚拟机立即执行,成为活动主机)
# virsh suspend test #暂停虚拟机
# virsh resume test #启动暂停的虚拟机
# virsh shutdown test #正常关闭虚拟机
# virsh destroy test #强制关闭虚拟机
# virsh undefine test #清除虚拟机
# virsh dominfo test #显示虚拟机的基本信息
# virsh domname 2 #显示id号为2的虚拟机名
# virsh domid test #显示虚拟机id号
# virsh domuuid test #显示虚拟机的uuid
# virsh domstate test #显示虚拟机的当前状态
# virsh dumpxml test #显示虚拟机的当前配置文件(可能和定义虚拟机时的配置不同,因为当虚拟机启动时,需要给虚拟机分配id号、uuid、vnc端口号等等)
# virsh setmem test 512000 #给不活动虚拟机设置内存大小
# virsh setmaxmem test 1024000 #设定内存上限
# virsh setvcpus test 4 #给不活动虚拟机设置cpu个数
# virsh edit test #编辑配置文件(一般是在刚定义完虚拟机之后)
# virsh vcpuinfo test #显示客户端的虚拟 CPU 信息。
# virsh vcpupin test #控制客户端的虚拟 CPU 亲和性。
# virsh domblkstat test #显示正在运行的客户端的块设备统计。
# virsh domifstat test #显示正在运行的客户端的网络接口统计。
# virsh attach-device test #使用 XML 文件中的设备定义在客户端中添加设备。
# virsh attach-disk test #在客户端中附加新磁盘设备。
# virsh attach-interface test #在客户端中附加新网络接口。
# virsh detach-device test #从客户端中分离设备,使用同样的 XML 描述作为命令attach-device
# virsh detach-disk test #从客户端中分离磁盘设备。
# virsh detach-interface #从客户端中分离网络接口。

问题

Could not open ‘/root/CentOS-7-x86_64-Minimal-1708.iso’: Permission denied

修改/etc/libvirt/qemu.conf

1
2
3
#取消注释
user = "root"
group = "root"

重启libvirtd

service libvirtd restart

error: 操作失败: 这个域有活跃控制台会话

1
2
ps -ef|grep 'console VMNAME|grep -v 'grep'
#然后kill掉相应的进行