Kvm初探

post thumb
Ops
作者 Louis 发表于 2018年7月26日

摘要:

  • 虚拟化技术
  • KVM: Kernel-based Virtual Machine
  • qemu-kvm管理
  • libvirt工具管理

虚拟化技术

第一代:真空管,穿孔卡片

第二代:晶体管,批处理系统

第三代:集成电路,多道程序设计

第四代:PC

虚拟化要求

Poke, Glodberg 提出虚拟化的三要素
	等价执行
	性能良好
	安全隔离
  • CPU虚拟化
emulation   	模拟r0-r3	          ---60%
virtulization	模拟r0
	完全虚拟化(full-virtulazition)
		BT:binary translation  二进制翻译(软件上)   ----85%
		HVM:硬件辅助虚拟化
	半虚拟化(para-virtulation)     ---必须修改cpu内核,才可以实现半虚拟化   ---95%
		各Guest的主机明确知道Host主机的存在
		vm monitor == hypeivisor   ----hyper call特权指令的调用
  • HVM
cpu有5个环,比传统的多一个环。
	r-1 -----Host 主机内核上的特权指令
	r 0
	r 1
	r 2
	r 3 -----Guest 用户空间
  • Memory的虚拟
进程:线性地址空间
内核:物理地址空间

Guest 的虚拟内存必须是连续的,但是hypervisor给其分配的物理内存分散的
	shadow page table
	tlb缓存命中率低下

mmu虚拟化:GVA---GPA,同步进行GVA---HPA
	intel:EPT,Extended page table
	AMD:NTP,Nested Page Table
		GVA:guest virtul address
		GPA:guest visible address
		HPA:hypervisor visible address
TLB 虚拟化
	tagged TLB ----> 直接缓存GVA---HPA记录,命中率大大提高

I/O

外存
	硬盘/光盘/U盘
网络设备
	网卡
显示设备
	VGA:frame buffer机制,由于存在硬件加速,显卡虚拟效果不佳
键盘鼠标
	PS/2,usb
	
I/O的虚拟化方式:
	模拟:使用软件模拟真实硬件
		在Guest也存在调用设备,然后在hypervisor上存在 IO stack,继续调用。
	半虚拟化:和CPU半虚拟化类似
		IO frontend  ----> IO backend
	I/O-through:I/O透传技术
		guest直接访问真实的I/O设备----VT-d+IOV技术

Intel: VT-d
	IOmmu技术
	基于北桥的硬件辅助的虚拟化技术
  • 两种技术实现方式
Type—I型
	硬件上安装hypervisor
	xens,vmware ESX/ESXi
Type-II型
	硬件上安装hosts
	kvm,virtualbox,vmware workstation

总结

  • Interl硬件辅助的虚拟化
cpu:vt-x,EPT,tagged-TLB
IO/CPU:vt-d,vt-x,IOV,VMDq

处理器相关:vt-x
芯片相关:vt-d
IO相关:SR-IOV,VMDq
  • 虚拟化技术
模拟:著名的模拟器,Pearpc,Bochs,QEMU
	上层-------guest
	上层-------emulation
	上层-------hosts
	底层-------硬件
完全虚拟化
	native virtulizition
		加速方式:BT,HVM
	VMware Workstation,VMware Server,Parallels Desktop,KVM,Xens(HVM)

半虚拟化:para-virtulizition
	上层---------guest(需要修改内核参数)
	上层---------hypercisor,hyper call
	底层---------硬件
	xen,uml(user-mode linux)
	
OS级别虚拟化:
	上层---------用户空间,虚拟管理器
	上层---------内核
	底层---------硬件
	OpenVZ,lxc,Solris Containers,FreeBSd jails

库虚拟化:
	wine,
	如在ubuntu上安装qq,魔兽等windows。
应用程序虚拟化:
	jvm,
  • 虚拟化网络
桥接
	hsots上的网卡,可以看成一个交换机设备。各虚拟机和hosts处于等同地位
路由模型
	hosts软件虚拟一网卡,仅主机
nat
	hosts软件虚拟化一个网卡。将guset元ip地址改为hosts的ip地址。
  • tun与tap
在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备,不同于普通依赖硬件网路板卡实现的设备。

TAP等同于一个以太网设备,操作第二层数据包如以太网数据帧。
TUN模拟了网络层设备,操作第三层数据包如IP数据包。

