章工运维 章工运维
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

章工运维

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • linux

  • windows

  • 中间件

  • 网络

  • 安全

  • 存储

  • 防火墙

  • 数据库

  • 系统

    • vmware

    • ftp

    • nexus

    • harbor

    • confluence&jira

    • loki

    • sonarqube

    • svn

    • other

    • openldap

    • influxdb

    • wordpress

    • kvm

      • centos7安装kvm虚拟机
      • argocd

      • jfrog

      • nextcloud

      • RustDesk

      • mail

      • ghost

    • docker

    • other

    • 监控

    • 运维
    • 系统
    • kvm
    章工运维
    2023-08-20
    目录

    centos7安装kvm虚拟机

    # 1、概述

    虚拟化在现实中越来越普遍,如今设备的配置越来越高,如何高效方便的尽可能利用设备的能力是一个很值得研究的探讨的,虚拟化应运而生,伴随着云计算的普及,虚拟化的应用又上了一个新的高度。

    虚拟化这个概念最早在1959年被提出,20世界60年代首次出现了虚拟内存和虚拟机,经过一段时期的发展,1998年Vmware公司成立,并在次年推出了基于X86平台的商业虚拟化软件,从此虚拟机进入了一个新的发展阶段。

    2003年 xen面世,同一年微软收购了xen获得了虚拟化技术。

    随后oracle,redhat,思科,惠普大厂商都在虚拟化领域有自己的产品,虚拟化领域百家齐放。

    虚拟化发展经历过数十年的时间,出现过各种各样虚拟化的实现方式,目前主流的大概分为两种:

    • VMM直接运行在硬件平台上,控制所有硬件并管理客户操作系统。
    • VMM运行在一个传统的操作系统中,而客户机操作系统运行在传统的操作系统中,KVM就是这种实现方式。

    根据虚拟化的程度和实现方式,又可以分为完全虚拟化、半虚拟化等等,这里我们不深入探讨这些问题。

    KVM诞生于2006年,由以色列的 Qumranet 组织开发,并且将源代码贡献给了开源社区。2007年linux内核第一次包含了KVM,2008年红帽收购了Qumranet并接手了KVM,2009年在红帽5.4版本中添加了KVM,此后从Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。

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

    实际上KVM仅仅是内核中的一个叫kvm.ko用于管理虚拟CPU和内存的模块,而其他诸如磁盘IO的虚拟化则交由其他软件实现,QEMU就负责硬件虚拟化,在早期QEMU是独立发展的,后面因为各种原因分离出了一个版本专用于KVM,被称为qemu-kvm一直发展至今。

    早期虚拟化管理是一个非常复杂的过程,为了解决管理上的问题,redhat公司开发了一个叫Libvirt的虚拟机管理工具,并且也贡献给了开源社区,Libvirt提供了一个通用、稳定、安全、高效的管理工具,并且支持了远程操作,也提供不同语言的SDK。事实上Libvirt不仅仅能管理KVM,也能管理其他的虚拟机,详细可以查看官网的文档。

    KVM在虚拟机领域是一个比较新的成员,如今遇上了云计算的潮流,目前主流的云计算厂商例如AWS、阿里云等都采用了KVM的虚拟机方案,基于云计算的概念也发展出了诸如OpenStack的开源的云计算方案。

    环境信息

    系统 cpu 内存 硬盘
    centos7.6 8C 8G 500G

    # 2、环境检测

    KVM基于X86虚拟化扩展技术的虚拟机软件,所以需要CPU支持 Intel VT 或者 AMD-V

    cat /proc/cpuinfo | egrep 'vmx|svm'

    如果有返回信息,这说明当前CPU支持并且开启了虚拟化扩展

    # 3、kvm环境安装

    一套完成的KVM虚拟机大致包含如下软件:

    • qemu-kvm 主要的KVM程序包
    • libvirt C语言工具包,提供libvirt服务
    • virt-install 基于libvirt服务的虚拟机创建命令
    • bridge-utils 创建和管理桥接设备的工具
    • python36-libvirt python3客户端
    • virt-manager GUI虚拟机管理工具
    • virt-top 虚拟机统计命令
    • virt-viewer GUI连接程序,连接到已配置好的虚拟机
    • libvirt-client 为虚拟客户机提供的C语言工具包

    其中qemu-kvm、libvirt、virt-install、bridge-utils这四个软件我们必须安装。其他的按需安装。

    因为我们的宿主机是centos7.6最小化安装的,所以就不安装GUI管理工具了

    yum install -y qemu-kvm libvirt virt-install bridge-utils # 安装 systemctl start libvirtd # 启动libvirtd systemctl enable libvirtd # 设置开机自启动libvirtd

    执行以上操作之后虚拟机环境就安装完成了。建议安装完成之后重启服务器,并且在重启之后检查是否正确加载了内核模块

    [root@localhost ~]# lsmod | grep kvm kvm_intel 183621 0 kvm 586948 1 kvm_intel irqbypass 13503 1 kvm

    如上,说明正确加载了内核模块

    建议使用阿里云的repo仓库。虚拟机安装也建议使用yum安装,如果需要编译安装可以参考官方文档

    # 4、虚拟机网络配置

    # 4.1、虚拟机网络模式

    安装好kvm之后,默认会创建一个default的网络,设备名称为virbr0,我们先看一下这个网络的信息
    [root@localhost ~]# virsh net-list --all
     Name                 State      Autostart     Persistent
    ----------------------------------------------------------
     default              active     yes           yes
    如上virsh net-list --all命令会列出所有的网络,如果不加--all参数只会列出active状态的网络。
    [root@localhost ~]# virsh net-dumpxml default
    <network>
      <name>default</name>
      <uuid>3eaed894-4b0a-4de1-9177-7b56bff63c80</uuid>
      <forward mode='nat'>
        <nat>
          <port start='1024' end='65535'/>
        </nat>
      </forward>
      <bridge name='virbr0' stp='on' delay='0'/>
      <mac address='52:54:00:f5:32:49'/>
      <ip address='192.168.122.1' netmask='255.255.255.0'>
        <dhcp>
          <range start='192.168.122.2' end='192.168.122.254'/>
        </dhcp>
      </ip>
    </network>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    virsh net-dumpxml default 命令dump出default的xml的配置信息,在kvm中各种配置信息都是使用xml来定义的。从dump出来的信息中我们看到这个网络类型为nat,并且定义了网段信息,dhcp可用IP范围等信息。

    在kvm中,可以定义不同的网络,主流的是nat和bridge,kvm常用的网络类型大致有如下几种:

    • nat模式:在nat模式中,KVM虚拟机之间需要配置与nat对应网段的信息,挂载到同一个设备下的kvm虚拟机完全可以通讯,KVM和虚拟机可以通讯,但是如果想要将kvm虚拟机的服务发布出去,则需要宿主机做DNAT端口映射到对应的虚拟机。nat模式也是KVM默认的模式
    • bridge桥接模式:在桥接模式中,kvm可以和宿主机在同一个网段,虚拟机网卡配置和宿主机同网段的IP信息,在同一个网桥下的虚拟机可以互相通讯。网桥是二层设备,通过mac地址通讯,所以不允许配置IP,这个概念在往后的跨物理机的KVM互通配置中非常重要。
    • 路由模式:路由模式中虚拟交换机连接到主机的物理网络,可以在不适用NAT的情况下传输流量。虚拟交换机检查所有的流量,通过网络包做出路由决策,在此模式中所有的虚拟机都位于自己的子网中,通过交换机进行路由。
    • 隔离模式:在隔离模式中,连接到虚拟交换机中的虚拟机可以互相通讯,也可以和宿主机通讯,但是不会传到宿主机以外的物理机上,也无法从物理机外部获取流量,被完全隔离在虚拟网络中。

    网络也是一个比较复杂的东西,如果想要了解更多的信息,可以查阅libvirt的官网关于网络定义的说明,https://libvirt.org/formatnetwork.html

    在我的实际的使用中,最常用的就是路由模式了。

    在很多的教程中,都使用了手动编辑网桥的配置文件来创建一个linux网桥。

    [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 
    TYPE=Bridge
    BOOTPROTO=dhcp
    DEFROUTE=yes
    PEERDNS=yes
    PEERROUTES=yes
    IPV4_FAILURE_FATAL=no
    NAME=br0
    DEVICE=br0
    ONBOOT=yes
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    如上,通过手动创建一个br0网桥,然后在物理接口配置文件里将物理机接口挂到这个虚拟网桥中

    [root@KVM-01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp4s0f0 TYPE=Ethernet BOOTPROTO=dhcp DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no NAME=enp4s0f0 UUID=ee1e24a8-a5fd-44f4-bb7a-159c84da9447 DEVICE=enp4s0f0 ONBOOT=yes BRIDGE=br0

    如上的物理网卡配置中BRIDGE=br0配置了将这个物理接口挂载到了br0网桥下,并且通过DHCP获取IP地址。

    最终的结果

    [root@KVM-01 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    2: enp4s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
        link/ether 80:c1:6e:74:f1:78 brd ff:ff:ff:ff:ff:ff
    3: enp4s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
        link/ether 80:c1:6e:74:f1:79 brd ff:ff:ff:ff:ff:ff
    4: enp4s0f2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
        link/ether 80:c1:6e:74:f1:7a brd ff:ff:ff:ff:ff:ff
    5: enp4s0f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
        link/ether 80:c1:6e:74:f1:7b brd ff:ff:ff:ff:ff:ff
    6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
        link/ether 80:c1:6e:74:f1:78 brd ff:ff:ff:ff:ff:ff
        inet 172.16.8.111/16 brd 172.16.255.255 scope global dynamic br0
           valid_lft 215588sec preferred_lft 215588sec
    7: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
        link/ether 52:54:00:a3:1c:78 brd ff:ff:ff:ff:ff:ff
        inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
           valid_lft forever preferred_lft forever
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    我们可以看到,br0设备获取到了IP地址172.16.8.111,并且enp4s0f0 的master为br0,state为UP。

    这种方式的配置好像是对的,但是..在实际的使用中会发现一个问题:

    在如上这种手动配置的网桥中,如果重启了宿主机的网络之后,虚拟机的网络会中断,无法和其他设备通讯,并且需要通过virsh shutdown 和virsh start命令重启虚拟机之后才会恢复。

    这肯定不是我们想要的,我们需要重启宿主机网络之后并不影响KVM虚拟机的网络。

    在KVM中已经提供了网络管理工具,通过KVM提供的工具就可以解决这个问题。

    # 4.2、创建xml

    我们以创建一个route模式的bro为例创建一个虚拟网络。

    <network>
      <name>br0</name>
      <bridge name="br0" />
      <forward mode="route" />
      <ip address="192.168.8.1" netmask="255.255.255.0"/>
    </network>
    
    1
    2
    3
    4
    5
    6

    如上的xml文件中,我们配置了名称为br0并且设备名称也为br0网络

    • br0 配置kvm的网络名称
    •  配置了网络设备的名称
    •  指定为route模式
    •  给这个br0设备配置一个出口的IP

    在路由模式中,必须而且仅有一个出口的IP信息,可以认为是虚拟网络的出口网关,通过这个IP可以和宿主通讯。同时这个IP也属于宿主机,也就是说通过这个IP可以直接访问到宿主机本身,这个概念对我们以后的跨物理机管理也非常重要。

    在上面的xml我们并没有定义mac地址等,这些信息kvm会自动补上,无需当心,手动定义可能还会出现mac地址冲突等问题。

    # 4.3、定义网络

    [root@localhost ~]# virsh net-define net.xml  # 从xml文件定义网络br0
    Network br0 defined from net.xml
    [root@localhost ~]# virsh net-list --all  # 查看所有的网络
     Name                 State      Autostart     Persistent
    ----------------------------------------------------------
     br0                  inactive   no            yes
    [root@localhost ~]# virsh net-start  br0 # 启动网络br0
    Network br0 started
    [root@localhost ~]# virsh net-autostart  br0 # 开机自启动br0
    Network br0 marked as autostarted
    [root@localhost ~]# virsh net-dumpxml  br0 # 查看br0的详细配置
    <network>
      <name>br0</name>
      <uuid>3dcfb28b-d434-4293-992e-c8adba739d1a</uuid>
      <forward mode='route'/>
      <bridge name='br0' stp='on' delay='0'/>
      <mac address='52:54:00:65:75:1e'/>
      <ip address='192.168.8.1' netmask='255.255.255.0'>
      </ip>
    </network>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    上面的一系列操作中,我们定义并且启动了br0网络,在xml的文件中我们并没有配置mac地址信息,在dump出来的xml有了mac地址的信息,这个是libvirt自动帮我们加上去的。

    我们看看系统的网络设备信息

    [root@localhost ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:e0:81:d3:57:ad brd ff:ff:ff:ff:ff:ff
        inet 172.16.8.189/16 brd 172.16.255.255 scope global noprefixroute dynamic enp3s0
           valid_lft 172633sec preferred_lft 172633sec
        inet6 fe80::3398:7712:b754:1d3b/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    3: enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
        link/ether 00:e0:81:d3:57:ac brd ff:ff:ff:ff:ff:ff
    6: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 52:54:00:65:75:1e brd ff:ff:ff:ff:ff:ff
        inet 192.168.8.1/24 brd 192.168.8.255 scope global br0
           valid_lft forever preferred_lft forever
    7: br0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000
        link/ether 52:54:00:65:75:1e brd ff:ff:ff:ff:ff:ff
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    从上面信息中我们看到了br0已经启动了,并且配置了192.168.8.1的IP地址。

    我们再来查看一下系统的路由信息

    [root@localhost ~]# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         172.16.0.8      0.0.0.0         UG    100    0        0 enp3s0
    172.16.0.0      0.0.0.0         255.255.0.0     U     100    0        0 enp3s0
    192.168.8.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
    
    1
    2
    3
    4
    5
    6

    系统自动为我们加上了一条到192.168.8.0/24网段的路由信息,这个网段的流量发送到接口br0上。

    我们再来说说这个br0配置的192.168.8.1这个IP,我们创建了一台虚拟机,并且将虚拟机加入到br0的网络中,虚拟机只要配置192.168.8.0/24网段的IP就能与外界通讯。

    外部流量到达宿主机,宿主机通过路由表选择将流量发到br0中,br0是网桥,在网桥内部通过mac地址将数据包发送给指定的KVM虚拟机,而对于虚拟机来说,此时的出口就应该需要指定到192.168.8.1 即可将流量发到br0上,然后再由宿主机路由表选择将包发到对应的接口,完成整个通讯的过程。

    因为192.168.8.1这个IP属于宿主机,所以外部能到达192.168.8.1就能直接访问到宿主机本机。

    # 4.4、跨宿主机KVM互通

    同一个宿主机内的kvm可以通讯了,那么跨宿主机的KVM如何通讯呢?

    br0是一个二层的设备,靠mac地址通讯,所以只能br0能学习到mac就可以通讯。那么怎么学习到跨宿主机的KVM的mac地址呢?

    在我实际的经验中,我通常借助内网物理交换机。服务器上有多个网口,将其中一个物理网口加入到br0网络,然后再将这个网口通过网线接入到物理交换机中,每一台宿主机都这样配置,就可以将br0通过物理交换机级联起来,从而打造了一个跨宿主机的二层交换环境,这样所有的kvm虚拟机就可以互通有无了。

    kvm的网络是建立在linux的虚拟网桥上,如果想要更多的功能可以使用Open vSwitch构建一个更强大的虚拟网络。

    # 5、安装虚拟机

    解决了网络问题之后我们开始安装虚拟机,这里我们演示centos 7.6和windows 2012 R2的安装。

    安装前要设置环境语言为英文LANG="en_US.UTF-8",如果是中文的话某些版本可能会报错。CentOS 7 请修改/etc/locale.conf。

    # 5.1、linux虚拟机安装

    [root@localhost centos7]# virt-install --virt-type=kvm --os-type=linux --os-variant=centos7.0 --name=centos7  --vcpus=2 --ram 4096 \
    > --disk path=/vm/disk/centos7/vda.qcow2,bus=virtio,cache=none,size=40  \
    > --cdrom /vm/iso/CentOS-7.6-x86_64-Minimal-1810.iso  \
    > --network bridge=br0,model=virtio --noautoconsole  \
    > --vnc --vncport=5901 --vnclisten=0.0.0.0
    
    Starting install...
    Allocating 'vda.qcow2'                                                       40 GB  00:00:00
    Domain installation still in progress. You can reconnect to 
    the console to complete the installation process.
    
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    如上,安装了一个centos系统,在安装的参数中:

    • --virt-type:指定虚拟机的类型,上文中我们说到libvirt不仅能管理kvm,还能管理其他的虚拟机。
    • --os-type:指定安装的系统类型linux或者windows
    • --os-variant:针对不同的操作系统进一步优化虚拟机的配置,这个参数是可选的,而且不一定需要和--os-type一起使用。具体的选值可以通过osinfo-query os查看。
    • --name:指定一个名称方便虚拟机管理,这个名称要全局唯一。
    • --vcpus:配置虚拟机的虚拟CPU数量
    • --ram:配置虚拟机的虚拟内存,单位为:M
    • --disk:指定虚拟磁盘,其中:path:指定磁盘的路径,需要绝对路径。bus:配置总线类型为virtio。cache:配置缓存模式。size:指定虚拟磁盘大小,单位为:G。
    • --cdrom:指定光驱文件,系统从光驱读取安装。
    • --vnc:配置使用VNC
    • --vncport:配置VNC的端口
    • --vnclisten:配置VNC监听的IP
    • --network:配置网络设备,其中:bridge:指定挂载到哪个网桥设备中。model:网卡模式。
    • --noautoconsole:不自动试图连接到客户机控制台

    创建好了虚拟机之后,可以通过VNC客户端链接到宿主机IP:vncport进行正常的系统安装。

    在安装完成之后点击REBOOT按钮之后并不会重启虚拟机,而是会直接关闭虚拟机,需要到宿主机中启动虚拟机。

    当然,如果你不想使用VNC图形化安装系统,你可以删除VNC的相关参数并且修改cdrom为location,添加--graphics none --extra-args='console=ttyS0' --force参数就可以使用文字界面安装系统。

    [root@localhost centos7]# virt-install --virt-type=kvm --os-type=linux --os-variant=centos7.0 --name=centos7  --vcpus=2 --ram 4096 \
    > --disk path=/vm/disk/centos7/vda.qcow2,bus=virtio,cache=none,size=40  \
    > --location /vm/iso/CentOS-7.6-x86_64-Minimal-1810.iso  \
    > --network bridge=br0,model=virtio \
    > --graphics none --extra-args='console=ttyS0' --force
    
    Starting install...
    Retrieving file .treeinfo...                                                       |  354 B  00:00:00
    Retrieving file vmlinuz...                                                         | 6.3 MB  00:00:00
    Retrieving file initrd.img...                                                      |  50 MB  00:00:00
    Allocating 'vda.qcow2'                                                             |  40 GB  00:00:00
    Connected to domain centos7
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    安装完成之后配置好网络信息即可。

    # 5.2、windows虚拟机安装

    [root@localhost iso]# virt-install --virt-type=kvm --os-type=windows \
    > --os-variant=win2k12r2 --name=windows2012r2 --vcpus=4 --ram 4096  \
    > --disk path=/vm/disk/windows2012r2/c.qcow2,format=qcow2,bus=virtio,cache=none,size=40 \
    > --cdrom /vm/iso/cn_windows_server_2012_r2_vl_x64_dvd_2979220.iso \
    > --disk path=/vm/iso/virtio-win-0.1.173_amd64.vfd,device=floppy  \
    > --vnc --vncport=5902 --vnclisten=0.0.0.0 \
    > --network bridge=br0,model=virtio --noautoconsole
    
    Starting install...
    Allocating 'c.qcow2'                                                          |  40 GB  00:00:02     
    Domain installation still in progress. You can reconnect to 
    the console to complete the installation process.
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    windows安装参数和linux的差不多,在windows中,我们多加了一个--disk path=/vm/iso/virtio-win-0.1.173_amd64.vfd,device=floppy,此参数加载了一个软盘,指定了一个vfd软盘镜像。

    和linux安装一样,我们使用了virtio,在linux中自带了virtio的驱动,所以我们并不需要额外在安装驱动,而windows镜像是不带virtio驱动的,如果没有加载virtio驱动,那么在windows的安装程序中是无法识别磁盘的。在此处加载了一个virtio驱动软驱,然后在安装程序中磁盘分区页面搜索加载磁盘驱动即可。

    特别说明的是,不仅仅要准备virtio的软驱镜像,还需要下载一个完整的virtio的iso光驱镜像,系统安装好之后需要挂载到系统中安装virtio驱动,否则网卡和一些主板的驱动将无法识别。

    Virtio是一种半虚拟化的解决方案,能够大幅提高虚拟机的I/O性能。virtio驱动下载页面 (opens new window)

    # 6、虚拟机管理命令

    libvirt提供了一个命令行的管理客户端virsh,通过此客户端工具可以方便的管理kvm虚拟机。

    可以通过virsh --help 获得帮助信息,帮助信息是我们学习客户端的重要方式。本篇中介绍一些常用的虚拟机管理。

    # 6.1、虚拟机生命周期管理

    
    [root@localhost disk]# virsh list --all # 查看所有虚拟机,如果不加`--all`则查看正在运行中的虚拟机
     Id    Name                           State
    ----------------------------------------------------
     -     centos7                        shut off
    
    [root@localhost disk]# virsh start centos7 # 启动`centos7`虚拟机
    Domain centos7 started
    
    [root@localhost disk]# virsh shutdown centos7 # 关闭`centos7`虚拟机
    Domain centos7 is being shutdown
    
    [root@localhost disk]# virsh shutdown centos7 # 关闭`centos7`虚拟机
    Domain centos7 is being shutdown
    
    [root@localhost disk]# virsh destroy centos7 # 销毁`centos7`虚拟机,相当于物理机中的强制断电,既然是销毁,就必须要在运行的状态下才能销毁
    Domain centos7 destroyed
    
    [root@localhost disk]# virsh autostart centos7 # 开机自启动`centos7`,在宿主机重启的时候自动启动虚拟机,前提条件是`libvirtd`也必须设置为开机自启动
    Domain centos7 marked as autostarted
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    # 6.2、虚拟机信息管理

    上面说到,libvirt通过xml来定义虚拟机,我们也可以通过编辑xml来修改虚拟机的信息。

    [root@localhost ~]# virsh define /root/kvm.xml  # 从xml文件定义虚拟机,就相当于创建虚拟机
    Domain centos7 defined from /root/kvm.xml
    
    [root@localhost ~]# virsh undefine centos7 # 取消定义`centos7`虚拟机,必须要在关机的状态下才能undefine
    Domain centos7 has been undefined
    
    [root@localhost ~]# virsh define /root/kvm.xml  # 从xml文件定义虚拟机,就相当于创建虚拟机
    Domain centos7-base defined from /root/kvm.xml
    [root@localhost disk]# virsh dumpxml centos7 # 导出 `centos7` 虚拟机的xml信息,可以通过重定向将信息写入到其他文件中
    <domain type='kvm'>
      <name>centos7</name>
      <uuid>34a3f666-c4af-405a-8921-ffc5d928ae92</uuid>
      <memory unit='KiB'>4194304</memory>
      <currentMemory unit='KiB'>4194304</currentMemory>
      <vcpu placement='static'>2</vcpu>
        .......
      </devices>
    </domain>
    
    [root@localhost disk]# virsh edit centos7 # 编辑 `centos7` 虚拟机信息,编辑操作和vim操作一致,有一些唯一值信息比如`uuid`等不允许编辑。
    # 在保存退出时 libvirt会检查编辑后的xml是不是符合规定,如果不符合将不会被保存
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    微信 支付宝
    上次更新: 2023/08/21, 07:41:35

    ← wordpress迁移问题总结 argocd部署→

    最近更新
    01
    shell脚本模块集合
    05-13
    02
    生活小技巧(认知版)
    04-29
    03
    生活小技巧(防骗版)
    04-29
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 | 点击查看十年之约 | 鄂ICP备2024072800号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式