- 系统环境
- 查看是否支持硬件虚拟化
- 桥接网络
- 安装kvm及libvirt
- 创建虚拟机
- 利用配置文件来创建虚机
- virsh命令
- virt-manager图形化工具
- 附
- 关于让kvm创建的虚机上网的几点总结
系统环境
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
桥接网络
-
为什么要桥接网络?
因为虚拟机中网络,我们一般都是和公司的其他服务器是同一个网段,所以我们需要把KVM服务器的网卡配置成桥接模式。这样的话KVM的虚拟机就可以通过该桥接网卡和公司内部分其他服务器处于同一网段。 -
为什么将本地网卡加入到网桥后,本地网卡无需IP?网桥如何配置IP
将已有的物理网卡添加到网桥,此时物理网卡eth0工作于混杂模式,所以不需要IP地址,因为网桥是工作在链路层的。br0就提供了IP地址,用来模拟原来的物理网卡的访问接口.
首先安装网桥工具
yum install bridge-utils -y
方法一:修改配置文件,永久生效
- 若未做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
- 若做了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创建的虚机要想上网,有几点是要注意的
- 对于宿主机,如果是做成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,这个是宿主机本身创建的网桥。
- 还有一种情况,如果网卡没在网桥上,这个时候是通过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
这样就可以实现了上网