Think Deep,Work Lean

kvm安装及虚拟机创建

Posted on By zack

系统环境

Vmware Workstation
系统版本:CentOS Linux release 7.5.1804 (Core)
内存:4GB
额外:勾选vt-x
bonding
注意:vmare的网关为x.x.x.2,所以nameserver也要设置为x.x.x.2

查看是否支持硬件虚拟化

确定机器有VT,如果flags: 里有vmx 或者svm就说明支持VT;如果没有任何的输出,说明你的cpu不支持,将无法使用KVM虚拟机。

grep -E -o '(vmx|svm)' /proc/cpuinfo

确保BIOS里开启VT:

Intel(R) Virtualization Tech [Enabled]

查看内核中是否有KVM模块

#lsmod|grep kvm
kvm_intel             148081  0
kvm                   461126  1 kvm_intel

出现这个结果表示kvm模块已经加载,kvm是linux内核中的一个模块,无需安装只需加载,若未出现上述结果,可直接从内核加载,加载命令如下

# modprobe kvm
# modprobe kvm_intel

桥接网络

  1. 为什么要桥接网络?
    因为虚拟机中网络,我们一般都是和公司的其他服务器是同一个网段,所以我们需要把KVM服务器的网卡配置成桥接模式。这样的话KVM的虚拟机就可以通过该桥接网卡和公司内部分其他服务器处于同一网段。

  2. 为什么将本地网卡加入到网桥后,本地网卡无需IP?网桥如何配置IP
    将已有的物理网卡添加到网桥,此时物理网卡eth0工作于混杂模式,所以不需要IP地址,因为网桥是工作在链路层的。br0就提供了IP地址,用来模拟原来的物理网卡的访问接口.

首先安装网桥工具

yum install bridge-utils -y

方法一:修改配置文件,永久生效

  1. 若未做bond,则直接修改网卡配置 复制ifcfg-eth0 为 ifcfg-br0,并将ifcfg-br0改为如下配置
    tee /etc/sysconfig/network-scripts/ifcfg-br0 <<EOF
    TYPE=Bridge
    BOOTPROTO=static
    DEFROUTE=yes
    PEERDNS=yes
    PEERROUTES=yes
    IPV4_FAILURE_FATAL=no
    NAME=br0
    DEVICE=br0
    ONBOOT=yes
    IPADDR=192.168.56.13
    NETMASK=255.255.255.0
    GATEWAY=192.168.56.2
    EOF
    

    原网卡ifcfg-eth0只保留如下配置,其他都注释掉:

    tee /etc/sysconfig/network-scripts/ifcfg-eth0<<EOF
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    BRIDGE=br0
    EOF
    
  2. 若做了bond,则做如下配置,至于bond的配置请看往期博客,bond的配置
    tee ifcfg-bond0 <<EOF
    DEVICE=bond0
    TYPE=Ethernet
    NAME=bond0
    BONDING_MASTER=yes
    BOOTPROTO=none
    BRIDGE=br0
    ONBOOT=yes
    BONDING_OPTS="mode=5 miimon=100"
    EOF
    

重启网卡

systemctl restart network

方法二:

临时生效,通过ifconfig命令配置网卡及网桥参考往期博客,网桥及路由配置

安装kvm及libvirt

参考

libvirt是管理虚拟机的API库,不仅支持KVM虚拟机,也可以管理Xen等方案下的虚拟机

yum install -y kvm qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install bridge-utils
  • kvm基础包
  • qemu-kvm: 主要的kvm程序包
  • pyhon-virtinst: 创建虚拟机所需要的命令行工具和程序库
  • libvirt: C语言工具包,提供libvirt服务
  • virt-manager: 图形界面GUI管理工具
  • libguestfs* : virt-cat等命令的支持软件包
  • virt-install: 基于libvirt服务的虚拟机创建命令
  • birdeg-utils: 创建和管理桥接设备的工具

启动kvm

