转载:https://yq.aliyun.com/articles/64860

作者

digoal

日期

2016-11-11

标签

Linux , KVM , 虚拟化 , 克隆


背景

当需要批量部署虚拟机时,通常有几种做法,使用模板重新安装。

或者使用已有的虚拟机克隆。

使用模板安装可以参考kickstart脚本的编写方法。

《install kvm hosts use kickstart in CentOS 6 in text mode》

本文介绍一下在已经安装好的虚拟机上,克隆虚拟机的方法。

从0开始安装一个虚拟机

在服务器安装必要的包, 不再需要图形相关的包.

# yum install -y qemu-img qemu-kvm virt-manager libvirt libvirt-python python-virtinst libvirt-client libvirt libvirt-client virt-what

创建一个虚拟磁盘目录

# mkdir /data03/kvmdisk

创建虚拟磁盘, 用于虚拟机的系统盘

# qemu-img create -f qcow2 -o encryption=off,cluster_size=2M,preallocation=full /data03/kvmdisk/disk01.img 32G  

or 

# qemu-img create -f raw /data03/kvmdisk/disk01.img 32G

下载安装镜像

# mkdir /data03/iso
# cd iso
# wget http://mirrors.aliyun.com/centos/6.6/isos/x86_64/CentOS-6.6-x86_64-bin-DVD1.iso

配置

vi /etc/libvirt/libvirtd.conf

listen_tls = 0

启动libvirtd

# service libvirtd start
# /etc/init.d/messagebus start
# /etc/init.d/avahi-daemon start
# /etc/init.d/libvirtd start # chkconfig libvirtd on
# chkconfig libvirt-guests off
# chkconfig avahi-daemon on
# chkconfig messagebus on

查看当前启动的网桥

# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.5254001263b0 yes virbr0-nic # ifconfig
em1 Link encap:Ethernet HWaddr 00:22:19:60:77:8F
inet addr:172.16.3.150 Bcast:172.16.3.255 Mask:255.255.255.0
inet6 addr: fe80::222:19ff:fe60:778f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5469716 errors:0 dropped:0 overruns:0 frame:0
TX packets:2830916 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5147311077 (4.7 GiB) TX bytes:198552462 (189.3 MiB) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:79073 errors:0 dropped:0 overruns:0 frame:0
TX packets:79073 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:24506711 (23.3 MiB) TX bytes:24506711 (23.3 MiB) virbr0 Link encap:Ethernet HWaddr 52:54:00:12:63:B0
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

或者你也可以手工添加网桥

brctl addbr br0  

ip link set br0 up  

ip addr add 192.168.122.1/24 dev br0

查看虚拟机用到的virbr0网桥地址配置

# grep -r 192.168.122 /etc/libvirt
/etc/libvirt/qemu/networks/default.xml: <ip address="192.168.122.1" netmask="255.255.255.0">
/etc/libvirt/qemu/networks/default.xml: <range start="192.168.122.2" end="192.168.122.254" />
/etc/libvirt/qemu/networks/autostart/default.xml: <ip address="192.168.122.1" netmask="255.255.255.0">
/etc/libvirt/qemu/networks/autostart/default.xml: <range start="192.168.122.2" end="192.168.122.254" />

text 交互式安装虚拟机操作系统

在没有图形环境时, 可以使用text模式安装操作系统.

virt-install \
--name=centos6_6_x64 \
--disk path=/data03/kvmdisk/disk01.img,device=disk,bus=virtio,perms=rw,cache=writethrough \
--graphics none \
--vcpus=4 --ram=4096 \
--location=/data03/iso/CentOS-6.6-x86_64-bin-DVD1.iso \
--network bridge=virbr0 \
--os-type=linux \
--os-variant=rhel6 \
--extra-args="console=tty0 console=ttyS0,115200n8"

安装完后,连接到虚拟机的console的方法

# virsh
> console $domainID
> 退出console 按下 ctrl+]

例如 :

[root@db-172-16-3-150 ~]# virsh
Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands
'quit' to quit virsh # list
Id Name State
----------------------------------------------------
2 centos6_6_x64 running virsh # console 2 # 使用Id或者Name都可以连接
Connected to domain centos6_6_x64
Escape character is ^] CentOS release 6.6 (Final)
Kernel 2.6.32-504.el6.x86_64 on an x86_64 digoal.sky-mobi.com login: root
Password:
Last login: Thu Apr 2 00:12:27 on ttyS0
[root@digoal ~]#
[root@digoal ~]#
[root@digoal ~]# exit
logout CentOS release 6.6 (Final)
Kernel 2.6.32-504.el6.x86_64 on an x86_64 digoal.sky-mobi.com login: # 这里按下ctrl+]返回本地控制台
virsh #
virsh #

设置开机自动启动虚拟机

