KVM

KVM

KVM理论基础

  1. 介绍:
  2. KVM全称是基于内核的虚拟机(Kernel-based Virtual Machine),它是一个Linux内核模块,只不过它的虚拟化有些奇葩,它一个模块硬是将宿主机的内核给挤出了内核,并将内核运行用户空间成为了控制台。


  3. KVM架构
    • KVM是基于虚拟化扩展(Intel VT 或者 AMD-V)的x86硬件的开源的Linux原生的全虚拟化解决方案。KVM中,虚拟机被实现为常规的Linux进程,由标准Linux调度程序进行调度;虚拟机的每个虚拟CPU被实现 为一个常规的Linux进程。这使得KVM能够用Linux内核的已有功能。
    • 但是,KVM本身不执行任何硬件模拟,需要客户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间, 向它提供模拟的I/O,并将它的视频 显示 映射回宿主机的显示屏,目前这个应用程序是QEMU
    • KVM architecture:

    • Guest: 客户机系统,包括CPU(vCPU)、内存、驱动(console、网卡、I/O设备驱动等),被KVM置于一种受限制的CPU模式下运行
    • KVM:运行在内核空间,提供CPU和内存的虚拟化,以及客户端机的I/O拦截。Guest的I/O被KVM拦截后,交给QEMU处理。
    • QEMU:修改过的主KVM虚拟机的QEMU代码,运行在用户空间提供硬件I/O虚拟化,通过ioctl() /dev/kvm 设备和KVM进行交互

    • qemu-kvm:
    • 在Linux系统中,首先我们可以用modprobe系统工具去加载KVM模块,如果用RPM安装KVM软件包,系统会启动时自动加载模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有KVM模块是远远不够的,因为用户无法直接控制内核模块去做整改,还必须有一个用户空间的工具。关于用户空间的工具,KVM的开发者选择了已经成型的开源虚拟化软件QEMU。QEMU是一个强大的虚拟化软件,它可以虚拟不同的CPU架构。比如说在x86的CPU上虚拟一个Power的CPU,并利用它编译出可运行在Power上的程序。KVM使用了QEMU基于x86的部分,并稍加改造,形成可控制KVM内核模块的用户空间工具QEMU-KVM。所以Linux发行版中分为kernel部分KVM内核模块和QEMU-KVM工具。这就是KVM和QEMU的关系。


    • Libvirt/Virsh/Virt-manager:
    • 尽管QEMU-KVM工具可以创建和管理KVM虚拟机,Redhat为KVM开发了更通用的辅助工具libvirt。Libvirt是一套提供了多种语言接口的API,为各种虚拟化工具提供一套方便、可靠的编程接口,不仅支持KVM,而且运行XEN等其他虚拟机。使用libvirt,你只需要通过libvirt提供的函数连接到KVM或XEN宿主机,便可以用同样的命令控制不同的虚拟机了。Libvirt不仅提供API,还自带一套基于文本的管理虚拟机的命令virsh,你可以通过使用virsh命令来使用libvirt的全部功能。同时还能使用图形界面进行管理操作,其工具是Virt-manager。他是一套用python编写的虚拟机管理图形界面,用户可以通过它直观地操作不同的虚拟机。Virt-manager就是利用libvirt的API实现的


  4. KVM虚拟化技术类型:主机虚拟化
    1. 虚拟化技术的分类:
      • 完全虚拟化(Full virtualization):
      • 就是把环零中提供的指令和代码以软件模拟的方式,或者提供环负一的方式来解决。如果CPU硬件不支持虚拟化,也就意味着没有环负一,这时候就需要将环零对每一个虚拟机实例给它用软件进行模拟。如果支持环负一,那这事就容易解决,因为宿主机运行于环负一,而虚拟机内核运行于环零。这时候,我们就是不用为每一个虚拟机用软件模拟CPU来,这时候,我们就叫他完全虚拟化。

        这时候每一个虚拟机的内核无需了解,也不用知道自己运行在虚拟环境中的。


      • 半虚拟化(Para-Virutalization):
      • 如果说CPU没有环负一 ,或者环负一我们不用。让宿主机hypervisor运行在环零上,而后让每一个虚拟机中的getOS的内核知道自己运行在虚拟化出来的CPU之上。也就意味着我们把环三直接运行,环零当中的一部分指令,我们给它虚拟化,其它指令能够让CPU让宿主机之上的虚拟机的操作系统转换以后发现,自己运行在虚拟化当中,不能直接调用SYSTEM CALL 而是调用HYPER CALL,即底层的hypervisor的系统调用来解决问题,这种技术我们就叫他半虚拟化技术。Xen是最典型的半虚拟化技术。

        半虚拟化的性能非常接近底层平台性能。


      • 透传:
      • 虚拟机直接使用硬件设备,如有三个虚拟机,各自有一个硬件网卡,各自独立的硬件。(不宜迁移)


    2. 主机虚拟化有两大分类:
      • hypervisor是直接运行在物理硬件之上的KVM
      • hypervisor运行在另一个操作系统(运行在物理硬件之上)中QEMU
    3. 计算机五大部件:
      • CPU:时间复用
      • 用软件的方式来模拟一颗CPU来,将宿主机的时间片分给虚拟机上的CPU,虚拟杨将的获得的时间片整合成一个假的CPU,并在将所获得的时间分片,在次分给虚拟机内部的用户空间中的进程。

        如果不虚拟一颗CPU的话,就会出现虚拟主机的内核会认为自己就是去操作环零的系统指令,这就会导致关虚拟主机结果把物理主机都给关了

        虚拟CPU有两个功能:用户空间中非特权指令直接运行在环三上,特权指令在虚拟CPU上实现模拟成环零。虚拟机不应该去模拟环三,如果模拟了环三,那就变成模拟器了。

        硬件虚拟化:因为软件模拟环零会非常慢,所以当今都在硬件上实现。虚拟主机运行在环零上,宿主机运行在环-1上,环零是假的。环零中已经没有什么可以直接操纵的指令了。但是依旧可以调用硬件级某个指令,硬件自己就能触发模式转换,从虚拟机模式转换成物理机模式,由物理机来处理后续的操作,就不用一个模拟器来模拟环零。

      • 内存:按空间复用的方式来实现
      • 虚拟机也就是是获得内存分配的一些个线性地址空间,虚拟机要将这段空间当成真正的物理地址空间来用。

        MMU:转换线性地址和物理地址,为了加速这个转换速度,在CPU内部提供了一个缓存空间叫tlb+tag(标识哪个虚拟机):专门缓存这个转换的结果,并在以后用到就不用在转换了,能实现加速效果。

        shadowMMU:影子页表(直接映射,靠软件来实现的,性能低下),能实现虚拟机中的用户进程不在需要经过虚拟机本身的地址转换后,再在宿主机上进行一次转换而得到的物理地址。不需要在经过虚拟主机了。如今不在使用shadowMMU,而是在硬件级别(EPT/NPT)做到从虚拟主机内用户进程到宿主机真实物理主机间的对应关系。

      • 硬盘:
      • 也是虚拟的,硬盘可以被分区,每一个分区都是一个设备,文件系统是附着在硬盘之上的一个中间层。他又一次把空间做了虚拟,能够以文件所谓的方式进行存取,而不是按空间存取。

        硬盘和网卡用半虚拟化技术是非常好的。因为当虚拟机内的用户进程需要调用I/O时,就不需要调用两次驱动才能真正的使用上。在虚拟机层上只是转发

      • 网卡:按先后次序,时序复用
      • 虚拟出来一个网卡关联到物理网卡上,并且将物理网卡的MAC地址剥夺过来,给这个虚拟网卡用。然后每一个虚拟机到都连到虚拟网卡上(类似于交换机)。虚拟的网卡网络叫桥。

  5. 安装KVM所需组件:
  6. 
    ~]# grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
    判断CPU是否支持硬件虚拟化
    ~]# modprobe kvm
    支持的化,就可手动装载模块,装载完成后kernel就已经转换成hypervisor,可以使用kvm虚拟机
    ~]# yum install -y qemu-kvm libvirt virt-manager
    ~]# ln -sv /usr/libexec/qemu-kvm /usr/sbin/
    安装软件包,并创建链接才能使用qemu虚拟机。这里多此一步,redhat内部问题了。。
    ~]# systemctl start libvirtd.service
    开启libvirt
    ~]# systemct disabled NetworkManager
    ~]# systemct stop NetworkManager
    ~]# virsh iface-bridge eth0 br0
    ~]# systemctl restart network.service
    ~}# ip a
    ...
    6: br0: mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 00:0c:29:96:34:89 brd ff:ff:ff:ff:ff:ff
    inet 172.16.9.107/24 brd 172.16.9.255 scope global dynamic br0
    ...
    我们需要创建物理桥设备,可以使用virsh创建桥设备关联网卡到桥设备上
  7. 创建磁盘:
  8. 
    ~]# qemu-img create -f qcow2 -o preallocation=metadata,size=5G /root/kvm/arch.img
    Formatting '/root/kvm/arch.img', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off

    -o:稀疏格式的磁盘分配方法,给你这么多的大小磁盘,其实也只几M或几十K,当你使用时,在自动扩充。
    metadata:只预先分配原数据
    size=5G:分配一个最大5G的磁盘空间


    [root@localhost kvm]# ll -h arch.img
    -rw-r--r--. 1 root root 5.1G Jul 28 09:47 arch.img
    [root@localhost kvm]# du -sh arch.img
    1.3M arch.img
    这才是一开始分配的大小
  9. 创建虚拟机:
  10. 
    ~]# qemu-kvm  -name arch -m 512M -cpu host -smp 1,cores=1,socket=1 -drive file=/root/kvm/arch.img,if=virtio,media=disk,cache=writeback,format=qcow2 -drive file=/root/kvm/archlinux-2015.12.01-dual.iso,media=cdrom -boot order=dc,once=d -vnc :0

    -name:虚拟机名称
    -m:分配内存大小
    -cpu host:物理cpu叫啥虚拟机就叫啥
    -smp:创建几个cpu,几个核心,几个线程,不可超过宿主机的核心
    -drive:硬盘
    if-virtio:半虚拟化的方式运行,速度快些
    cache=writeback:先写到缓存,直接返回
    -boot order=dc:c表示第一块硬盘,d表示第一个光驱设备
    once=d,仅第一次启动时使用光盘启动
    -vnc :0 : 开启显示在哪个桌面上,0就是tcp的5900端口上,1就是5911端口,以此类推

    ~]# vncviewer :0 & //开启图形来查看虚拟机

    
    ~]# ssh -X root@172.16.9.9
    ~]# yum install vnc -y
    ~]# virt-manager //图形化管理虚拟机
    当打开时出现乱码时,说明字体没有安装
    yum install dejavu-lgc-sans-fonts 安装virt-manager的字体

  11. qeum-kvm去管理网络:
    1. 基于内核中的网络名称空间来创建多个网络。容器就是网络名称空间隔离来作为构建多个用户空间的几个核心技术之一。

      网卡是成对出现的,一半放在虚拟机上,一半放在虚拟交换机上。

    2. 虚拟网卡的创建方法:
    3. 
      ~]# ip link add vethx.1 type veth peer name vethx.2
      ~]# ip a
      ...
      6: vethx.2@vethx.1: mtu 1500 qdisc noop state DOWN qlen 1000
      link/ether aa:bd:30:f0:34:17 brd ff:ff:ff:ff:ff:ff
      7: vethx.1@vethx.2: mtu 1500 qdisc noop state DOWN qlen 1000
      link/ether 82:5e:fc:42:f7:45 brd ff:ff:ff:ff:ff:ff
      网络设备是对应的


      type veth:虚拟的以太网卡
      peer name: 另外一端的名称


      使用网络名称空间这种机制,来模拟一个用户空间。可当做一个虚拟路由来用

      
      ~]# ip netns help
      Usage: ip netns list
      ip netns add NAME
      ip netns set NAME NETNSID
      ...
      创建网络名称空间

      ~]# ip netns add route1
      ~]# ip link set dev vethx.2 netns route1
      创建一个名称空间,并将vethx.2的网卡设备放置在哪

      ~]# ip a
      ...
      7: vethx.1@if6: mtu 1500 qdisc noop state DOWN qlen 1000
      link/ether 82:5e:fc:42:f7:45 brd ff:ff:ff:ff:ff:ff link-netnsid 0
      网卡vethx.2就不在了

      ~]# ip netns exec route1 ip a
      在route1名称空间中执行命令,没有获取IP地址
      1: lo: mtu 65536 qdisc noop state DOWN
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      6: vethx.2@if7: mtu 1500 qdisc noop state DOWN qlen 1000
      link/ether aa:bd:30:f0:34:17 brd ff:ff:ff:ff:ff:ff link-netnsid 0

      ~]# ip netns exec route1 ip addr add dev vethx.2 10.1.1.2/24
      ~]# ip netns exec route1 ip link set dev vethx.2 up
      给ip地址并启动

      ~]# ip netns exec route1 ip a
      1: lo: mtu 65536 qdisc noop state DOWN
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      6: vethx.2@if7: mtu 1500 qdisc pfifo_fast state LOWERLAYERDOWN qlen 1000
      link/ether aa:bd:30:f0:34:17 brd ff:ff:ff:ff:ff:ff link-netnsid 0
      inet 10.1.1.2/24 scope global vethx.2
      valid_lft forever preferred_lft forever



      在主机上给vethx.1ip地址,并将其开启,尝试ping通网络名称route1中的ip地址
      ~]# ip addr add dev vethx.1 10.1.1.1/24
      ~]# ip link set dev vethx.1 up
      ~]# ping 10.1.1.2
      PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
      64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=0.182 ms
      64 bytes from 10.1.1.2: icmp_seq=2 ttl=64 time=0.048 ms
      ......

      Linux内核中有一个可以直接模拟出交换机的模块就是bridge

      
      [root@localhost kvm]# modinfo bridge
      filename:       /lib/modules/3.10.0-327.el7.x86_64/kernel/net/bridge/bridge.ko
      alias:          rtnl-link-bridge
      ...
      

      ~]# brctl show [help]
      bridge name bridge id STP enabled interfaces
      br0 8000.000c2957c3de yes eth0
      我们把一个接口关联到桥上,就相当于把这个接口插到这个交换机上。



    4. 创建桥:
    5. 
      ~]# brctl addbr br-int
      ~]# ip link set dev br-int up
      创建并激活虚拟交换机


      ~]# vim /etc/qemu-ifup
      #!/bin/bash

      bridge=br-int

      if [ -n "$1" ]; then
      ip link set $1 up
      sleep 1
      brctl addif $bridge $1
      [ $? -eq 0 ] && exit 0 || exit 1
      else
      echo "Please give a interface."
      exit 2
      fi

      ~]# bash -n /etc/qemu-ifup
      ~]# chmod +x /etc/qemu-ifup


      ~]# qemu-kvm -name c1 -m 256M -smp 1 -drive file=/root/kvm/cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:01 -net tap,script=/etc/qemu-ifup -vnc :0 -daemonize
      接下来给各个参数进行解释
    6. 网络选项:
    7. 
      -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
      为虚拟机创建一个网络接口,并将其添加至指定的VLAN

      • nic:为主机添加一个网卡
      • model=type:指明模拟出的网卡的型号:e1000(intel),virtio(半虚拟化)
      • macaddr=mac:指明mac地址:52:54:00 开头的地址

      • 
        -net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:
        通过物理的TAP网络接口连接至vlan n:创建一个二层接口的连接设备
      • script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup,配置当前网络接口
      • downscript=dfile:关闭虚拟机时要执行的脚本,默认为.etc.qemu-ifdown,没有也没事
      • ifname=NAME:自定义接口名称

      • 其它选项:

      • -daemonize:以守护进程运行
    8. 实例操作两台虚拟机进行通信:
    9. 
      ~]# qemu-kvm -name c1 -m 256M  -smp 1 -drive file=/root/kvm/cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:01 -net tap,script=/etc/qemu-ifup -vnc :0 -daemonize
      后台启动第一个虚拟机

      ~]# qemu-kvm -name c2 -m 256M -smp 1 -drive file=/root/kvm/cirros2.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:02 -net tap,script=/etc/qemu-ifup -vnc :1 -daemonize
      第二台

      建议:Network IO,Disk IO使用virtio,性能会有所提升

      
      ~]# brctl show
      bridge name bridge id STP enabled interfaces
      br-int 8000.8ea54e6a4470 no tap0
      tap1
      已经有两个网卡关联进来了,另一半在虚拟机上
  12. 虚拟机与宿主机间的网络配置方法:
    1. 仅主机模式:
    2. 仅主机模式只需要将宿主机上的桥设备(br-int)给上IP地址,与虚拟机上的地址在同一网段中,即可与宿主机进行通信


    3. NAT模式:
    4. NAT模式也就是需要将宿主机的核心转发功能打开,并且给上一条防火墙规则

      
      ~]# sysctl -w net.ipv4.ip_forward=1 
      ~]# iptables -t nat -A POSTROUTING -s 0.0.0.0/0 -o eth0 -j MASQUERADE
      源地址转换:当源地址为动态获取的地址时,MASQUERADE可自行判断要转换为的地址; 太过消耗资源,不宜使用

      ~]# ping 114.114.114.114
      PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
      64 bytes from 114.114.114.114: icmp_seq=1 ttl=83 time=29.8 ms
      64 bytes from 114.114.114.114: icmp_seq=2 ttl=78 time=29.6 ms
      ...

    5. 将虚拟机里的服务对外部开放:
    6. 
      ~]# iptables -t nat -A PREROUTING -d 172.16.9.115 -p tcp --dport 22222 -j DNAT --to-destination 10.1.1.2:22
      在宿主机上添加一条规则,即将虚拟机的ssh服务给打开

  13. 虚拟机自动获取ip地址:
  14. dnsmasq:轻量级的dns转发器和dhcp服务器。

    
    ~]# ip link add vethy.1 type veth peer name vethy.2

    创建一对网卡


    
    ~]# brctl addif br-int vethy.1
    ~]# ip link set dev vethy.1 up

    将其中一个网卡连接至桥上,并开开启,为的是专门为这个桥设备开启dhcp服务


    
    ~]# ip netns add route1
    ~]# ip link set dev vety.2 netns route1
    ~]# ip netns exec route1 ip addr add dev vethy.2 10.1.1.253/24
    ~]# ip netns exec route1 ip link set dev vethy.2 up

    创建一个网络名称空间,并将另一个端口放入其中,给上地址(做为dhcp的网关)


    
    ~]# ip netns exec route1 dnsmasq -i vethy.2 -F 10.1.1.20,10.1.1.30 -O 3,10.1.1.253
    ~]# ip netns exec route1 ip route add default via 10.1.1.254
    ~]# ps aux
    nobody 3761 0.0 0.0 15548 892 ? S 15:18 0:00 dnsmasq -i vethy.2 -F 10.1.1.20,10.1.1.30 -O 3,10.1.1.253
    root 5358 0.1 0.2 145380 5332 ? Ss 16:15 0:08 sshd: root@pts/0
    root 5362 0.0 0.1 116564 3292 pts/0 Ss+ 16:15 0:00 -bash
    root 5822 42.4 14.4 997740 294072 ? Sl 16:27 45:51 qemu-kvm -name centos1 -m 512M -smp 1 -drive file=/root/centos1.img
    ...

    ~]# ssh -p 22222 172.16.9.115
    ~]# ip a
    2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:00:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.26/24 brd 10.1.1.255 scope global dynamic eth0
    valid_lft 2786sec preferred_lft 2786sec
    inet6 fe80::5054:ff:fe00:2/64 scope link
    valid_lft forever preferred_lft forever

    此时将dnsmasq服务分配相应的地址池,指定对应的网关和端口,即可重启虚拟机的网络服务,就能获取到地址


  15. virsh(Virtual shell):
  16. 想要创建虚拟机实例,必须基于xml的配置文件实现。

    非使用virt家族创建的实例,virsh是查看不了的。如用qemu-kvm创建的虚拟机实例,virsh list -all就查看不到。

    1. virsh简单总结:
    2. 
      [root@node9 ~]# virsh help | grep  '^[[:space:]][A-Z].*'
      Domain Management (help keyword 'domain'):
      管理虚拟机的配置
      Domain Monitoring (help keyword 'monitor'):
      域监控,查看虚拟机相关信息
      Host and Hypervisor (help keyword 'host'):
      查看宿主机的相关信息
      Interface (help keyword 'interface'):
      管理接口,网桥设备
      Network Filter (help keyword 'filter'):
      网络过滤器,说白了就是帮我们去生成iptables规则的
      Networking (help keyword 'network'):
      管理虚拟化网络的,如果我们不指的话,会默认加入default网络中去
      Node Device (help keyword 'nodedev'):
      Secret (help keyword 'secret'):
      Snapshot (help keyword 'snapshot'):
      Storage Pool (help keyword 'pool'):
      存储池(多个卷组成)相关的
      Storage Volume (help keyword 'volume'):
      存储卷有关的(见下面解释)
      Virsh itself (help keyword 'virsh'):

      在云计算环境当中,每一个虚拟机都有两个存储设备。第一个存储设备是本地主机上为此虚拟机实例提供的磁盘映像文件。第二个通常是一个共享的SSCSI或SCSI接口的透传设备,让虚拟机直接访问这个物理设备,直接放在一个共享存储上。

      目的的为了,如果将来这个虚拟机实例崩了或虚拟机所在的宿主机崩了,那可以在另一个物理机上,基于同一个磁盘映像文件模版启动虚拟机实例,启动起来后,让这个虚拟机实例重新关联到这个外部的存储设备上来,那你以前存储的数据,还一样可以读取。磁盘映像文件本身不存放持久数据。


    3. virsh start|shutdown c1
    4. 开机或关机

    5. virsh destroy c1
    6. 相当于直接拨电源关机

    7. virsh dumxml c1
    8. virsh create|define /root/c2.xml
    9. 将虚拟机c1的配置文件信息导出,每一个虚拟机的配置信息都存储在/etc/libvirt/qemu/c1.xml,可以做成一个模版

      
      ~]# cp /etc/libvirt/qemu/c1.xml /root/c2.xml
      也可用dumpxml导出保存,我直接复制方便了
      ~]# vim /root/c2.xml
      修改其中的name,uuid,macaddr,img文件即可用此模版来创建更多的虚拟机
      ~]# virsh define /root/c2.xml
      创建虚拟机create创建并启动,define创建不启动,需手动启动
      ~]# virsh list --all
      Id Name State
      ----------------------------------------------------
      3 c1 running
      - c2 shut off

      ~]# virsh undefine +域名
      删除虚拟机
    10. virsh list --all
    11. 查看所有的虚拟机,关闭和运行的虚拟机,如果不加--all就是只查看运行的虚拟机

    12. virsh console c1 | virsh start c1 --console
    13. 连接虚拟机

    14. virsh suspend/resume +域名
    15. 挂起虚拟机,将虚拟机状态暂停于内存中,或继续运行暂停状态的虚拟机;挂起。宿主机重启就没了。

    16. virsh save/restore +域名 /FILENAME.img
    17. 
      [root@node9 ~]# virsh list --all
      Id Name State
      ----------------------------------------------------
      6 grachical running
      7 string running

      You have new mail in /var/spool/mail/root
      [root@node9 ~]# virsh save 6 /root/save.img
      Domain 6 saved to /root/save.img

      [root@node9 ~]# virsh list --all
      Id Name State
      ----------------------------------------------------
      7 string running
      - grachical shut off
      [root@node9 ~]# ls
      anaconda-ks.cfg centos.img cirros-0.3.3-x86_64-disk.img cirros1.img save.img string.xml
      [root@node9 ~]# virsh restore save.img
      Domain restored from save.img

      [root@node9 ~]# virsh list --all
      Id Name State
      ----------------------------------------------------
      7 string running
      8 grachical running

      保存虚拟机当前状态至文件中,或从指定文件恢复虚拟机:就是宿主机重启也可直接恢复的



    18. virsh attach-disk/detach-disk +域名

    19. 磁盘设备的热插拔



      加个磁盘前,先创建个磁盘映像文件来
      ~]# qemu-img create -f qcow2 -o preallocation=metadata,size=5G /root/disk.img
      ~]# virsh attach-disk string /root/img vdb
      此处可省略/dev/vdb 但不可与虚拟机中的磁盘名称相同,提前查看一下
      ~]# virsh console string
      # fdisk /dev/sdb
      ...
      创建分区
      # mkfs.ext4 /dev/vdb1
      格式化
      # mount /dev/vdb1 /mnt
      # cp /etc/fstab /mnt
      # ls /mnt
      fstab lost+found
      挂载成功并可使用了

      ~]# virsh domblklist string
      Target Source
      ------------------------------------------------
      vda /root/cirros1.img
      vdb /root/disk.img
      可显示string虚拟机上的磁盘设备

      如果不想用某个设备时,得先取消挂载,在进行移除磁盘
      # umount /mnt
      ~]# virsh detach-disk string vdb
      ~]# virsh domblklist string
      Target Source
      ------------------------------------------------
      vda /root/cirros1.img
      此时就被拆除了
    20. virsh attach-interface/detach-interface +域名 OPTIONS
    21. 网络接口设备的热插拔(无须事先创建网络接口设备)

      
      ~]# virsh domiflist string
      Interface Type Source Model MAC
      -------------------------------------------------------
      vnet1 bridge br0 virtio 52:54:00:30:4b:1c
      查看虚拟机上的网卡

      ~]# virsh attach-interface string bridge br0 --model virtio
      给string虚拟机添加一个桥接到宿主机上的br0的半虚拟化的网卡
      ~]# virsh domiflist string
      Interface Type Source Model MAC
      -------------------------------------------------------
      vnet1 bridge br0 virtio 52:54:00:30:4b:1c
      vnet2 bridge br0 virtio 52:54:00:22:13:7b
      添加成功,但是新添加的网卡没有地址,此时我们可使用让其自动获取地址

      # cirros-dhcpc up -i eth1
      udhcpc (v1.20.1) started
      Sending discover...
      Sending select for 172.16.9.110...
      Lease of 172.16.9.110 obtained, lease time 7200
      此时可获取地址172.16.9.110

      # ping 8.8.8.8
      PING 8.8.8.8 (8.8.8.8): 56 data bytes
      64 bytes from 8.8.8.8: seq=1 ttl=38 time=533.930 ms
      64 bytes from 8.8.8.8: seq=4 ttl=38 time=587.841 ms
      ...


      如果想要删除此网卡的话,可如下操作:
      ~]# virsh detach-interface string bridge --mac 52:54:00:22:13:7b
      Interface detached successfully

    22. 监控:
    23. 
      ~]# virsh help 
      ...
      Domain Monitoring (help keyword 'monitor'):
      domblkerror Show errors on block devices
      domblkinfo domain block device size information
      domblklist list all domain blocks
      domblkstat get device block stats for a domain
      domcontrol domain control interface state
      domif-getlink get link state of a virtual interface
      domifaddr Get network interfaces' addresses for a running domain
      domiflist list all domain virtual interfaces
      domifstat get network interface stats for a domain
      dominfo domain information
      dommemstat get memory statistics for a domain
      domstate domain state
      domstats get statistics about one or multiple domains
      domtime domain time
      list list domains
      ...

      ~]# virsh dominfo string
      Id: 7
      Name: string
      UUID: 785cf31c-946d-477e-972a-34ec24e22248
      OS Type: hvm
      State: running
      CPU(s): 1
      CPU time: 1084.8s
      Max memory: 262144 KiB
      Used memory: 262144 KiB
      Persistent: no
      Autostart: disable
      Managed save: no
      Security model: selinux
      Security DOI: 0
      Security label: system_u:system_r:svirt_t:s0:c312,c484 (permissive)
      显示string虚拟机的信息


      ~]# virsh domstate string
      running
      查看虚拟机运行状态

      如果想脱离控制台(console)的话,control+]

posted @ 2017-08-09 00:54  dance_man  阅读(470)  评论(0编辑  收藏  举报