systemctl start libvirtd  &&  systemctl enable libvirtd

创建虚拟机

首先安装前要设置环境语言为英文LANG=”en_US.UTF-8”,

#cat /etc/locale.conf
LANG="en_US.UTF-8"

通过网络在文本模式上安装GuestOS,虚拟机的映像默认放置在/var/lib/libvirt/images作为存储池

本地console访问虚机

如下是利用本地的ISO文件创建的虚拟机

virt-install --name centos7-zk-node3 --disk path=/var/lib/libvirt/images/centos7-zk-node3.img,size=50 --ram 8192 --vcpus 4 --os-type linux --os-variant rhel7 --network bridge=br0 --graphics none --console
pty,target_type=serial --location /sdc/oldken/rhel-server-7.2-x86_64-dvd.iso
--extra-args 'console=ttyS0,115200n8 serial'  

上面指定的相关参数含义如下:

--name  指定虚拟机的名称
--memory  指定虚拟机内存
--disk的内存量path = xxx,size = xxx
'path ='⇒指定虚拟机
'size ='⇒指定虚拟机的磁盘大小
--vcpus 指定虚拟CPU
--os-type 指定GuestOS 的类型
--os-variant 指定GuestOS的类型 'fedora18', 'rhel7', 'winxp' - osinfo-query os 该命令可查看所有供选择的
--network 指定虚拟机的网络类型
--graphics 指定图形的类型。如果设置为“无”,则意味着非图形。
--console 指定控制台类型
--location 指定安装的位置,可直接指定本地镜像路径,尽量使用本地镜像,网络镜像本地测试未通过,测试通过的为"--location=/tmp/CentOS-7-x86_64-Minimal-1804.iso"; 网络镜像 --location 'http://mirrors.aliyun.com/centos/7/os/x86_64/'
--extra-args 指定在内核中设置的参数

如填写感叹号项,时区、语言、存储等,按照提示安装

安装成功后进入会直接进入刚创建的虚机,需设置IP,方便之后ssh登陆。由于网络是桥接模式,故将IP设置为跟宿主机同网段,NETMASK及GATEWAY与宿主机设置成一样,如下:

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
UUID=a75fcb3e-4f10-4ab1-bafa-45a3549a13b4
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.56.21
NETMASK=255.255.255.0
GATEWAY=192.168.56.2
DNS1=192.168.56.2

重启网络后就可以ssh登陆了

[root@localhost ~]# who
root     ttyS0        2018-06-01 15:30
root     pts/0        2018-06-01 15:26 (192.168.56.11)

tty用户只能登出,若要是回到宿主机,要在pts端exit才行。
同样,关闭selinx、firewalld,然后制作快照

[root@localhost ~]# virsh snapshot-create kvm-centos7-node2
已生成域快照 1527863380

查看生成的快照xml文件

[root@localhost libvirt]# cat /var/lib/libvirt/qemu/snapshot/kvm-centos7-node2/1527863380.xml
....
  </disks>
  <domain type='kvm'>
    <name>kvm-centos7-node2</name>
    <uuid>37ddb449-eed4-4503-8a20-fa213dd3d20a</uuid>
    <memory unit='KiB'>524288</memory>
    <currentMemory unit='KiB'>524288</currentMemory>
    <vcpu placement='static'>1</vcpu>
    <resource>
....

vnc访问虚机

virt-install --virt-type kvm --name zk-easyops-1 --ram 16384 --vcpus 16 --cdrom=/sdb/centos66.iso --disk path=/sdb/zk-easyops-1.img,size=150 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --os-type=linux

输入该命令后,会直接在后台运行,此时会提示你用virt-viewer,此时要知道你用的是vnc,因此主要目标是找到vnc的端口,方法为:先ps找到对应的pid后,通过pid找到监听端口,然后用vnc直接连接使用

ps -ef|grep zk-easyops-1
netstat -antup|grep $PID

利用配置文件来创建虚机