# vi /etc/rc.local
/usr/bin/virsh start centos6_6_x64

优化虚拟机配置

1. 主要是删掉一些不必要的控制器(如USB), 然后添加CPU模块, 使用本地CPU的flag.

#virsh
Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands
'quit' to quit virsh #
virsh # list
Id Name State
----------------------------------
6 kvm101 running
8 kvm103 running
9 kvm104 running
10 kvm105 running
11 kvm106 running
12 kvm102 running

优化例子

virsh # edit kvm101
<domain type='kvm'>
<name>kvm101</name>
<uuid>366072c0-2ee0-027a-e887-e60d50bad5a7</uuid>
<memory>83886080</memory>
<currentMemory>83886080</currentMemory>
<vcpu>10</vcpu>
<cpu mode='host-passthrough'> # 注意这里可能要指定CPU,而不是host-passthrough,否则可能保存会失败,或者自动抹除。 /usr/libexec/qemu-kvm -cpu ? 可以得到支持的CPU
<model fallback='allow'/>
</cpu>
--------- 例如 /usr/share/libvirt/cpu_map.xml
<cpu match='exact'>
<model fallback='forbid'>Nehalem</model>
<vendor>Intel</vendor>
<feature policy='require' name='fma'/> # 这里可以指定CPU flag
<feature policy='require' name='pse'/> # 这里可以指定CPU flag
</cpu>
---------
<os>
<type arch='x86_64' machine='rhel6.2.0'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='raw' cache='writeback'/>
<source file='/u01/kvmdisk/disk01.img'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
<interface type='bridge'>
<mac address='52:54:00:3e:78:0d'/>
<source bridge='virbr0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<console type='pty'>
<target type='serial' port='0'/>
</console>
</devices>
</domain> "/tmp/virshKtG0oG.xml" 36L, 1133C written
Domain kvm101 XML configuration edited.

重启虚拟机后生效。

克隆虚拟机

http://www.cnblogs.com/5201351/p/4461000.html

kvm虚拟机的克隆分为两种情况,第一种kvm宿主机上对虚拟机直接克隆

第二种通过复制配置文件与磁盘文件的虚拟机复制克隆(适用于异机的静态迁移)。

现笔者将分别两种kvm虚拟机克隆的的详细操作过程都记录如下:

方法一: kvm宿主机上对虚拟机直接克隆(需要在关机或暂停的状态下操作)

1、查看所有的虚拟机、以及需要克隆的虚拟机的硬盘文件的位置。

[root@5201351_kvm ~]# virsh list --all           //查看已安装的所有的kvm虚拟机

2、我们可以通过编辑需要克隆的源虚拟机配置文件,去发现它的磁盘文件位置,命令如下:

[root@5201351_kvm ~]# virsh edit kvm_client00    //通过编辑虚拟机的配置文件,查看其硬盘文件的位置

如通过如下的内容,可以看出磁盘文件的位置

<source file='/var/lib/libvirt/images/kvm_client00.img'/>

3、开始克隆,将kvm_client00虚拟机克隆成新的虚拟机kvm_client01,新的虚拟机的磁盘文件为/var/lib/libvirt/images/kvm_client01.img

[root@5201351_kvm ~]# virt-clone -o kvm_client00 -n kvm_client01 -f /var/lib/libvirt/images/kvm_client01.img

4、这时克隆就完了、我们可以通过virsh list --all进行查看,如果需要删除克隆的虚拟机,我们只需要执行如下命令即可。

[root@5201351_kvm ~]# virsh undefine kvm_client01         //该命令只是删除wintest01的配置文件,并不删除虚拟磁盘文件

方法二:复制配置文件与磁盘文件进行克隆(可以不用关闭源虚拟机)

1、这里我们还是克隆kvm_client00,我们通过如下命令创建新虚拟机的配置文件

[root@5201351_kvm ~]# virsh dumpxml kvm_client00 > /etc/libvirt/qemu/kvm_client02.xml    //创建新虚拟机的配置文件

2、复制原虚拟机的磁盘文件,通过方法一、我们知道,磁盘默认位置为/var/lib/libvirt/images,我们执行如下命令进行复制

[root@5201351_kvm ~]# cd /var/lib/libvirt/images
[root@5201351_kvm images]# cp kvm_client00.img kvm_client02.img

3、直接编辑修改配置文件kvm_client02.xml,修改name,uuid,disk文件位置,mac地址,vnc端口

4、通过新虚拟机的配置文件,定义新的虚拟机,只需要执行如下一条命令即可。

[root@5201351_kvm ~]# virsh define /etc/libvirt/qemu/kvm_client02.xml   //通过配置文件定义新的kvm虚拟机

需要特别说明的是、以上两种方法克隆的虚拟机、我们都需要进入克隆的新虚拟机里

