文章内容仅供参考
kvm简介
KVM是RedHat的一项虚拟化技术
一个KVM虚拟化平台由三个部分组成
kvm:是linux内核的模块,它需要CPU的支持,采用硬件辅助虚拟化技术 Intel-VT,AMD-V,内存的相关如Intel的 EPT 和 AMD 的 RVI 技术,主要是提供底层命令支持
qemu:一个虚拟化的仿真工具,通过 ioctl 不内核kvm 交互完成对硬件的虚拟化支持,主要提供虚拟硬件的仿真支持
libvirt:是一个对虚拟化管理的接口和工具,提供用户端程序 virsh ,virt-install, virt-manager, virt-view 不用户交互,因为一条完整的启动虚拟机的命令是非常非常非常长的,要在命令中指定所有的虚拟机配置,简直就是反人类,所有我们都是通过和libvirt交互来控制虚拟机
一个虚拟机由两个部分组成
一个XML配置文件,路径在/etc/libvirt/qemu/
一个磁盘镜像文件,路径在/var/lib/libvirt/images/
KVM安装
依赖包:
qemu-kvm //为KVM提供底层仿真支持,KVM已经集成在内核中,不需要再安装
libvirt-daemon //libvirtd的守护进程,用来管理虚拟机
libvirt-client //客户端软件,提供客户端管理命令,eg:virsh,virt-manager
libvirt-daemon-driver-qemu //libvirtd连接qemu时的驱动,libvirtd不单单可以连接qemu也可以连接VMware和virtualBOX
可选安装:
virt-install //系统安装工具
virt-manager //图形管理软件
virt-v2v //虚拟机迁移工具,可以将从一个虚拟平台迁移到另外一个虚拟平台
virt-p2v //实现将物理机往虚拟机中迁移
yum -y install qemu-kvm libvirt-client libvirt-daemon libvirt-daemon-driver-qemu
systemctl satart libvirtd
KVM管理命令
• 查看KVM节点(服务器)信息
– virsh nodeinfo //真机信息
• 列出虚拟机
– virsh list [--all]
• 列出虚拟网络
– virsh net-list [--all] //虚拟交换机(网桥)
• 查看指定虚拟机的信息
– virsh dominfo 虚拟机名称
• 运行|重启|关闭指定的虚拟机
– virsh start|reboot|shutdown 虚拟机名称
• 强制关闭指定的虚拟机
– virsh destroy 虚拟机名称
• 将指定的虚拟机设为开机自动运行
– virsh autostart [--disable] 虚拟机名称
• 连接指定虚拟机
– virsh console 虚拟机名称 //通过这个命令连接到虚拟机是连接的虚拟机的串口,相当于直接连接的虚拟机的屏幕,能够进行任何操作,包括修改网卡,甚至进入修复模式,断开连接只能用“ctrl+] ”
创建镜像
镜像文件使用的比较多的时RAW和QCOW2这两种格式,QCOW2是kvm默认的格式,除了在I/O速度上比不上RAW,其他方面都完爆RAW,它主要是使用了COW技术,能够非常快速的拷贝文件
cow:copy on write,写时复制;
client 访问 前端盘,当前端盘有client需要的数据的时候,前端盘直接将数据返回给client;当前端盘没有对应数据的时候,前端盘就访问后端盘,copy一份数据到前端盘,然后再返回给client。client对数据的修改保存在前端盘上,后端盘的数据是readonly的
创建新的镜像盘文件
qemu-img create -f 格式 磁盘路径 大小 // -f :指定文件格式,创建的文件存放在当前路径
qemu-img create -f qcow2 disk.img 50G
qemu-img 常用的命令有
– create 创建一个磁盘
– convert 转换磁盘格式
– info 查看磁盘信息
– snapshot 管理磁盘快照
qemu-img命令可以通过添加-b选项来使用后端镜像盘
qemu-img create -b disk.img -f qcow2 disk1.img 20G
其中disk.img是后端盘,disk1.img是前端盘,前端盘的大小一定要大于等于后端盘
后端盘可以通过virt-manage图形管理工具创建一台虚拟机以后,在虚拟机上安装
创建虚拟交换机
创建的虚拟交换机,调用dnsmasq的DHCP,DNS等功能
vim /etc/libvirt/qemu/networks/vbr.xml
<network>
<name>vbr</name> #指定名称,执行virsh net-list 看到的名字
<bridge name="vbr"/> #指定名称,执行ifconfig看到的名字
<forward mode="nat"/> #路由转发模式为nat地址转换,可以上网
<ip address="192.168.1.254" netmask="255.255.255.0"> #虚拟交换机的IP,也是虚拟机的网关地址
<dhcp>
<range start="192.168.1.100" end="192.168.1.200"/> #指定dhcp分配的地址池
</dhcp>
</ip>
</network>
• virsh 管理虚拟网络
– net-list //查看虚拟网络
– net-define vbr.xml 创建虚拟网络 //让virsh读取vbr.xml配置文件
– net-undefine vbr 删除虚拟网络 //还没停止服务时执行,只是在net-list看不到,完整删除要先 执行net-destroy
– net-start vbr //启动虚拟网络vbr
– net-destroy vbr //停止虚拟网络vbr
– net-edit vbr 修改 vbr 网络的配置 //编辑xml以后需要重启虚拟交换机
– net-autostart vbr //设置 vbr 虚拟网络开机自启动
虚拟机配置文件
vim /etc/libvrit/qemu/node1.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh edit node01
or other application using the libvirt API.
-->
<domain type='kvm'>
<name>node01</name> <!--虚拟机的名称--!>
<uuid>f92bef5c-821a-4d2a-96cb-1d3647f26a04</uuid> <!--虚拟机的UUID--!>
<memory unit='KiB'>4100000</memory> <!--虚拟机最大能使用内存--!>
<currentMemory unit='KiB'>4100000</currentMemory> <!--虚拟机真实内存--!>
<vcpu placement='static'>1</vcpu> <!--cpu个数--!>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
</os>
<features> <!--电源相关信息--!>
<acpi/>
<apic/>
</features>
<cpu mode='host-model' check='partial'> <!--cpu模式,不知道怎么改可以删掉--!>
<model fallback='allow'/>
</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>restart</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='/var/lib/libvirt/images/rh7_node001.img'/> <!--指定镜像地址--!>
<target dev='vda' bus='virtio'/>
<boot order='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' 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='0x06' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' 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:6c:82:16'/>
<source network='private1'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<interface type='network'>
<mac address='52:54:00:48:fc:e6'/>
<source network='private2'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</interface>
<interface type='network'>
<mac address='52:54:00:ce:53:32'/>
<source network='public1'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
</interface>
<interface type='network'>
<mac address='52:54:00:a6:fe:c1'/>
<source network='public2'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<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>
<sound model='ich6'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<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>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='2'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='3'/>
</redirdev>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</memballoon>
</devices>
</domain>
• xml 配置文件
– 保存 node 虚拟机配置文件
virsh dumpxml node >demo.xml
– 清除模板配置
virsh undefine node
– xml模板
– <!-- 是注释的开始
– --> 是注释的结尾
– xml 标签必须成对出现
– <keyword> ... ... </keyword>