kvm虚拟机管理
1. 利用virt-manager创建虚拟机
1> 打开图像化界面,打开虚拟系统管理器
2> 新建虚拟机
3> 选择本地介质安装
此处需要先将镜像文件导入图形化服务器的 /var/lib/libvirt.images/目录下
[root@localhost images]# cd /var/lib/libvirt/images/ [root@localhost images]# ls CentOS-7-x86_64-DVD-1611.iso
4> 设置内存和CPU
5> 创建磁盘
6> 准备安装
选择引导项,将网卡改为新创建的br0桥接,开始安装。
qemu负责io,而kvm负责CPU、内存
7> 安装完成后是用命令virsh list --all 命令查看当前安装的虚拟机
[root@localhost ~]# virsh list --all #查看所有的虚拟机 Id 名称 状态 ---------------------------------------------------- - centos7.0 关闭 [root@localhost ~]# virsh list #仅查看启动的虚拟机 Id 名称 状态 ----------------------------------------------------
2. 远程管理kvm虚拟主机
当环境中有多台kvm宿主机时可以通过一台宿主机连接多台宿主机进行控制。
1> 给一条宿主机添加其他宿主机
点击文件,选择添加虚拟机,以ssh的方式进行添加
注意,第一次连接需要安装一个Python包,该包用本地源进行安装,尽量不要用网络源进行安装,以免版本冲突。
[root@localhost ~]# yum install openssh-askpass
2> 连接上其他宿主机后就可以像管理本地虚拟机一样管理远程宿主机上的虚拟机了
3> 有些情况下,有一个要配置的地方。 因为 KVM(准确说是 Libvirt)默认不接受远程管理,需要按下面的内容配置被管理宿主机中的两个文件:
vim /etc/default/libvirt-bin start_libvirtd="yes" libvirtd_opts="-d -l" vim /etc/libvirt/libvirtd.conf listen_tls = 0 listen_tcp = 1 unix_sock_group = "libvirtd" unix_sock_ro_perms = "0777" unix_sock_rw_perms = "0770" auth_unix_ro = "none" auth_unix_rw = "none" auth_tcp = "none" 然后重启 Libvirtd 服务就可以远程管理了。 systemctl restart libvirt-bin
3. 利用virsh命令行管理虚拟机
virsh 既有命令行模式,也有交互模式,在命令行直接输入 virsh 就进入交互模式, virsh 后面跟命令参数,则是命令行模式;
1> 基础操作 --- 命令行下管理虚拟机
语法结构:
virsh <command> <domain-id> [OPTIONS]
help 列出命令下的所有参数
help list 列出 list 命令下的参数
帮助菜单(vm1为已经创建的虚拟机名)
virsh list |
列出当前宿主机上处于运行状态的虚拟机 |
virsh list --all |
列出当前宿主机上所有的虚拟机 |
virsh start vm1 |
开启虚拟机vm1 |
virsh shutdown vm1 |
正常关闭虚拟机vm1 |
virsh destroy vm1 |
强制关闭某虚拟机vm1 |
virsh autostart vm1 |
开机自启动虚拟机vm1 |
virsh autostart --disable vm1 |
关闭开机自启动 |
virsh edit vm1 |
编辑虚拟机vm1的配置文件 |
virsh pool-list |
列出存储池 |
[root@localhost ~]# virsh edit centos7.0 <domain type='kvm'> #域 虚拟机的名字 <name>centos7.0</name> <uuid>187b0e83-b35f-48de-8a1c-056d5c02fb24</uuid> <memory unit='KiB'>1048576</memory> <currentMemory unit='KiB'>1048576</currentMemory> <vcpu placement='static'>1</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'> <model fallback='allow'>Broadwell-noTSX</model> </cpu> <clock offset='utc'> <timer name='rtc' tickpolicy='catchup'/> <timer name='pit' tickpolicy='delay'/> <timer name='hpet' present='no'/> </clock> ...<devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/centos7.0.qcow2'/> #磁盘文件 <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </disk>
创建一个大小为 50G 的,格式为 qcow2 的磁盘镜像
qemu-img create -f qcow2 -o size=9G /vir/lib/libvirt/images/test.qcow2 # -f 指定格式 -o指定大小 后面跟创建磁盘的路径 Formatting '/var/lib/libvirt/images/test.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 lazy_refcounts=off
查看磁盘信息:
[root@localhost ~]# cd /var/lib/libvirt/images/ [root@localhost images]# ls centos7.0.qcow2 CentOS-7-x86_64-DVD-1611.iso test.qcow2 [root@localhost images]# qemu-img info test.qcow2 image: test.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 196K #精简置备,占用多少给多少,与之相反的厚置备直接分配给划分的空间 cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false
命令行下创建 && 管理虚拟机
Virt-install:命令行下创建虚拟机的命令,不过在它后面需要跟上很多的参数
--name: 虚拟机的名字。
--disk Location: 磁盘映像的位置。
--graphics : 怎样连接 VM ,通常是 SPICE 。
--vcpu : 虚拟 CPU 的数量(核)
--ram : 以兆字节计算的已分配内存大小。
--location : 指定安装源路径
--network : 指定虚拟网络,通常是 virbr0 或者自己设定的 br0
例如:
virt-install --name=test --disk path=/var.lib/libvirt/images/test.qcow2 --ram=1024 --vcpus=1 --graphics spice --location=/var.lib/libvirt/images/CentOS-7.3-x86_64-DVD.iso --network bridge=br0
注:以此安装操作之后,会在桌面显示一个 virtviewer ,进入到安装步骤。
2> 除了这些简单命令,实际在 virsh 形式下还有更多的命令:
virsh help 打印帮助 virsh attach-device 从一个 XML 文件附加装置 virsh attach-disk 附加磁盘设备 virsh attach-interface 获得网络界面 virsh destroy 删除一个域 virsh detach-device 从一个 XML 文件分离设备 virsh detach-disk 分离磁盘设备 virsh detach-interface 分离网络界面 virsh define 从一个 XML 文件定义(但不开始)一个域 virsh undefine 删除一个虚机域 |
[root@localhost ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- - centos7.0 关闭 [root@localhost ~]# virsh start centos7.0 域 centos7.0 已开始 [root@localhost ~]# virsh destroy centos7.0 域 centos7.0 被删除
[root@localhost ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- - centos7.0 关闭
.xm里放置的是磁盘配置文件,虚拟机的配置文件保存在/etc/libvirt/qeum/下
[root@localhost ~]# cd /etc/libvirt/qemu/ [root@localhost qemu]# ls centos7.0.xml networks [root@localhost qemu]# mv centos7.0.xml centos7.0.xml.bak [root@localhost qemu]# virsh undefine centos7.0 #删除虚拟机 域 centos7.0 已经被取消定义 [root@localhost qemu]# virsh list --all Id 名称 状态 [root@localhost qemu]# ls /var/lib/libvirt/images centos7.0.qcow2 CentOS-7-x86_64-DVD-1611.iso test.qcow2 #磁盘并没有被删掉
利用磁盘和.xml文件恢复虚拟机 [root@localhost qemu]# mv centos7.0.xml.bak /root/centos7.0.xml [root@localhost qemu]# cd [root@localhost ~]# ls anaconda-ks.cfg initial-setup-ks.cfg 模板 图片 下载 桌面 centos7.0.xml 公共 视频 文档 音乐
[root@localhost ~]# virsh define centos7.0.xml 定义域 centos7.0(从 centos7.0.xml) [root@localhost ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- - centos7.0 关闭 [root@localhost ~]# ls /etc/libvirt/qemu centos7.0.xml networks
克隆一个虚机:
virt-clone -o vm2 -n vm4 -f /var/lib/libvirt/images/vm4.qcow2
4. kvm通过virsh console连入虚拟机
第一次建立虚拟机后,由于虚拟机没有ip,宿主机无法通过ip进入虚拟机命令行,此时可以通过virsh console虚拟机名连接进入虚拟机命令行界面。开启虚拟机的console功能分两种情况:
1) centos7以下,及其他情况
(1)添加ttyS0的许可,允许root登陆
[root@localhost ~]# echo
"ttyS0" >> /etc/securetty
(2)编辑/etc/grub.conf中加入console=ttyS0
(3)编辑/etc/inittab,在最后一行加入内容:S0:12345:respawn:/sbin/agetty
ttyS0 115200
(4)重启服务器
reboot
(5)宿主机上测试
virsh console vm-name
(6)退出console连接的虚拟机li
按 ctrl+] 组合键退出virsh console
2) 对于centos7及以上版本
对虚拟机而不是宿主机
(1)在虚机里运行
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0"
(2)重启虚机
[root@localhost ~]# reboot
[root@localhost ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- 4 centos7.0 暂停 [root@localhost ~]# virsh console centos7.0 连接到域 centos7.0 换码符为 ^] CentOS Linux 7 (Core) #成功通过console命令连接到虚拟机 Kernel 3.10.0-514.el7.x86_64 on an x86_64 localhost login: root 密码: Last login: Thu Jun 20 20:37:40 from 192.168.5.20 [root@localhost ~]#
连接到虚拟机后将就可以开始编辑网卡信息了,编辑完可以用其他远程工具进行连接。
ctrl + } 即可退出该虚拟机。
5. VNCviewer远程管理kvm主机
通过virsh console连接虚拟机,配置完网卡后就可以直接连接宿主机里面的虚拟机了
1> 虚拟机下载vncserver
[root@localhost ~]# yum install vnc-server
2> 虚拟机启动vncserver
[root@localhost ~]# vncserver You will require a password to access your desktops. Password: #设置vnc密码 Verify: xauth: file /root/.Xauthority does not exist New 'localhost.localdomain:1 (root)' desktop is localhost.localdomain:1 Creating default startup script /root/.vnc/xstartup Starting applications specified in /root/.vnc/xstartup Log file is /root/.vnc/localhost.localdomain:1.log #端口号为1
3> 关掉防火墙
[root@localhost ~]# systemctl stop firewalld [root@localhost ~]# setenforce 0
4> windows 端vncviewer连接宿主机里的虚拟机,注意:要将log提示的端口加上。
成功进入。
6. kvm虚拟化透传
KVM 虚拟化需要处理器对虚拟化技术的支持,当我们需要进行虚拟机嵌套虚拟机时,我们需要让虚拟机中处理器对 VT 功能的支持达到透传的效果。
nested 虚拟机嵌套( kvm on kvm ):nested 技术,简单的说,就是在虚拟机上跑虚拟机。
KVM 虚拟机嵌套和 VMWare 原理不同, VMWare第一层是用的硬件虚拟化技术,第二层就是完全软件模拟出来的,所以 VMWare 只能做两层嵌套。 KVM 是将物理 CPU 的特性全部传给虚拟机,所有理论上可以嵌套 N 多层。
1> 查看一层客户端是否支持 VT
[root@localhost ~]# virsh list --all #查看 Id 名称 状态 ---------------------------------------------------- 4 centos7.0 runnin [root@localhost ~]# grep '(vmx|svm)' /proc/cpuinfo
查询未果,证明一层 KVM 的虚拟机,并未将宿主机处理器的 VT 功能成功透传。所以,没有对 VT功能的支持,我们不能实现在该层虚拟机中嵌套KVM 虚拟机。
2> 在物理服务器上为嵌套虚拟机做准备 --- CPU 虚拟化透传。
在宿主机上添加
[root@localhost ~]# vim /etc/modprobe.d/kvm-nested.conf options kvm_intel nested=1 #开启kvm嵌套
在宿主机启用 kvm_intel 模块的嵌套虚拟化功能,并且使透传永久有效。
重新加载kvm模块
[root@localhost ~]# modprobe -r kvm_intel #移除kvm_intel模块 modprobe: FATAL: Module kvm_intel is in use. #提示正在使用 [root@localhost ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- 4 centos7.0 running [root@localhost ~]# virsh shutdown centos7.0 #关掉运行的虚拟机 域 centos7.0 被关闭 [root@localhost ~]# modprobe -r kvm_intel #再次移除 [root@localhost ~]# modprobe kvm_intel #重新加载 [root@localhost ~]# lsmod | grep kvm #加载成功 kvm_intel 170181 0 kvm 554609 1 kvm_intel irqbypass 13503 1 kvm
验证是否加载成功
[root@localhost ~]# cat /sys/module/kvm_intel/parameters/nested
Y #Y表示cpu虚拟化透传功能开启
3> 编辑需要做虚拟化透传的虚拟机的配置文件
[root@localhost ~]# virsh edit centos7.0 #找到ccpu段进行修改 <cpu mode='host-passthrough'/> # <cpu mode='custom' match='exact'> #注释掉的这三行要删掉,否则会报错。笔记保留知识为了今后利用方便 # <model fallback='allow'>Broadwell-noTSX</model> # </cpu>
host-passthrough 直接将物理 CPU 暴露给虚拟机使用,在虚拟机上完全可以看到的就是物理 CPU的型号
4> 进入虚拟机查看是否透传成功
[root@localhost ~]# virsh start centos7.0 #开启虚拟机 域 centos7.0 已开始 [root@localhost ~]# virsh console centos7.0 #进入虚拟机 连接到域 centos7.0 换码符为 ^] CentOS Linux 7 (Core) Kernel 3.10.0-514.el7.x86_64 on an x86_64 localhost login: root 密码: Last login: Thu Jun 20 21:19:28 from 192.168.5.20 [root@localhost ~]# egrep '(vmx|svm)' /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon rep_good nopl eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap xsaveopt
该虚拟机已开启透传,现在可以在这台虚拟机上继续嵌套安装其他虚拟机了。
6. 虚拟机的分享/冷迁移
冷迁移即 将一台宿主机上的虚拟机完全copy到另一台宿主机上。分享的为配置文件和磁盘。
1> 发送配置文件
[root@localhost ~]# cd /etc/libvirt/qemu/ [root@localhost qemu]# ls centos7.0.xml networks [root@localhost qemu]# scp centos7.0.xml 192.168.16.8:/root #发送配置文件 root@192.168.16.8's password: centos7.0.xml
2> 发送磁盘文件
[root@localhost images]# ls centos7.0.qcow2 CentOS-7-x86_64-DVD-1611.iso test.qcow2 [root@localhost images]# scp centos7.0.qcow2 192.168.16.8:/var/lib//libvirt/images/
3> 在 .8端根据配置文件进行虚拟机恢复
[root@localhost ~]# ls centos7.0.xml [root@localhost ~]# ls /var/lib/libvirt/images/ centos7.0.qcow2 [root@localhost ~]# virsh define centos7.0.xml [root@localhost ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- - centos7.0 running
也可以直接修改配置文件的磁盘路径进行恢复
[root@localhost ~]# mv centos7.0.xml /media [root@localhost ~]# vim centos7.0.xml <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/media/centos7.0.qcow2'/> [root@localhost ~]# virsh define centos7.0.xml #重新定义 [root@localhost ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- - centos7.0 running
将宿主机的虚拟化打开,启动虚拟机
[root@localhost ~]# virsh start centos7.0 域 centos7.0 已开始 [root@localhost ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- - centos7.0 running