在/etc/libvirt/qemu下新建xml文件,如node.xml。需要有内存、cpu、硬盘设置、光驱以及vnc等等,可以利用以上快照xml文件

virsh create x.xml

virsh命令

查看虚机

virsh list

强制关闭

[root@localhost ~]# virsh destroy demo
域 demo 被删除

[root@localhost ~]# virsh list --all
 Id    名称                         状态
 -     demo                           关闭

删除虚机


[root@localhost ~]# virsh undefine demo
域 demo 已经被取消定义

[root@localhost ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------

其他操作

virsh start x                                     启动名字为x的非活动虚拟机

virsh create x.xml                          创建虚拟机(创建后,虚拟机立即执行,成为活动主机)

virsh suspend x                                暂停虚拟机

virsh resume x                                 启动暂停的虚拟机

virsh shutdown x                          正常关闭虚拟机

virsh destroy x                                 强制关闭虚拟机

virsh dominfo x                                 显示虚拟机的基本信息

virsh domname 2                                   显示id号为2的虚拟机名

virsh domid x                                   显示虚拟机id号

virsh domuuid x                               显示虚拟机的uuid

virsh domstate x                             显示虚拟机的当前状态

virsh dumpxml x                              显示虚拟机的当前配置文件(可能和定义虚拟机时的配置不同,因为当虚拟机启动时,需要给虚拟机分配id号、uuid、vnc端口号等等)

virsh setmem x 512000                    给不活动虚拟机设置内存大小

virsh edit x                                     编辑配置文件(一般是在刚定义完虚拟机之后)

virt-manager图形化工具

要求使用带有图形化界面的linux,未验证,安装方法跟普通vm安装类似,如果要安装windows的虚拟机,需安装vnc

kvm虚拟网络

  • 可以用virsh net-list查看网络
  • virsh net-dumpxml (default) 把网卡配置加载到文件
  • brctl可以看到网桥,因每个网桥就是一个网络,即一个vlan,因此它与virsh net-list反应的东西一样的,如:
root@GXdeploy02:/tmp/images# virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     no            yes

root@GXdeploy02:/tmp/images# virsh net-dumpxml default
<network connections='8'>
  <name>default</name>
  <uuid>217e6c9f-7f10-4e95-941b-02c91185ce89</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:1d:d8:68'/>
  <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>

从xml文件中可以看出这个网络有8个连接端口,nat模式,网桥名virbr0,dhcp

root@GXdeploy02:/tmp/images# brctl show
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.5254001dd868	yes		virbr0-nic
            vnet1
            vnet13
            vnet18
            vnet23
            vnet25
            vnet30
            vnet5
            vnet7
            vnet9

从这个可以看出virbr0网桥可以看出有如下8个具体的网卡

参考 参考

创建虚拟网卡

  • 方法一:
    ifconfig eth0:0 192.168.10.10 up #创建eht0:0
    ifconfig eth0:0 down #删除,另重启网络服务后自动失效
    
  • 方法二:修改网卡配置文件

    注意:前两种方法虚拟网卡和原网卡物理地址是一样的,不能用来创建虚机

  • 第三种方法:创建tap 添加虚拟网卡tap
    tunctl -b
    

    附上相关命令简介:
    显示网桥信息

     brctl show    
    

    添加网桥

    brctl addbr virbr0
    

    激活网桥

    ip link set virbr0 up
    

    添加虚拟网卡tap

    tunctl -b
    tap0 -------> 执行上面使命就会生成一个tap,后缀从0,1,2依次递增
    

    激活创建的tap

    ip link set tap0 up
    

    将tap0虚拟网卡添加到指定网桥上。

    brctl addif br0 tap0
    

    给网桥配制ip地址

    ifconfig virbr1 169.254.251.4 up
    

    将virbr1网桥上绑定的网卡eth5解除

    brctl delif virb1 eth5      
    

    给virbr1网桥添加网卡eth6

    brctl addif virbr1 eth6    
    

参考

关于让kvm创建的虚机上网的几点总结

kvm创建的虚机要想上网,有几点是要注意的

  1. 对于宿主机,如果是做成brdige模式,能上网的那个网中只是该桥的一个port,那么新创建的虚机的网卡只需要加入这个port,然后在虚机内部,配置网卡时,将该网卡的配置与bridge的ip同网段,且子网、网关、DNS1相同即可实现上网。

查看网卡的配置

root@GXdeploy02:~# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.ec388f793b9b	no		eth1
							                vnet26
							                vnet27
							                vnet35
							                vnet36
							                vnet38
							                vnet4
							                vnet40
...

其实提供ip的网线插在eth1这个口上

创建虚机,加入br0桥

virt-install --virt-type kvm --name zk-node01 --ram 4096 --vcpus 4 --cdrom=/home/shengbo/ISO/CentOS-7-fh-3.3-beta7-x86_64.iso --disk path=/sdb/zk-node01.img,size=150 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --os-type=linux

看下虚机的xml的interface部份

#virsh dumpxml zk-node01
...
<interface type='bridge'>
  <mac address='52:54:00:e1:f4:92'/>
  <source bridge='br0'/>
  <target dev='vnet40'/>
  <model type='rtl8139'/>
  <alias name='net0'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/
>
....

这个创建的虚机要进入控制台配置ip,用vnc进入,用ps -ef|grep zk-node01查看出进程中vnc的配置可以看到vnc的端口,然后利用vnc客户端软件访问ip+port进入该控制台来配置IP

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens3
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens3
UUID=466d7b41-ba99-42a3-b667-271bffcf6633
DEVICE=ens3
ONBOOT=yes
IPADDR=10.127.2.236
PREFIX=24
GATEWAY=10.127.2.254
DNS1=10.19.8.10

IP/网关/dns参考网桥的配置

需要有一点需要注意的是:virsh net list的结果在brctl show中都能对应起来,但后者的名字要在virsh net-dumpxml <net>中找到。但是brctl show中会多出一项,即br0,这个是宿主机本身创建的网桥。

  1. 还有一种情况,如果网卡没在网桥上,这个时候是通过virt-manager来创建的虚机,网卡配置选择defautl nat,在配置IP时,需要跟default保持同一网段。最后虚机能实现上网,但在访问该虚机时需要通过宿主机跳转登陆。

网卡配置

此时网桥的可以用virsh net-list看到,现在直接看其xml

# virsh net-dumpxml default

<network connections='14'>
  <name>default</name>
  <uuid>990fe920-71ef-4509-b7ae-871e33e4f8d2</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <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>

上面已经说过virt创建的网桥,在brctl中都可以看到,上面的配置文件已经表明bridge name是virbr0

root@deploy:/sdb1# brctl show virbr0
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.fe5400164c23	yes		vnet0
							                    vnet11
                                  .....

看下virbr0桥的网络配置

# ifconfig virbr0

virbr0    Link encap:Ethernet  HWaddr fe:54:00:16:4c:23
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:104768039 errors:0 dropped:507090 overruns:0 frame:0
          TX packets:21317185 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:36772905030 (36.7 GB)  TX bytes:74433582513 (74.4 GB)

查看dns

root@deploy:/sdb1# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.19.8.10

这就可以配置虚拟机的网卡了,IP GATEWA(即该网桥的IP) DNS

虚机创建成功后,看下xml

<interface type='network'>
  <mac address='52:54:00:d6:90:5d'/>
  <source network='default'/>
  <target dev='vnet27'/>
  <model type='rtl8139'/>
  <alias name='net0'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

最后配置网卡

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens3
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=ens3
UUID=9c93be9b-601c-4bb1-93d2-975c79916bd4
DEVICE=ens3
ONBOOT=yes
IPADDR=192.168.122.222
PREFIX=24
GATEWAY=192.168.122.1
DNS1=10.19.8.10

这样就可以实现了上网