操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,
反之,用户空间程序也可以像操作硬件网络设备一样,通过TUN/TAP设备发送数据。
	TUN/TAP设备宝贝向操作系统的网络栈发送投递数据包,从而模拟从外部接受数据的过程。
  • 安装创建桥服务,重启会丢失数据。建议写成脚本。
$ chkconfig disable NetworkManager
$ chkconfig enable network
$ yum install bridge-utils -y
$ brctl addbr br0
$ ifconfig eth0 0 up
$ brctl addif br0 eth0
$ ifconfig br0 172.20.0.24/16 up
$ route add default gw 172.20.0.1

KVM

KVM:Kernel-based Virtual Machine,以色列Qumranet公司开发,2009年被redhat收购

qemu:创建并管理虚拟机的工具,额外实现模拟I/O的工具。

	将guest的内核空间转移---r1上
$ modprobe kvm
$ lsmod |grep kvm
kvm_intel             204800  0
kvm                   593920  1 kvm_intel
irqbypass              16384  1 kvm
$ ll /dev/kvm
crw------- 1 root root 10, 232 jul  26 09:35 /dev/kvm
  • KVM组件
/dev/kvm: 管理虚拟机的设备文件
	创建虚拟机
	为虚拟机分配内存
	读写VCPU的寄存器
	向VCPU注入中断
	运行VCPU
qemu进程:工作与用户空间的组建,用于仿真PC机的I/O类硬件设备。
  • virt
$ yum list *virt*  		#redhat安装kvm的虚拟库,如果要安装zens,则需要用到zen的库
$ yum info qemu-kvm qemu-kvm-tools
$ yum install -y qemu-kvm qemu-kvm-tools
$ ln -sv /usr/libexec/qemu-kvm  /usr/sbin/  #软链接一个,没有PATH变量

qemu-kvm的用法

  • 标准选项
qemu-kvm的标准选项主要涉及指定主机类型、CPU模式、NUMA、软驱设备、光驱设备及硬件设备等。
	-name name:设定虚拟机名称;
	-M machine:指定要模拟的主机类型,如Standard PC、ISA-only PC或Intel-Mac等,可以使用“qemu-kvm -M ?”获取所支持的所有类型;
	-m megs:设定虚拟机的RAM大小;
	-cpu model:设定CPU模型,如coreduo、qemu64等,可以使用“qemu-kvm -cpu ?”获取所支持的所有模型;
	-smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]:设定模拟的SMP架构中CPU的个数等、每个CPU的核心数及CPU的socket数目等;PC机上最多可以模拟255颗CPU;maxcpus用于指定热插入的CPU个数上限;
	-numa opts:指定模拟多节点的numa设备;
	-fda file
	-fdb file:使用指定文件(file)作为软盘镜像,file为/dev/fd0表示使用物理软驱;
	-hda file
	-hdb file
	-hdc file
	-hdd file:使用指定file作为硬盘镜像;
	-cdrom file:使用指定file作为CD-ROM镜像,需要注意的是-cdrom和-hdc不能同时使用;将file指定为/dev/cdrom可以直接使用物理光驱;
	-drive option[,option[,option[,...]]]:定义一个新的硬盘设备;可用子选项有很多。
	file=/path/to/somefile:硬件映像文件路径;
	if=interface:指定硬盘设备所连接的接口类型,即控制器类型,如ide、scsi、sd、mtd、floppy、pflash及virtio等;
	index=index:设定同一种控制器类型中不同设备的索引号,即标识号;
	media=media:定义介质类型为硬盘(disk)还是光盘(cdrom);
	snapshot=snapshot:指定当前硬盘设备是否支持快照功能:on或off;
	cache=cache:定义如何使用物理机缓存来访问块数据,其可用值有none、writeback、unsafe和writethrough四个;
	format=format:指定映像文件的格式,具体格式可参见qemu-img命令;
	-boot [order=drives][,once=drives][,menu=on|off]:定义启动设备的引导次序,每种设备使用一个字符表示;不同的架构所支持的设备及其表示字符不尽相同,在x86 PC架构上,a、b表示软驱、c表示第一块硬盘,d表示第一个光驱设备,n-p表示网络适配器;默认为硬盘设备;
  • 显示选项
