grep -E 'svm|vmx' /proc/cpuinfo
yum -y install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-manager
systemctl enable libvirtd && systemctl start libvirtd
lsmod |grep kvm
等待系统安装完成即可
安装完成后进入系统,可以执行一些初识化操作
[root@kvm-server ~]# ls /etc/libvirt/qemu
autostart centos7.xml networks
[root@kvm-server ~]#
虚拟机名称
<name>centos7name>
UUID 具有唯一性
<uuid>9fd70bcf-1ba4-49b2-b3a9-b70b0282ec60uuid>
内存
kvm 虚拟机的内存可以动态调整,就是可以在虚拟机运行状态下修改当前的内存大小,但是动态设置的内存容量不能大于配置文件中设置的最大可用内存。
<memory unit='KiB'>4194304memory>
<currentMemory unit='KiB'>4194304currentMemory>
磁盘
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/centos7.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
disk>
这里需要注意的是:
kvm 虚拟磁盘的文件格式有两种
写时复制就是,设置 10G 容量的磁盘,而实际占用物理机磁盘容量是没有 10G,实际占用的容量是虚拟机内实际使用的大小。比如虚拟机内实际使用了 3G,那会占用物理机磁盘的 3G 左右的容量。
网卡
网卡需要关注 mac 地址部分,前三组是不能变的,后面三组是可以变化的。
<interface type='network'>
<mac address='52:54:00:e2:6c:c1'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
interface>
[root@kvm-server ~]# ls /var/lib/libvirt/images/
centos7.qcow2
[root@kvm-server ~]#
我们可以利用已有的虚拟机配置文件和含有操作系统的虚拟磁盘快速创建一台虚拟机。
首先我们需要准备一个虚拟机配置文件的模板。
下面我们拷贝原来虚拟机的配置文件 centos7.xml
到当前用户的家目录下,并命名为 centos7-mod.xml
。
cp /etc/libvirt/qemu/centos7.xml centos7-mod.xml
接下来修改模板文件 centos7-mod.xml
中的如下内容:
设置虚拟机的名称部分为关键字: vm-name
设置虚拟机的 UUID 部分为关键字: vm-uuid
设置虚拟机的最大可用内存和当前使用内存部分为关键字: vm-mem
设置虚拟机的 mac 部分为关键子: vm-mac
<name>vm-namename>
<uuid>vm-uuiduuid>
<memory unit='KiB'>vm-memmemory>
<currentMemory unit='KiB'>vm-memcurrentMemory>
设置虚拟磁盘的路径部分为关键字: vm-disk-path
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='vm-disk-path'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
disk>
<interface type='network'>
<mac address='52:54:00:vm-mac'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
interface>
修改后的模板文件完整代码
[root@kvm-server ~]# cat centos7-mod.xml
<domain type='kvm'>
<name>vm-namename>
<uuid>vm-uuiduuid>
<memory unit='KiB'>vm-memmemory>
<currentMemory unit='KiB'>vm-memcurrentMemory>
<vcpu placement='static'>2vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvmtype>
<boot dev='hd'/>
os>
<features>
<acpi/>
<apic/>
features>
<cpu mode='custom' match='exact' check='partial'>
<model fallback='allow'>SandyBridge-IBRSmodel>
<feature policy='require' name='md-clear'/>
<feature policy='require' name='spec-ctrl'/>
<feature policy='require' name='ssbd'/>
cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
clock>
<on_poweroff>destroyon_poweroff>
<on_reboot>restarton_reboot>
<on_crash>destroyon_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
pm>
<devices>
<emulator>/usr/libexec/qemu-kvmemulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='vm-disk-path'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hda' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
controller>
<interface type='network'>
<mac address='52:54:00:vm-mac'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
target>
serial>
<console type='pty'>
<target type='serial' port='0'/>
console>
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
channel>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='2'/>
channel>
<input type='tablet' bus='usb'>
<address type='usb' bus='0' port='1'/>
input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='spice' autoport='yes'>
<listen type='address'/>
<image compression='off'/>
graphics>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
memballoon>
<rng model='virtio'>
<backend model='random'>/dev/urandombackend>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
rng>
devices>
domain>
虚拟硬盘只需要把原有虚拟机含有操作系统的磁盘拷贝一份即可。
提示:最好是把计划作为模板的这个虚拟机实现做一下系统初始化操作,比如关闭 SELINUX 和防火墙,安装一下常用的软件等。
进行常规设置和安装常用软件
setenforce 0
sed -ri '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
systemctl stop firewalld && systemctl disable firewalld
yum -y install wget bash-completion vim-enhanced
至此,现有的虚拟机的硬盘中已经包含了我们需要的环境,下面我们以此虚拟机的硬盘作为一个模板文件。
这样的话,以后以此模板硬盘文件作为新的虚拟机的硬盘文件,新的虚拟机也会有同样的环境了。
[root@kvm-server ~]# cp /var/lib/libvirt/images/centos7.qcow2 centos7-mod.qcow2
首先定义和新虚拟机相关的变量
vm_name=centos7-1
vm_uuid=`uuidgen`
vm_mem=1048576
vm_disk_path=/home/centos7-1.qcow2
vm_mac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`
\B
匹配非单词边界的意思&
表示前面正则匹配到的所有内容接下来,把配置文件中的特殊字符替换变量的值,并产生一个新虚拟机的配置文件
[root@kvm-server ~]# sed -r \
> -e s%vm-name%$vm_name% \
> -e s%vm-uuid%$vm_uuid% \
> -e s%vm-mem%$vm_mem% \
> -e s%vm-disk-path%$vm_disk_path% \
> -e s%vm-mac%$vm_mac% \
> centos7-mod.xml > centos7-1.xml
[root@kvm-server ~]# cp centos7-mod.qcow2 /home/centos7-1.qcow2
[root@kvm-server ~]# virsh define centos7-1.xml
定义域 centos7-1(从 centos7-1.xml)
[root@kvm-server ~]# virsh list --all # 列出所有的虚拟机
Id 名称 状态
----------------------------------------------------
- centos7 关闭
- centos7-1 关闭
[root@kvm-server ~]# virsh start centos7-1 # 启动指定的虚拟机
域 centos7-1 已开始
[root@kvm-server ~]# virsh list
Id 名称 状态
----------------------------------------------------
1 centos7-1 running
[root@kvm-server ~]# virsh domifaddr 1
名称 MAC 地址 Protocol Address
-------------------------------------------------------------------------------
vnet0 52:54:00:e2:6c:c1 ipv4 192.168.122.3/24
注意:
virsh domifaddr 虚拟机名称
可以查看虚拟机的 IP 地址,前提条件是虚拟主机需要是自动获取的 IP
下文中 vm-name
表示一个虚拟机的名称
1 列出正则运行中的虚拟机
virsh list
2 列出所有的虚拟机
virsh list --all
3 查看指定虚拟机的元数据信息
virsh dominfo vm-name
4 查看指定虚拟机的 IP 地址
virsh domifaddr vm-name
5 启动虚拟机
virsh start vm-name
6 正常关闭虚拟机
virsh shutdown vm-name
7 强制关闭虚拟机,相当于拔掉电源
virsh destroy vm-name
8 重启虚拟机
virsh reboot vm-name
9 从一个 xml 文件定义一个虚拟机
virsh define vmn.xml
vmn.xml
是一个 xml 文件路径名称
10 取消定义一个虚拟机
就是删除一台虚拟机,但是虚拟机的磁盘文件会保留
virsh undefine vm-name
由于太简单,现场演示即可
首先确认虚拟机已经处于关闭状态
virsh shutdown centos7-1
之后设置最大可分配内存
virsh setmaxmem centos7-1 6G
查看虚拟机信息
[root@kvm ~]# virsh dominfo centos7-1
Id: -
名称: centos7-1
UUID: 87f6c2ff-811d-4685-8b61-6494f6ae17e9
OS 类型: hvm
状态: 关闭
CPU: 2
最大内存: 6291456 KiB
使用的内存: 4194304 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
之后就可以在虚拟机启动的情况下,给其动态的调整内存的大小(范围在最大内存容量内)
[root@kvm ~]# virsh setmem centos7-1 4G
[root@kvm ~]# virsh dominfo centos7-1
Id: 2
名称: centos7-1
UUID: 87f6c2ff-811d-4685-8b61-6494f6ae17e9
OS 类型: hvm
状态: running
CPU: 2
CPU 时间: 12.0s
最大内存: 6291456 KiB
使用的内存: 4194304 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
[root@kvm ~]# virsh setmem centos7-1 5G
[root@kvm ~]# virsh dominfo centos7-1
Id: 2
名称: centos7-1
UUID: 87f6c2ff-811d-4685-8b61-6494f6ae17e9
OS 类型: hvm
状态: running
CPU: 2
CPU 时间: 12.4s
最大内存: 6291456 KiB
使用的内存: 5242880 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
创建一个虚拟硬盘
mkdir -p /centos7/
qemu-img create -f qcow2 /centos7/centos7-1-2.qcow2 2G
编辑一个虚拟硬盘的 xml 文件模板
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
<source file='/centos7/centos7-1-2.qcow2'/>
<target dev='vdb' bus='virtio'/>
disk>
然后使用 attach-device
命令从XML文件添加
virsh attach-device centos7-1 disk.xml --persistent
最后查看虚拟机的所有磁盘
virsh domblklist centos7-1
生产 mac 地址的后 3 位
[root@kvm ~]# openssl rand -hex 3 | sed -r 's/..\B/&:/g'
12:47:d4
参考当前需要添加网卡的这台虚拟机的xml配置文件中的网络部分,创建一个新网卡的 xml 配置文件
注意修改 mac 地址
<interface type='network'>
<mac address='52:54:00:12:47:d4'/>
<source network='default'/>
<model type='virtio'/>
interface>
然后使用 attach-device
命令从XML文件添加
[root@kvm ~]# virsh attach-device centos7-1 network.xml --persistent
成功附加设备
最后查看确认是否添加
[root@kvm ~]# virsh domiflist centos7-1
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 network default virtio 52:54:00:ba:ac:be
vnet1 network default virtio 52:54:00:12:47:d4
存储池是由libvirt管理的文件,目录或存储设备,用于为虚拟机提供存储。
存储池分为存储虚拟机映像的存储卷或作为附加存储附加到虚拟机的存储卷。
多个被管理的虚拟机可以共享同一个存储池,从而可以更好地分配存储资源。
存储池可以是本地的,也可以是基于网络的(共享的):
本地存储池直接连接到主机服务器。它们包括本地设备上的本地目录,直接连接的磁盘,物理分区和逻辑卷管理(LVM)卷组。
本地存储池对于不需要迁移或大量虚拟机的开发,测试和小型部署很有用。
本地存储池可能不适用于许多生产环境,因为它们不能用于实时迁移。
联网存储池包括使用标准协议在网络上共享的存储设备。
/var/lib/libvirt/images/
使用 virsh pool-define-as
命令创建持久性存储池。
[root@kvm ~]# mkdir /vm-pool/centos7
[root@kvm ~]# virsh pool-define-a --name centos7-pool --type dir --target "/vm-pool/centos7"
创建池 centos7-pool
使用 virsh pool-list --all
命令列出所有现有的存储池。
[root@kvm ~]# virsh pool-list
名称 状态 自动开始
-------------------------------------------
centos7-pool 非活动 否
default 活动 是
[root@kvm ~]# virsh pool-start centos7-pool
池 centos7-pool 已启动
[root@kvm ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
centos7-pool 活动 否
default 活动 是
opt 活动 是
默认情况下,virsh 使用自定义的存储池未设置为每次 libvirtd 启动时自动启动。
可以使用 virsh pool-autostart
命令将存储池配置为自动启动。
virsh pool-autostart centos7-pool
为避免对使用要删除的存储池的其他来宾虚拟机产生负面影响,建议您停止存储池并释放其使用的所有资源。
# virsh pool-list --all
Name State Autostart
-----------------------------------------
default active yes
guest_images_pool active yes
# virsh pool-destroy guest_images_disk
# virsh pool-delete guest_images_disk
# virsh pool-undefine guest_images_disk
# virsh pool-list --all
Name State Autostart
-----------------------------------------
default active yes
这里以为虚拟机 centos7-1 创建一个快照(磁盘格式必须为qcow2)为例说明对一个虚拟机快照的创建、查询、删除操作。
[root@kvm ~]# qemu-img info /var/lib/libvirt/images/centos7-1.qcow2
image: /var/lib/libvirt/images/centos7-1.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 10G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
[root@kvm ~]# virsh snapshot-create-as centos7-1 centos7-1.snap1
已生成域快照 centos7-1.snap1
[root@kvm ~]# virsh snapshot-list centos7-1
名称 生成时间 状态
------------------------------------------------------------
centos7-1.snap1 2020-10-18 16:01:07 +0800 shutoff
[root@kvm ~]# virsh snapshot-revert centos7-1 --snapshotname centos7-1.snap1
[root@kvm ~]# virsh snapshot-delete centos7-1 --snapshotname centos7-1.snap1
已删除域快照 centos7-1.snap1
Libvirt虚拟网络使用虚拟网络交换机的概念。虚拟网络交换机是一种在主机物理机服务器上运行的软件结构。
虚拟机通过这个虚拟的网络交换机和物理宿主机进行通信,从而数据通过物理机和外部网络进行通信。
Linux主机物理机服务器将虚拟网络交换机表示为网络接口。
首次安装并启动libvirtd守护程序(libvirtd)时,表示虚拟网络交换机的默认网络接口是virbr0。
可以使用一下命令查明虚拟网桥
[root@kvm ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400831963 yes virbr0-nic
libvirt 会依赖 ip_forward
参数, 并添加响应的 iptables(防火墙)规则,允许去往和来自虚拟机的数据。有些程序可能会关闭 ip_forward
参数,因此最好的选择是将以下内容添加到 /etc/sysctl.conf。
net.ipv4.ip_forward = 1
可以使用如下命令查看此网络接口的信息
$ ip addr show virbr0
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 1b:c4:94:cf:fd:17 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
默认网络的配置文件是:/etc/libvirt/qemu/networks/default.xml
使用隔离模式时,连接到虚拟交换机的所有虚拟机可以彼此之间通信,也可以与宿主机通信,但是它们不会通过宿主机和外部进行互相通信。但是,即使此网络与任何物理网络隔离开,DNS名称仍然可以解析。因此,当DNS名称解析但ICMP(ping)回显请求命令失败时,可能会出现这种情况。
桥接网络(也称为网络桥接或虚拟网络交换)用于将虚拟机网络接口放置在与物理接口相同的网络上。
使用桥接模式时,所有虚拟机都与主机物理机出现在同一子网内。同一物理网络上的所有其他物理机都知道这些虚拟机,并且可以访问这些虚拟机。桥接在OSI网络模型的第2层上运行。
网桥是一种链路层设备,可根据MAC地址在网络之间转发流量。
它通过侦听网络流量并由此了解哪些主机连接到每个网络来构建基于MAC地址表的转发决策。
可以在Linux主机内使用软件桥,以模拟硬件桥,例如在虚拟化应用程序中,用于与一个或多个虚拟NIC共享NIC。
[root@kvm-server ~]# ip a #先找出宿主机用的哪个网卡设备,我的是enp0s25
1.定义虚拟网卡配置文件
[root@kvm-server ~]# cd /etc/sysconfig/network-scripts/
[root@kvm-server network-scripts]# vim ifcfg-br0 #创建该桥接网卡,默认没有此文件需要新建
[root@kvm-server network-scripts]# cat ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
ONBOOT="yes"
BOOTPROTO=static
IPADDR=10.0.111.182 #要和宿主机在一个网络,这里我用的是宿主机的ip
GATEWAY=10.0.111.1 #宿主的网关,nat的是.2,桥接是.1
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8
2 然后看清楚宿主机正在使用的网卡,修改其配置文件(将物理机网卡桥到桥接网卡)
[root@kvm-server network-scripts]# cp ifcfg-enp0s25 ifcfg-enp0s25.back
[root@kvm-server network-scripts]# vim ifcfg-enp0s25
NAME=enp0s25 #定义网卡设备名称
DEVICE=enp0s25 #宿主机正在使用的网卡设备
ONBOOT=yes
BRIDGE=br0 #和ifcfg-br0文件里面的设备对应,新添加
3 重启 libvirtd 服务
[root@kvm-server network-scripts]# systemctl restart libvirtd
4 重启 network 服务
[root@kvm-server network-scripts]# systemctl restart network
删除桥接网卡步骤:
1.删除br0的配置文件
2.修改正常网卡的配置文件
3.重启系统
[root@kvm-server network-scripts]# mv ifcfg-br0 ifcfg-br0.bak
[root@kvm-server network-scripts]# mv ifcfg-enp0s25 ifcfg-enp0s25.bak
[root@kvm-server network-scripts]# mv ifcfg-enp0s25.back ifcfg-enp0s25
[root@kvm-server network-scripts]# systemctl restart libvirtd
[root@kvm-server network-scripts]# systemctl restart network
[root@kvm-server network-scripts]# ping www.baidu.com
PING www.a.shifen.com (39.156.66.14) 56(84) bytes of data.
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=1 ttl=52 time=13.3 ms
#!/bin/bash
#kvm batch create vm tool
#version:0.1
#author:name
#需要事先准备模板镜像和配置文件模板
echo "1.创建自定义配置单个虚拟机
2.批量创建自定义配置虚拟机
3.批量创建默认配置虚拟机
4.删除虚拟机"
read -p "选取你的操作(1/2/3):" op
batch_self_define() {
kvmname=`openssl rand -hex 5`
sourceimage=/var/lib/libvirt/images/vmmodel.img
sourcexml=/etc/libvirt/qemu/vmmodel.xml
newimg=/var/lib/libvirt/images/${kvmname}.img
newxml=/etc/libvirt/qemu/${kvmname}.xml
cp $sourceimage $newimg
cp $sourcexml $newxml
kvmuuid=`uuidgen`
kvmmem=${1}000000
kvmcpu=$2
kvmimg=$newimg
kvmmac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`
sed -i "s@kvmname@$kvmname@;s@kvmuuid@$kvmuuid@;s@kvmmem@$kvmmem@;s@kvmcpu@$kvmcpu@;s@kvmimg@$kvmimg@;s@kvmmac@$kvmmac@" $newxml
virsh define $newxml
virsh list --all
}
self_define() {
read -p "请输入新虚机名称:" newname
read -p "请输入新虚机内存大小(G):" newmem
read -p "请输入新虚机cpu个数:" newcpu
sourceimage=/var/lib/libvirt/images/vmmodel.img
sourcexml=/etc/libvirt/qemu/vmmodel.xml
newimg=/var/lib/libvirt/images/${newname}.img
newxml=/etc/libvirt/qemu/${newname}.xml
cp $sourceimage $newimg
cp $sourcexml $newxml
kvmname=$newname
kvmuuid=`uuidgen`
kvmmem=${newmem}000000
kvmcpu=$newcpu
kvmimg=$newimg
kvmmac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`
sed -i "s@kvmname@$kvmname@;s@kvmuuid@$kvmuuid@;s@kvmmem@$kvmmem@;s@kvmcpu@$kvmcpu@;s@kvmimg@$kvmimg@;s@kvmmac@$kvmmac@" $newxml
virsh define $newxml
virsh list --all
}
case $op in
1)self_define;;
2)
read -p "请输入要创建的虚拟机的个数:" num
read -p "请输入新虚机内存大小(G):" newmem
read -p "请输入新虚机cpu个数:" newcpu
for((i=1;i<=$num;i++))
do
batch_self_define $newmem $newcpu
done;;
3)
read -p "请输入要创建的虚拟机的个数:" num
for((i=1;i<=$num;i++))
do
batch_self_define 1 1
done;;
*)echo "输入错误,请重新执行脚本"
exit;;
esac
# vim /etc/libvirt/qemu/vmmodel.xml
<domain type='kvm'>
<name>kvmname</name>
<uuid>kvmuuid</uuid>
<memory unit='KiB'>kvmmem</memory>
<currentMemory unit='KiB'>kvmmem</currentMemory>
<vcpu placement='static'>kvmcpu</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<cpu mode='custom' match='exact' check='partial'>
<model fallback='allow'>Haswell-noTSX</model>
</cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='kvmimg'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</controller>
<interface type='network'>
<mac address='52:54:00:kvmmac'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
</devices>
</domain>