kvm虚拟化
虚拟机的组成:
- 内核虚拟化模块(KVM)
- 系统设备仿真(QEMU)
- 虚拟机管理程序(LIBVIRT)
- 一个XML文件(虚拟机配置声明文件,定义虚拟机的名称、cpu、内存、虚拟磁盘、网卡等各种参数配置,路径:/etc/libvirt/qemu/)
- 一个磁盘镜像文件(虚拟机的硬盘,路径:/var/lib/libvirt/images/)
#cat /proc/cpuinfo //查看cpu信息,其中vmx指令集表示支持虚拟化
#virsh start node01 //启动kvm中的虚拟机
#ps -efww //以宽输出格式显示所有进程
必备软件:
qemu-kvm:为kvm提供底层仿真支持
libvirt-daemon:libvirt守护进程,管理虚拟机
libvirt-client:用户端软件,提供客户端管理命令
libvirt-daemon-driver-qemu:libvirtd连接qemu的驱动
虚拟化平台的安装:
#yum -y install qemu-kvm libvirt-daemon libvirt-client libvirt-daemon-driver-qemu
#systemctl start libvirtd
- virsh:提供管理各虚拟机的命令接口
常用virsh命令工具:
#virsh nodeinfo //查看KVM(运行中)节点的信息
#virsh list [- -all] //列出运行中虚拟机(所有虚拟机)
#virsh net-list //列出虚拟网络
#virsh dominfo 虚拟机名称 //查看指定虚拟机信息
#virsh start|reboot|shutdown 虚拟机名称 //启动|重启|关闭指定虚拟机
#virsh destory 虚拟机名称 //强制关闭指定的虚拟机
#virsh autostart 虚拟机名称 //将指定虚拟机设置开机自启
#virsh undedine 虚拟机名称 //删除虚拟机 - virsh虚拟网络管理
#virsh net-list //查看虚拟网络
#virsh net-define vbr.xml //创建虚拟网络
#virsh net-undefine vbr //删除虚拟网络
#virsh net-start vbr //启动虚拟网络
#virsh net-destroy vbr //停止虚拟网络
#virsh net-edit vbr //修改vbr网络的配置
#virsh net-autostart vbr //设置vbr虚拟网络开机自启
#virsh -c qemu+ssh://192.168.1.100/system //远程连接其他主机(192.168.1.100)的虚拟机
创建虚拟机
(1)创建vbr虚拟交换机
#vim vbr.xml //创建虚拟交换机配置文件
<network>
<name>vbr</name>
<bridge name='vbr' stp='on' delay='0'/>
<domain name='vbr'/>
<forward mode="nat"/>
<ip address='192.168.1.254' netmask='255.255.255.0'>
<dhcp>
<range start="192.168.1.100" end="192.168.1.200"/>
</dhcp>
</ip>
</network>
#cp vbr.xml /etc/libvirt/qemu/networks/ //拷贝配置文件至指定目录
#virsh net-define /etc/libvirt/qemu/networks/vbr.xml //通知libvirtd根据配置文件创建虚拟设备
#vim /etc/libvirt/qemu/networks/vbr.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 net-edit vbr
or other application using the libvirt API.
-->
<network>
<name>vbr1</name>
<uuid>38d50b4d-8033-4d24-9d30-1c0cb0f5030e</uuid>
<forward mode='nat'/>
<bridge name='vbr1' stp='on' delay='0'/>
<mac address='52:54:00:c7:87:b6'/>
<domain name='vbr'/>
<ip address='192.168.1.254' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.1.100' end='192.168.1.200'/>
</dhcp>
</ip>
</network>
#virsh net-autostart vbr //设置开机自启动
#virsh net-start vbr //开启虚拟设备
#virsh net-list //验证虚拟设备是否开启
(2)创建前端盘.img文件
COW技术原理( Copy On Write,写时复制)
- 直接映射原始盘的数据内容
- 当原始盘的旧数据有修改时,在修改之前自动将旧数据存入前端盘
- 对前端盘的修改不回写到原始盘
qemu-img命令:虚拟机的磁盘管理命令
格式:qemu-img 命令 参数 块文件名称 大小
常用命令:
#qemu-img create -f qcow2 test.img 50G //当前路径创建一个大小为50G的虚拟磁盘镜像文件
#qemu-img info test.img //查询磁盘镜像文件
2.1)、将node.qcow2复制到/var/lib/libvirt/images目录(node.qcow2后端盘:装好系统的模板文件)
2.2)、创建前端盘node0.img,复用node.qcow2系统
#cd /var/lib/libvirt/images/
#qemu-img create -f qcow2 -b node.qcow2 node0.img 50G
(3)创建虚拟机.xml配置文件
#cp node.xml /etc/libvirt/qemu/node0.xml //拷贝模板配置文件(可网上下载)至/etc/libvirt/qemu/目录
#cd /etc/libvirt/qemu/
#vim node0.xml
domain type='kvm'>
<name>node0</name> //修改虚拟机名称
<memory unit='KB'>1524000</memory> //修改内存大小
<currentMemory unit='KB'>1524000</currentMemory>
<vcpu placement='static'>2</vcpu> //指定cpu个数
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
<bootmenu enable='yes'/>
<bios useserial='yes'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<cpu mode='host-passthrough'>
</cpu>
<clock offset='localtime'/>
<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='qcow2'/>
<source file='/var/lib/libvirt/images/node0.img'/> //指定虚拟机镜像磁盘文件
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'> //指定连接的虚拟网桥
<source bridge='vbr'/>
<model type='virtio'/>
</interface>
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
</channel>文件
<serial type='pty'></serial>
<console type='pty'>
<target type='serial'/>
</console>
<memballoon model='virtio'></memballoon>
</devices>
</domain>
#virsh define /etc/libvirt/qemu/node0.xml //根据修改后配置文件创建虚拟机node0
#virsh start node0 //启动虚拟机
#virsh list //查看虚拟机启动情况
(4)编写自动创建虚拟机脚本
# vim auto-v.sh
#!/bin/bash
for i in $1
do
qemu-img create -f qcow2 -b /var/lib/libvirt/images/node.qcow2 /var/lib/libvirt/images/node$i.img 100G
sed "s,node,node$i," /root/node.xml > /etc/libvirt/qemu/node$i.xml
virsh define /etc/libvirt/qemu/node$i.xml
virsh start node$i
done
#bash auto-v.sh 66 //利用脚本创建虚拟机node66
(5)在未知新建虚拟机ip情况下,远程连接虚拟机
#virsh list
# virsh console node66 //连续回车两次,输入用户名和密码(关闭KVM)
#ifconfig
退出登录:Ctrl+],然后通过ssh ip登录修改ip
#virsh console node66 //通过该方式登录重启network使修改ip生效(该方式重启不会卡机)
#vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0" //网卡驱动名称
ONBOOT="yes" //开机自启
NM_CONTROLLED="no" //不接受NetworkManager控制
TYPE="Ethernet" //类型(Ethernet网卡,Bridege网桥)
BOOTPROTO="static" //协议(dhcp动态ip,static静态ip,none特殊情况使用)
IPADDR="192.168.8.101"
NETMASK="255.255.255.0"
GATEWAY="192.168.8.254"
#systemctl restart network
#ifconfig //查看ip是否生效
(6)磁盘扩容
#LANG=C //设置系统语言为英语
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 100G 0 disk
└─vda1 253:1 0 2G 0 part /
#growpart /dev/vda 1 //分区扩容
#xfs_growfs / //文件系统扩容
#lsblk //查看磁盘分区扩容是否生效
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 100G 0 disk
`-vda1 253:1 0 100G 0 part /
#df -h //查看文件系统扩容是否生效
(7)修改后端盘数据
- 修改后端盘之前需关闭所有虚拟机,修改完后端盘数据,所有前端盘都需要重做(所有虚拟机需重新创建),因此需慎重
#yum provides guestmount //查询提供guestmount命令的安装包
#yum -y install libguestfs-tools-c
格式:
guestmount -a 要修改的后端盘文件 -i 挂载目录
例:
#guestmount -a /var/lib/libvirt/images/node.qcow2 -i /tmp/lx
#cd /tmp/lx //进入后端盘挂载目录进行修改配置
#umount /tmp/lx //修改完后,卸载挂载目录