显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。
	-nographic:默认情况下,qemu使用SDL来显示VGA输出;而此选项用于禁止图形接口,此时,qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台;
	-curses:禁止图形接口,并使用curses/ncurses作为交互接口;
	-alt-grab:使用Ctrl+Alt+Shift组合键释放鼠标;
	-ctrl-grab:使用右Ctrl键释放鼠标;
	-sdl:启用SDL;
	-spice option[,option[,...]]:启用spice远程桌面协议;其有许多子选项,具体请参照qemu-kvm的手册;
	-vga type:指定要仿真的VGA接口类型,常见类型有:
	cirrus:Cirrus Logic GD5446显示卡;
	std:带有Bochs VBI扩展的标准VGA显示卡;
	vmware:VMWare SVGA-II兼容的显示适配器;
	qxl:QXL半虚拟化显示卡;与VGA兼容;在Guest中安装qxl驱动后能以很好的方式工作,在使用spice协议时推荐使用此类型;
	none:禁用VGA卡;
	-vnc display[,option[,option[,...]]]:默认情况下,qemu使用SDL显示VGA输出;使用-vnc选项,可以让qemu监听在VNC上,并将VGA输出重定向至VNC会话;使用此选项时,必须使用-k选项指定键盘布局类型;其有许多子选项,具体请参照qemu-kvm的手册;
  • 网络选项
网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息。这里只介绍nic、tap和user三种类型网络接口的属性,其它类型请参照qemu-kvm手册。

	-net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]:创建一个新的网卡设备并连接至vlan n中;PC架构上默认的NIC为e1000,macaddr用于为其指定MAC地址,name用于指定一个在监控时显示的网上设备名称;emu可以模拟多个类型的网卡设备,如virtio、i82551、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;不过,不同平台架构上,其支持的类型可能只包含前述列表的一部分,可以使用“qemu-kvm -net nic,mode=?”来获取当前平台支持的类型;
	-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]:通过物理机的TAP网络接口连接至vlan n中,使用script=file指定的脚本(默认为/etc/qemu-ifup)来配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤消接口配置;使用script=no和downscript=no可分别用来禁止执行脚本;
	-net user[,option][,option][,...]:在用户模式配置网络栈,其不依赖于管理权限;有效选项有:
	vlan=n:连接至vlan n,默认n=0;
	name=name:指定接口的显示名称,常用于监控模式中;
	net=addr[/mask]:设定GuestOS可见的IP网络,掩码可选,默认为10.0.2.0/8;
	host=addr:指定GuestOS中看到的物理机的IP地址,默认为指定网络中的第二个,即x.x.x.2;
	dhcpstart=addr:指定DHCP服务地址池中16个地址的起始IP,默认为第16个至第31个,即x.x.x.16-x.x.x.31;
	dns=addr:指定GuestOS可见的dns服务器地址;默认为GuestOS网络中的第三个地址,即x.x.x.3;
	tftp=dir:激活内置的tftp服务器,并使用指定的dir作为tftp服务器的默认根目录;
	bootfile=file:BOOTP文件名称,用于实现网络引导GuestOS;如:qemu -hda linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pxelinux.0
  • 一个例子
下面的命令创建了一个名为rhel7.5的虚拟机,其RAM大小为512MB,有两颗CPU的SMP架构,默认引导设备为硬盘,有一个硬盘设备和一个光驱设备,网络接口类型为virtio,VGA模式为cirrus,并启用了balloon功能。

$ qemu-kvm -name "rhel7.5" -m 512 \
-smp 2 -boot d \
-drive file=/VM/images/rhel7.5/hda,if=virtio,index=0,media=disk,format=qcow2 \
-drive file=/isos/rhel-7.5.iso,index=1,media=cdrom \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E \
-vga cirrus -balloon virtio

qemu-img命令使用

选项

#create   创建
#resize   增加大小
#convert  转化
#snapshot 快照

$ qemu-img --help
$ qemu-img create -f  qcow2 -o size=20G /images/vm1/c1.qcow2
$ qemu-img conver -O vmdk -o adapter_type=lsilogic c1.qcow2 c1.vmdk
$ qemu-img snapshot -c c1.snap c1.qcow2
  • 安装虚拟机实验
下载iso镜像 
$ modprobe kvm
$ modprobe kvm_intel
$ mkdir /images/vml -pv
$ qemu-img create -f qcow2 -o size=40G /images/vml/ubuntu.qcow2
$ qemu-img resize /images/vml/ubuntu.qcow2 50G
$ ls -lh /images/vml/ubuntu.qcow2
$ yum install -y tigervnc   #安装vnc客户端


#had模式
$ qemu-kvm -name 'ubuntu' -m 768 -smp 4 -hda /images/vml/ubuntu.qcow2 \
-cdrom ubuntu-16.10-desktop-amd64.iso -boot order=dc
#前台运行的

$ vncviewer :5900
进行安装界面