修改网卡设备文件/etc/udev/rules.d/70-persistent-net.rules,或者直接将其删除,再重启克隆的目的虚拟机

同时还需要修改虚拟机内对应网卡的ip, mac,与重启后新生成的/etc/udev/rules.d/70-persistent-net.rules中的MAC和设备号内容一致。

然后才能重启新建的虚拟机的网卡。

cat /etc/udev/rules.d/70-persistent-net.rules
# PCI device 0x1af4:0x1000 (virtio-pci)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:3e:78:0d", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改ip
mac 重启network服务

其他管理例子

(1) 删除kvm虚拟机

# virsh undefine wintest01

说明:该命令只是删除wintest01的配置文件,并不删除虚拟磁盘文件。

(2) 重新定义虚拟机配置文件

通过导出备份的配置文件恢复原KVM虚拟机的定义,并重新定义虚拟机。

# mv /etc/libvirt/qemu/wintest02.xml /etc/libvirt/qemu/wintest01.xml
# virsh define /etc/libvirt/qemu/wintest01.xml

(3) 编辑KVM虚拟机配置文件

# virsh edit wintest01

virsh edit将调用vi命令编辑/etc/libvirt/qemu/wintest01.xml配置文件。也可以直接通过vi命令进行编辑,修改,保存。

可以但不建议直接通过vi编辑。

(1) 挂起服务器

# virsh suspend oeltest01

(2) 恢复服务器

# virsh resume oeltest01

导出KVM虚拟机配置文件

# virsh dumpxml wintest01 > /etc/libvirt/qemu/wintest02.xml

配置开机自启动虚拟机

# virsh autostart oeltest01

通过配置文件启动虚拟机

# virsh create /etc/libvirt/qemu/wintest01.xml

KVM虚拟机开机

# virsh start oeltest01

KVM虚拟机关机或断电

(1) 关机

默认情况下virsh工具不能对linux虚拟机进行关机操作,linux操作系统需要开启与启动acpid服务。在安装KVM linux虚拟机时必须在虚拟机内配置此服务。

# chkconfig acpid on
# service acpid restart

virsh关机

# virsh shutdown oeltest01

(2) 强制关闭电源

# virsh destroy wintest01

给每个虚拟机CPU,指定具体的物理机CPU pinning绑定亲和策略

<cputune>
<vcpupin vcpu="0" cpuset="1-4,2"/>
<vcpupin vcpu="1" cpuset="0,1"/>
<vcpupin vcpu="2" cpuset="2,3"/>
<vcpupin vcpu="3" cpuset="0,4"/>
</cputune> or <cputune>
<vcpupin vcpu="0" cpuset="2"/>
<vcpupin vcpu="1" cpuset="3"/>
<vcpupin vcpu="2" cpuset="4"/>
<vcpupin vcpu="3" cpuset="5"/>
<vcpupin vcpu="4" cpuset="6"/>
<vcpupin vcpu="5" cpuset="7"/>
<vcpupin vcpu="6" cpuset="8"/>
<vcpupin vcpu="7" cpuset="9"/>
<vcpupin vcpu="8" cpuset="10"/>
<vcpupin vcpu="9" cpuset="11"/>
</cputune>

也可以使用emulatorpin的方式

emulatorpin 标签可以指定一个特定的物理CPU,使虚拟机使用的CPU和存储器都在一个物理机CPU内部

<cputune>
<emulatorpin cpuset="1-3"/>
</cputune>

vcpu的设置

<vcpu placement='auto'>8</vcpu>
<vcpu placement='static' cpuset='0-10,5'>8</vcpu>

和 需要保持一致,配置的是物理CPU,配置的CPU的核,包括超线程产生的核;

使用static模式,也必须是;

也可以设置一个虚拟机给32个虚拟CPU,但是一开始只能使用8个,然后可以根据系统压力,热添加CPU给虚拟机。

<vcpu placement='auto' current='8'>32</vcpu>

使用cgoup cpuset限制KVM虚拟机对CPU的访问

使用vcpupin的效果可能不好,所以可以考虑cgroup的cpuset子系统。

/cgroup/cpuset/libvirt/qemu

在这个目录中,每个启动的虚拟机都有一个子目录,设置子目录中的cpuset.cpus即可。

例如, 设置kvm101虚拟机只能使用宿主机的1-10号核。

cd /cgroup/cpuset/libvirt/qemu/kvm101
echo "1-10" > cpuset.cpus

