zoukankan      html  css  js  c++  java
  • 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
     
  • 相关阅读:
    linux 配置nginx+php-cgi
    有个故事
    2014短学期实习报告
    快速排序
    C++之共用体
    不能言传,等于不会
    java 动态绑定
    编程的理论深度
    Java 多客户端版 2048 源码
    热河看待苦难
  • 原文地址:https://www.cnblogs.com/pipci/p/13021390.html
Copyright © 2011-2022 走看看