#drive模式
$ qemu-kvm -name 'win7' -m 768 -smp 4 -drive \
file=/images/vml/ubuntu.qcow2,if=ide,index=0,media=disk,format=qcow2 \
-drive file=/root/cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso,\
media=cdrom,index=1 -boot order=dc
  • qemu-KVM其他可能用到的选项
#在monitor下实现实时迁移:-incoming tcp:0:port
#qemu-kvm运行后台:-daemonize
#打开声音设备:-soundhw

#设定iscsi存储设备
	# qemu-kvm -iscsi initiator-name=  -drive \
	file=iscsi://<ip>[:port]/<target_iqn>/<lun>

#设定bios:
	-bios /path/to/some_bios_program

KVM-libvirt

基于C/S架构,virsh,virt-manager,virt-install,virt-clone,virt-convert,virt-copy等管理工具,使用原始的qemu-kvm管理过于繁琐,命令行复杂。需要对很多选项熟悉才能玩得转。

  • 前期环境准备
$ yum install -y libvirt libvirt-daemon-kvm qemu-kvm virt-manager
$ systemctl start libvirtd.service

#######创建br0容易发生错误########### 
###ens37为桥接网卡,且获取ip为dhcp方式###
$ virsh iface-bridge ens37 br1  || systemctl restart network
$ virt-install -n "centos6" 
--vcpus 2 -r 512 \
-l http://172.20.0.1/cobbler/ks_centsos6.9 \
--disk path=/images/vm/centos6.qcow2,bus=virtio,size=120,sparse
--network bridge=br0,model=virtio
--force
$ virt-manager &

virt-install是一个命令行工具,它能够为KVM、Xen或其它支持libvrit API的hypervisor创建虚拟机并完成GuestOS安装;此外,它能够基于串行控制台、VNC或SDL支持文本或图形安装界面。安装过程可以使用本地的安装介质如CDROM,也可以通过网络方式如NFS、HTTP或FTP服务实现。对于通过网络安装的方式,virt-install可以自动加载必要的文件以启动安装过程而无须额外提供引导工具。当然,virt-install也支持PXE方式的安装过程,也能够直接使用现有的磁盘映像直接启动安装过程。