Linux中如何克隆KVM虚拟机的更多相关文章

  1. Linux中安装配置KVM虚拟化

    KVM 概述: KVM 即 Kernel-based Virtual Machine 基于内核的虚拟机. KVM,是一个开源的系统虚拟化模块,自 Linux 2.6.20 之后集成在 Linux 的各 ...

  2. 如何克隆kvm虚拟机

    关于如何使用kvm虚拟化技术创建虚拟机,这里有一系列博客讲的已经非常清楚了,这里不再赘述,不过其中有些小坑可能需要大家注意: 0. 写在创建虚拟机之前(即教程的系列三之前) 1. 确认防火墙是否关闭, ...

  3. Redhat Linux下如何使用KVM虚拟机(视频)

    KVM(kernel-basedVirtualMachine)是一个开源的系统虚拟化模块,自Linux2.6.20之后集成在Linux的各个主要发行版本中.它使用Linux自身的调度器进行管理,所以相 ...

  4. 全自动链接克隆KVM虚拟机

    virt-clone这个命令是基于全克隆的,也就是拷贝虚拟磁盘文件和虚拟配置文件来实现的完整克隆,速度慢,占用空间多 kvm软件包中并没有实现全自动链接克隆的命令或工具,只能手动实现,于是我决定写一个 ...

  5. 016_编写脚本快速克隆 KVM 虚拟机

    #!/bin/bash#本脚本针对 RHEL7.2 或 Centos7.2#本脚本需要提前准备一个 qcow2 格式的虚拟机模板,名称为/var/lib/libvirt/images/.rh7_tem ...

  6. 克隆kvm虚拟机报错ImportError: No module named 'requests.packages.urllib3'

    2018-06-21 更新系统造成kvm克隆命令报错 virt-clone -o centos--update-clone -n centos--maven-test -f /var/lib/vmdk ...

  7. Linux CentOS7 VMware克隆、虚拟机之间互连——初学笔记

    一.VMware克隆:选中我的第一个虚拟机,右键下拉菜单—管理—克隆. 弹出对话框,下一步根据提示:             完成克隆: 二.虚拟机互连: 配置第二虚拟机IP,使用:vi /etc/s ...

  8. CentOS 6.9下KVM虚拟机通过virt-clone克隆虚拟机(转)

    一.virt-clone概述 1.virt-clone作用简介 virt-clone主要是用来克隆kvm虚拟机,并且通过Options.General Option.Storage Configura ...

  9. KVM虚拟机管理——虚拟机克隆

    1. 概述2. 部署基本操作系统虚拟机3. 配置虚拟机3.1 修改/etc/sysconfig/network3.2 删除/etc/sysconfig/network-scripts/ifcfg-et ...

随机推荐

  1. ZetCode PyQt4 tutorial widgets I

    #!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial In this example, ...

  2. [QT][SQLITE]学习记录二 日期查询

    资料例程: 1.dongfangyu SQL时间段查询 : http://blog.csdn.net/dongfangyu/article/details/4607236 2.痕网 - henw  S ...

  3. 神之编辑器emacs

    vim被称之为编辑器之神,而emacs被成为神之编辑器. 可以当编辑器,也可以当做编译器. 编辑好后保存 输入 M-x shell 可以编译文件 g++ test.cpp -o test ./test ...

  4. 文本框模糊匹配(纯html+jquery简单实现)

    一.项目中需要用到此功能,使用过EasyUI中的Combobox,网上也搜过相应的解决办法,对于我的项目来说都不太合适,因为我还是喜欢比较纯粹的东西,就自己动手写了一个,比较简单,但还算能用,我的项目 ...

  5. Hibernate环境搭建+struts整合

    说明:本文档,是和struts2+hibernate的整合示例. lib下还有struts2的jar包,本示例没有显示.struts2的搭建参考struts2的环境搭建 一下载hibernate的ja ...

  6. (精华)将json数组和对象转换成List和Map(小龙哥和牛徳鹤的对话)

    将java标准的数据结构ArrayList和HashMap转换成json对象和数组很简单 只需要JSONArray.fromObject(obj);或者JSONObject.fromObject(ob ...

  7. debugfs文件系统

    debugfs: https://www.cnblogs.com/helloworldtoyou/p/6281415.html /proc/bus/input/devices /sys/kernel/ ...

  8. FastAdmin 学习线路 (2018-06-09 更新)

    FastAdmin 学习线路 以下为常规线路,非常规可跳过. FastAdmin 学习线路 基础 HTML CSS DIV Javascript 基础 jQuery php 基础 对象 命名空间 进阶 ...

  9. dell R730 安装windwos 2008 R2在windows loading files...完成后屏幕无信号(iDrac绿屏)

    dell R730 安装windwos 2008 R2在windows loading files...完成后,Starting Windows时屏幕无信号(iDrac绿屏) 解决方法: F2  进行 ...

  10. 阿里云 搭建Git服务器

    1. 服务端安装git, ssh, 客户端安装git sudo apt-get install git sudo apt-get install ssh 2. 服务单创建用户server sudo a ...