virt-install命令有许多选项,这些选项大体可分为下面几大类,同时对每类中的常用选项也做出简单说明。
	一般选项:指定虚拟机的名称、内存大小、VCPU个数及特性等;
	-n NAME, --name=NAME:虚拟机名称,需全局惟一;
	-r MEMORY, --ram=MEMORY:虚拟机内在大小,单位为MB;
	--vcpus=VCPUS[,maxvcpus=MAX][,sockets=#][,cores=#][,threads=#]:VCPU个数及相关配置;
	--cpu=CPU:CPU模式及特性,如coreduo等;可以使用qemu-kvm -cpu ?来获取支持的CPU模式;
	安装方法:指定安装方法、GuestOS类型等;
	-c CDROM, --cdrom=CDROM:光盘安装介质;
	-l LOCATION, --location=LOCATION:安装源URL,支持FTP、HTTP及NFS等,如ftp://172.16.0.1/pub;
	--pxe:基于PXE完成安装;
	--livecd: 把光盘当作LiveCD;
	--os-type=DISTRO_TYPE:操作系统类型,如linux、unix或windows等;
	--os-variant=DISTRO_VARIANT:某类型操作系统的变体,如rhel5、fedora8等;
	-x EXTRA, --extra-args=EXTRA:根据--location指定的方式安装GuestOS时,用于传递给内核的额外选项,例如指定kickstart文件的位置,--extra-args "ks=http://172.16.0.1/class.cfg"
	--boot=BOOTOPTS:指定安装过程完成后的配置选项,如指定引导设备次序、使用指定的而非安装的kernel/initrd来引导系统启动等 ;例如:
	--boot  cdrom,hd,network:指定引导次序;
	--boot kernel=KERNEL,initrd=INITRD,kernel_args=”console=/dev/ttyS0”:指定启动系统的内核及initrd文件;
	存储配置:指定存储类型、位置及属性等;
	--disk=DISKOPTS:指定存储设备及其属性;格式为--disk /some/storage/path,opt1=val1,opt2=val2等;常用的选项有:
	device:设备类型,如cdrom、disk或floppy等,默认为disk;
	bus:磁盘总结类型,其值可以为ide、scsi、usb、virtio或xen;
	perms:访问权限,如rw、ro或sh(共享的可读写),默认为rw;
	size:新建磁盘映像的大小,单位为GB;
	cache:缓存模型,其值有none、writethrouth(缓存读)及writeback(缓存读写);
	format:磁盘映像格式,如raw、qcow2、vmdk等;
	sparse:磁盘映像使用稀疏格式,即不立即分配指定大小的空间;
	--nodisks:不使用本地磁盘,在LiveCD模式中常用;
	网络配置:指定网络接口的网络类型及接口属性如MAC地址、驱动模式等;
	-w NETWORK, --network=NETWORK,opt1=val1,opt2=val2:将虚拟机连入宿主机的网络中,其中NETWORK可以为:
	bridge=BRIDGE:连接至名为“BRIDEG”的桥设备;
	network=NAME:连接至名为“NAME”的网络;
它常用的选项还有:
	model:GuestOS中看到的网络设备型号,如e1000、rtl8139或virtio等;
	mac:固定的MAC地址;省略此选项时将使用随机地址,但无论何种方式,对于KVM来说,其前三段必须为52:54:00;
	--nonetworks:虚拟机不使用网络功能;
	图形配置:定义虚拟机显示功能相关的配置,如VNC相关配置;
	--graphics TYPE,opt1=val1,opt2=val2:指定图形显示相关的配置,此选项不会配置任何显示硬件(如显卡),而是仅指定虚拟机启动后对其进行访问的接口;
	TYPE:指定显示类型,可以为vnc、sdl、spice或none等,默认为vnc;
	port:TYPE为vnc或spice时其监听的端口;
	listen:TYPE为vnc或spice时所监听的IP地址,默认为127.0.0.1,可以通过修改/etc/libvirt/qemu.conf定义新的默认值;
	password:TYPE为vnc或spice时,为远程访问监听的服务进指定认证密码;
	--noautoconsole:禁止自动连接至虚拟机的控制台;
	设备选项:指定文本控制台、声音设备、串行接口、并行接口、显示接口等;
	--serial=CHAROPTS:附加一个串行设备至当前虚拟机,根据设备类型的不同,可以使用不同的选项,格式为“--serial type,opt1=val1,opt2=val2,...”,例如:
	--serial pty:创建伪终端;
	--serial dev,path=HOSTPATH:附加主机设备至此虚拟机;
	--video=VIDEO:指定显卡设备模型,可用取值为cirrus、vga、qxl或vmvga;

	虚拟化平台:虚拟化模型(hvm或paravirt)、模拟的CPU平台类型、模拟的主机类型、hypervisor类型(如kvm、xen或qemu等)以及当前虚拟机的UUID等;
	-v, --hvm:当物理机同时支持完全虚拟化和半虚拟化时,指定使用完全虚拟化;
	-p, --paravirt:指定使用半虚拟化;
	--virt-type:使用的hypervisor,如kvm、qemu、xen等;所有可用值可以使用’virsh capabilities’命令获取;
	其它:
	--autostart:指定虚拟机是否在物理启动后自动启动;
	--print-xml:如果虚拟机不需要安装过程(--import、--boot),则显示生成的XML而不是创建此虚拟机;默认情况下,此选项仍会创建磁盘映像;
	--force:禁止命令进入交互式模式,如果有需要回答yes或no选项,则自动回答为yes;
	--dry-run:执行创建虚拟机的整个过程,但不真正创建虚拟机、改变主机上的设备配置信息及将其创建的需求通知给libvirt;
	-d, --debug:显示debug信息;

尽管virt-install命令有着类似上述的众多选项,但实际使用中,其必须提供的选项仅包括--name、--ram、--disk(也可是--nodisks)及安装过程相关的选项。此外,有时还需要使用括--connect=CONNCT选项来指定连接至一个非默认的hypervisor。
  • 一个例子
下面的示例将创建一个名为rhel6的虚拟机,其有两个虚拟CPU,安装方法为FTP,并指定了ks文件的位置,磁盘映像文件为稀疏格式,连接至物理主机上的名为brnet0的桥接网络:

$ virt-install \
    --connect qemu:///system \
    --virt-type kvm \
    --name rhel6 \
    --ram 1024 \
    --vcpus 2 \
    --network bridge=brnet0 \
    --disk path=/VMs/images/rhel6.img,size=120,sparse \
    --location ftp://172.16.0.1/rhel6/dvd \
    --extra_args “ks=http://172.16.0.1/rhel6.cfg” \
    --os-variant rhel6 \
    --force
  • img安装
$ mv cirros-no_cloud-0.3.0-x86_64-disk.img c1.img
[root@master ~]# qemu-img info c1.img 
file format: qcow2
virtual size: 39M (41126400 bytes)
disk size: 11M
cluster_size: 65536
Format specific information:
    compat: 0.10

$ virt-manager &
#采用import镜像文件方法,第四项进行图形安装。
$ virsh list
 Id    Name                           State
----------------------------------------------------
 2     centos6.9                      running

$ virsh
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit
virsh # console centos6.9
Connected to domain centos6.9
Escape character is ^]
login as 'mageedu' user. default password: 'mageedu.com'. use 'sudo' for root.
cirros login: mageedu 
Password: 
$ sudo su -
# ls

#### ctrl+] 退出终端 ####

virsh # help domain   #虚拟机管理
virsh # domstats centos6.9
Domain: 'centos6.9'
  state.state=1
  state.reason=1
  cpu.time=16312974545
  cpu.user=1730000000
····

------管理虚拟机domain------
$ virsh list  
$ virsh start c2
$ virsh destroy c2      
$ virsh reboot c2
$ virsh undefine c2
$ virsh save c2 /tmp/c2.sanp
$ virsh restore /tmp/c2.sanp


----hypervisor----
$ virsh nodeinfo
$ virsh capabilities

----Interface----- 
#管理hypervisor的网络iface
----Networking----
#管理guest的网络
----Storage Pool----
#存储池管理

配置文件/etc/libvirt/qemu/centos6.9.xml,修改部分内容即可复制新虚拟机.

$ cp /etc/libvirt/qemu/centos6.9.xml /etc/libvirt/qemu/c2.xml
$ vim /etc/libvirt/qemu/c2.xml   
###将centos6.9替换成c2,uuid,source的path等修改即可
##准备qcow2及img文件
$ qemu-img create -f qcow2 -o size=40G /images/vml/c2.qcow2
$ mv cirros-no_cloud-0.3.0-x86_64-disk.img c2.img

#创建虚拟机并进入终端。
$ virsh create --console /etc/libvirt/qemu/c2.xml

批量创建虚拟机

当然,如果批量创建虚拟机机,上面的操作依然繁琐,这里推荐一个脚本复制,时间会稍长。

for i in {1..30}; do 
	virt-clone --connect=qemu:///system -o temp -n node$i -f /data/node$i.img
done

当然,也有批量删除的.

for i in {1..30}; do 
	do virsh undefine node$i
done

这里,每个虚拟机都有相应的ip,桥接的网卡是172.20/16网段的。要求能获取每个虚拟机的Ip,这里推荐一个脚本获取,当然,需要相应主机是running状态的。

$ vim vish.sh
#!/bin/bash 
#ping当前网段内在线的主机,以便产生arp记录. 
for ip in 172.20.128.{1..253};do
        { ping -c1 $ip >/dev/null 2>&1 
        }& 
done
#依次查找arp记录. 
running_vms=`virsh list |grep running` 
echo -ne "共有`echo "$running_vms"|wc -l`个虚拟机在运行.\n" 
for i in `echo "$running_vms" | awk '{ print $2 }'`;do 
        mac=`virsh dumpxml $i |grep "mac address"|sed "s/.*'\(.*\)'.*/\1/g"`
        ip=`arp -ne |grep "$mac" |awk '{printf $1}'` 
        printf "%-30s %-30s\n" $i $ip 
done

$ chmod +x virsh.sh
$ ./virt.sh 
共有31个虚拟机在运行.
ubuntu16.04                    172.20.128.166                
node1                          172.20.128.201                
node2                          172.20.128.202                
node3                          172.20.128.203                
node4                          172.20.128.204                
node5                          172.20.128.205                
node6                          172.20.128.206                
node7                          172.20.128.207                
node8                          172.20.128.208                
node9                          172.20.128.209                
node10                         172.20.128.210                
node11                         172.20.128.211                
node12                         172.20.128.212                
node13                         172.20.128.213                
node14                         172.20.128.215                
node15                         172.20.128.214                
node16                         172.20.128.217                
node17                         172.20.128.216                
node18                         172.20.128.218                
node19                         172.20.128.219                
node20                         172.20.128.220                
node21                         172.20.128.222                
node22                         172.20.128.221                
node23                         172.20.128.224                
node24                         172.20.128.229                
node25                         172.20.128.227                
node26                         172.20.128.225                
node27                         172.20.128.223                
node28                         172.20.128.226                
node29                         172.20.128.230                
node30                         172.20.128.228
上一篇
Kubuntu 从安装到科学上网