虚拟化技术(Virtualization)
-
计算机基础:
- 冯诺依曼体系中计算机的五大部件:控制器、运算器、输入设备、输出设备、存储器
- 操作系统
操作系统就是计算机资源的虚拟化,即把底层单组架构或单组计算机资源给虚拟化,把单核心的CPU时序复用,分成时间片来使用;把内存空间复用,分成单独的离散空间(页框)使用;操作系统将有限的计算机资源划分成复用的形式,虚拟化把操作系统这得到的资源进行分割,使用软件建模,用软件模拟出一个CPU,模拟或虚拟成一个单独的系统空间
-
虚拟化技术的类型
- 主机虚拟化:
- 完全虚拟化:vmware workstation、kvm、xen(hvm)
- 半虚拟化:xen、vmware vshphere、uml
- 模拟:qemu是个模拟器
- 用户空间虚拟化(容器)
- 例如:lxc、openvz、Solaris、Containers、FresBSD jails
- 库虚拟化:WINE、cywin
- 应用程序虚拟化:jvm、pvm
- 主机虚拟化:
-
主机虚拟化:
-
CPU:
- 模拟:emulation, 虚拟机的arch与物理平台的arch可以不相同;qemu;
- 虚拟:virtualization
- 完全虚拟化(full-virt)
BT: 二进制转换 (软件)
HVM:硬件辅助的虚拟化(硬件): Intel(vt-x)、AMD(amd-v) - 半(准)虚拟化 (para-virt)
GuestOS得明确知道自己运行于虚拟化技术
- 完全虚拟化(full-virt)
-
内存:
- MMU virtualization:中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统
- Intel: EPT, Extended Page Table
- AMD: NPT, Nested Page Table
- TLB virtualization:(Translation Lookaside Buffer)转换检测缓冲区是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存。
- tagged TLB
IO:
Emulation
Para-virtualization
IO-through:IO透传 - MMU virtualization:中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统
-
-
主机虚拟化的类型
- (1) Type -1:在硬件上装一个虚拟机(中间件hypervisor),所有系统都装在这个hypervisor之上;例如:xen、vmware ESX/ESXI
- (2) Type -2:在硬件上安装运行一个OS(Host OS),而此OS上运行一个VMM; 例如:vmware workstation,virtualbox、kvm
-
Linux目前流行的开源虚拟化技术解决方案
- 主机虚拟化:xen、kvm、virtualbox
- 容器级:lxc、libcontainer、runC、openvz
- 模拟器:qemu
KVM
-
XEN
xen以软件的形式安装后,重启会取代linux内核跑在硬件之上,之前的linux会成为第一个虚拟化主机,被称为特权主机;xen跑在硬件之上后只驱动CPU和内存,I/O设备由之前的linux来驱动,其他主机驱动I/O设备需要通过特权主机,而使用CPU和内存则通过XEN
-
KVM:Kernel-base Virtual Machine,Qumranet公司研发,后来被RedHat收购
使用于X86_64操作系统;依赖于HVM,要求CPU必须支持虚拟化技术
kvm做为一个内核模块,安装以后取代内核,并把系统的用户空间变为一个控制台,在之上就可以安装虚拟机,优点:不需要重启就可以使用
- 主要作用:运行程序而不是运行CPU
- KVM两类组件:
- /dev/kvm (kvm.ko):工作为hypervisor,在用户空间可通过系统调用ioct()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种操作
- qem-kvm进程:工作于用户空间,用于实现I/O设备模拟;用于实现一个虚拟机实例
- KVM模块载入内存之后,系统的运行模式:
- 内核模式:GuestOS执行IO类操作时,或其他的特殊治理操作时的模式;它也被称为“Guest-Kernel”模式;
- 用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求;
- 来宾模式:GuestOS的用户模式;所有的非IO类请求
- KVM的特性:
- 内存管理:
- 将分配给VM的内存交换至swap
- 支持使用Huge Page(大内存页)
- 支持使用Inter EPT或AMD RVI技术完成技术内存地址映射
- 支持KSM(Kernel Same-page Merging)内核相同页面合并技术
- 硬件支持:取决于Linux内核
- 存储:
- 本地存储
- 网络附加存储
- 存储区域网络
- 分布式存储:GlusterFS等
- 实时迁移:live migration
- 支持GuestOS
- 设备驱动:
- 支持IO设备的完全虚拟化:模拟硬件
- 支持IO设备的版虚拟化:virtio
- virtio-blk 块设备半虚拟化
- virtio-net 网络设备半虚拟化
- virtio-pci 任何pci接口设备的半虚拟化
- 内存管理:
- kvm管理工具:kvm有两组工具能实现虚拟机管理
- 第一组工具:qemu工具
qemu是个独立的虚拟机项目,其中有一个qemu-kvm分支是于kvm结合的分支,后来独立成了一个项目;然后又合并到了主项目,主干分支支持kvm和xen,而qemu-lvm分支只支持kvm;
qemu-kvm组能件实现虚拟机的创建、启动管理各种接口都支持,但只是命令行接口,使用不便,而且这些组件非常底层;- qemu-kvm:专门用于管理kvm的工具
- qemu-img:管理虚拟机磁盘映像文件
- qemu-io:管理IO设备
- 第一组工具:qemu工具
- 第二组工具:C/S架构的libvirt组件
- virsh:支持基于C/S架构,与守护进程libvirtd同喜的命令行工具
- virtual machine manger:基于python研发的图形界面工具,包括两个工具:
- virt-manger:虚拟机管理器;创建、启动、删除、停止等
- virt-viewer:虚拟机查看器
- virtinst:虚拟机创建、安装工具,是命令行工具
- virt-install
- virt-clone
- virt-convert
- virt-image
- 因此,创建虚拟机有三种方式:
- qemu
- virtual machine manager
- virtinst
-
安装使用KVM
- 判断CPU是否支持硬件虚拟化:
grep -i -E '(vms|svm|lm)' /porc/cpuinfo
modinfo kvm
lsmode|grep kvm
- 运行中的kvm虚拟机就是一个qemu-kvm进程,运行qemu-kvm程序并传递给它合适的选项及参数技能完成虚拟机启动,终止此进程即关闭虚拟机
- kvm工具栈
- qemu:
- qemu-kvm
- qemu-img
- qemu-io
- libcirt:
- CUI:virt-manager,virt-viewer
- CLI: virtsh,cirt-install
- c/s:
- libvirtd
- qemu:
- 安装:
-
(1)装载内核模块
- kvm:核心模块
- kvm-intel|kvm-amd
-
(2)使用virt-manager管理KVM
[root@kvm ~]# yum -y groupinstall "Virtualization Host" [root@kvm ~]# yum -y install qemu-kvm libvirt-daemon-kvm virt-manager [root@kvm ~]# systemctl start libvirtd.service [root@kvm ~]# ps aux |grep libvirtd [root@kvm ~]# virt-manager` 启动 启动后virt-manager显示乱码需要安装字体: [root@kvm ~]# yum install dejavu-lgc-sans-fonts
-
- 判断CPU是否支持硬件虚拟化:
使用qemu-kvm管理vms
- Qemu:
- 处理器模拟器
- 仿真各种IO设备
- 将仿真设备连接至主机的物理设备
- 提供用户接口
- qemu-kvm命令语法:
qemu-kvm [option] [disk_image]
- options有很多类别:标准选项、块设备相关选项、显示选项、网络选项、...
-
标准选项:
-
machine [type=] name
:-machine help
用来获取列表;用于指定模拟的主机类型; -
-cpu cpu
:-cpu help
用来获取类别;用于指定要模拟的CPU型号; -
-smp n[,maxcpus=cpus] [,cores=cores] [,threads=threads] [,sockets=sockets]
: 指明虚拟机上的vcpu的数量及拓扑; -
-boot [order=drives] [,once=drives] [,menu=on|off] [,splash=sp_name] [,splash-time=sp_time][,reboot-timeout=rb_time] [,strict=on|off]
:- order:各设备的引导次序;c表示第一块硬盘,d表示第一个光驱设备;例:
-boot order=dc,once=d
- order:各设备的引导次序;c表示第一块硬盘,d表示第一个光驱设备;例:
-
-m megs
: 虚拟机的内存大小 -
name NAME
: 当前虚拟机的名称,要唯一
-
-
块设备相关的选项:
-
-hda/-hdb file
: 指明IDE总线类型的磁盘映射文件路径,第0个和第一个 -
-hdc/-hdd file
: 第2个和第3个 -
cdrom file
: 指定要使用光盘映像文件 -
drive [file=file][,if=type][,media=d][,index=i][,cache=writethrough|writeback|none|directsync|unsafe][,format=f]]
:-
file=/PATH/TO/SOME_IMAGE_FILE
:映像文件路径; -
if=TYPE
: 块设备总线类型,ide,scsi,sd,floppy,virtio,... -
media=TYPE
:介质类型,cdrom和disk -
index=i
:设定同一类型设备多个设备的编号 -
cache=writethrough|writeback|none|directsync|unsafe
:缓存方式 -
format=f
:磁盘映像文件的格式
-
-
-
显示选项:
-
-display type
:显示类型,sdl,curses,none和vnc; -
nographic
: 不使用图形接口 -
vga [std|cirrus|vmware|qxl|xenfb|none
]: 模拟出的显卡的型号 -
vnc display[,option[,option[,...]]]
: 启动一个vnc server来显示虚拟机- display:
(1) HOST:N 在host主机的第N个桌面好输出vnc;5900+N
(2)unix:/PATH/TO/SOCK_FILE
(3)none - options:
password:连接此服务所需要的密码
- display:
-
-monitor stdio
: 在标准输出上显示monitor界面
-
-
网络选项:
-
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
: 为虚拟机创建一个网络接口,并将其添加至指定的VLAN-
model=type
:指明模拟出的网卡型号,ne2k_pci,i82551,i8255b,i82559er,rt18139,e1000,pcnet,virtio net nic,model=?
-
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 nscript=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup
downscript=dfile: 关闭虚拟机时要执行的脚本,/etc/qemu-ifdown
-
ifname=NAME: 自定义接口名称
cat /etc/qemu-ifup #!/bin/bash # bridge=br0 if [ -n "$1" ];then ip link set $1 up sleep 1 brctl addif $bridge $1 [ $? -eq 0 ] && exit 0 || exit 1 else echo "Error: no interface specified." exit 1 fi
-
-
其它选项:
-
-daemonize
: 以守护进程运行
-
-
示例1:
~]# qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup
示例2:
~]# qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize
虚拟化模型:
- NAT模式(相当于仅主机,默认类型)
- libvirtd安装启动后会自动创建出一个virbr0的接口
- virbr0表示网桥设备,类似于vmware workstation中的nat类型网络
- 此网络模型下虚拟机可以访问宿主机,也可以访问互联网,但是不能从网络或其他的客户机访问虚拟机,性能较差
- Host-only模型(也叫隔离模式)
- 类似于vmware workstation中的仅主机模式
- 将所有的虚拟机组成一个局域网,不能和外界通信,不能访问Internet,其他主机也不能访问虚拟主机,安全性高
- Bridge模型(桥接接口)
- 类似于vmware workstation中的桥接
- 虚拟机与宿主机处于同一个网络环境,类似于一台真实的宿主机,可以直接访问网络资源,设置好后虚拟机与宿主机,互联网之间的通信很容易
示例:创建2个虚拟机实例演示网络通信
-
隔离网络:只有虚拟机之间可以通信,与物理机无法通信,与外网也无法通信
[root@kvm ~]# yum -y groupinstall "Virtualization Host" [root@kvm ~]# yum -y install virt-manager libvirt-daemon-kvm qemu-kvm dejavu0lgc-sans-fonts [root@kvm ~]# which brctl /usr/sbin/brctl [root@kvm ~]# rpm -qf /usr/sbin/brctl bridge-utils-1.5-9.el7.x86_64 创建独立的桥设备: [root@kvm ~]# ip link set br-int up或者 ifconfig br-int up #激活桥接口 [root@kvm ~]# ifconfig br-int: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::3041:11ff:fe83:15ac prefixlen 64 scopeid 0x20<link> ether 32:41:11:83:15:ac txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 6 bytes 508 (508.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
能看到br-int接口后,此时没有ip地址,就意味着不能作为物理机的接口与外部通信;创建两个虚拟机网卡关联到这个桥上,然后两个虚拟机配置同一个网段的ip地址,就能互相通信了;
启动2个虚拟机实例:
[root@kvm ~]# 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 "ERROR:no interface specified"
exit 2
fi
[root@kvm ~]# bash -n /etc/qemu-ifup
[root@kvm ~]# chmod +x /etc/qemu-ifup
[root@kvm ~]# vim /etc/qemu-ifdown
#!/bin/bash
#
bridge=br-int
if [ -n "$1" ];then
brctl delif $bridge $1
ip link set $1 down
exit 0
else
echo "ERROR: no interface specified"
exit 1
fi
[root@kvm ~]# bash -n /etc/qemu-ifdown
[root@kvm ~]# chmod +x /etc/qemu-ifdown
[root@kvm ~]# mkdir -pv /vms/cirros
mkdir: created directory ‘/vms’
mkdir: created directory ‘/vms/cirros’
[root@kvm ~]# cd /vms/cirros
[root@kvm cirros]# cp /root/cirros-0.3.4-x86_64-disk.img cirros1.img
[root@kvm cirros]# cp /root/cirros-0.3.4-x86_64-disk.img cirros2.img
[root@kvm cirros]# ln -sv /usr/libexec/qemu-kvm /usr/sbin/ #qemu-kvm命令
‘/usr/sbin/qemu-kvm’ -> ‘/usr/libexec/qemu-kvm’
[root@kvm cirros]# qemu-kvm -name c1 -m 256 -smp 2 -drive file=/vms/cirros/cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :0 -daemonize
[root@kvm cirros]# qemu-kvm -name c2 -m 256 -smp 2 -drive file=/vms/cirros/cirros2.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:22 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :1 -daemonize
[root@kvm cirros]# ps aux | grep qemu-kvm
root 37969 10.6 6.3 720160 118664 ? Sl 08:59 0:12 qemu-kvm -name c1 -m 256 -smp 2 -drive file=/vms/cirros/cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :0 -daemonize
root 38025 12.4 5.4 719140 101044 ? Sl 08:59 0:11 qemu-kvm -name c2 -m 256 -smp 2 -drive file=/vms/cirros/cirros2.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:22 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :1 -daemonize
此时可以使用vncviewer连接两个虚拟机实例
[root@kvm ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 *:5900 *:*
LISTEN 0 1 *:5901 *:*
[root@kvm ~]# vncviewer :0 &
[root@kvm ~]# vncviewer :1 &
此时2个虚拟机实例都以及启动起来,并且br-int桥上没有ip地址,在两个虚拟机上配置同网段的IP地址后可以实现2个虚拟机通信:
c1:
$ sudo su - root
# ifconfig eth0 10.0.0.1/24 up
c2:
$ sudo su - root
# ifconfig eth0 10.0.0.2/24 up
# ping 10.0.0.1
64 bytes from 10.0.0.1: seq=0 ttl=64 time=12.112 ms
...
至此就完成虚拟机间通信,两个虚拟机都桥接到同一个桥上,这个桥本身没有ip地址,所以是隔离的网络模型;
-
仅主机网络模式:
每启动一个虚拟机,tap0,tap1是两个接口,在物理机上没有地址,它们都是虚拟机网卡的后半段不需要地址,这两个是连接虚拟交换机的(桥设备);[root@kvm ~]# brctl show
bridge name bridge id STP enabled interfaces
br-int 8000.362a10196967 no tap0
tap1
此时,如果要想虚拟机与物理机通信,只需向网桥添加地址即可,或者是手动创建添加一对儿网卡,一半在留在网桥上,一半留在物理机上;
给桥br-int添加地址:
[root@kvm ~]# ifconfig br-int 10.0.0.254/24
[root@kvm ~]# ifconfig br-int
br-int: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.254 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::3041:11ff:fe83:15ac prefixlen 64 scopeid 0x20<link>
ether 36:2a:10:19:69:67 txqueuelen 1000 (Ethernet)
RX packets 19 bytes 2704 (2.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
此时在物理机上ping虚拟机可以ping通:
[root@kvm ~]# ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=4.45 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=1.62 ms
^C
--- 10.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 1.627/3.043/4.459/1.416 ms
[root@kvm ~]# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=49.5 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=2.67 ms
在物理机上打开核心转发功能:
[root@kvm ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
在虚拟机上添加默认网关:
# route add default gw 10.0.0.254
# ping 192.168.43.33 此时与物理机ip可以通信
此时虚拟机和物理机之间可以正常通信,这就是仅主机模式。
-
NAT模式:
# ping 61.135.169.121 #此时ping外网(百度ip)是不通的 在物理机上是用tcpdump监控网卡发现:,虚拟机可以ping出去到外部的61.135.169.121主机,但是,ping包不能回来; [root@kvm ~]# tcpdump -i ens33 -nn icmp 09:30:57.006063 IP 10.0.0.1 > 61.135.169.121: ICMP echo request, id 32001, seq 0, length 64 09:30:58.007888 IP 10.0.0.1 > 61.135.169.121: ICMP echo request, id 32001, seq 1, length 64 09:30:59.010346 IP 10.0.0.1 > 61.135.169.121: ICMP echo request, id 32001, seq 2, length 64 要从虚拟机ping出去到外部的包能回来,要么让外部的主机添加能到虚拟机的路由,要么在物理机上添加iptables规则: [root@kvm ~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.43.33 在虚拟机上ping测试: # ping 61.135.169.121 查看物理网卡监控: [root@kvm ~]# tcpdump -i ens33 -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes 09:35:26.191195 IP 192.168.43.33 > 61.135.169.121: ICMP echo request, id 32257, seq 0, length 64 09:35:26.212348 IP 61.135.169.121 > 192.168.43.33: ICMP echo reply, id 32257, seq 0, length 64 09:35:27.193508 IP 192.168.43.33 > 61.135.169.121: ICMP echo request, id 32257, seq 1, length 64 09:35:27.226221 IP 61.135.169.121 > 192.168.43.33: ICMP echo reply, id 32257, seq 1, length 64
09:35:28.195532 IP 192.168.43.33 > 61.135.169.121: ICMP echo request, id 32257, seq 2, length 64
这就实现了NAT模式的网络模式;但是此时可以访问外网,但是外网是不能访问虚拟机的;想要外网能够访问虚拟机,需要在添加一条DNAT规则:
[root@kvm ~]# iptables -t nat -A PREROUTING -d 192.168.43.33 -j DNAT --to-destination 10.0.0.1
-
桥接模式:
把物理网卡当桥使用,需要手动配置桥接接口;
把网卡配置文件复制一份,并修改相关参数就可创建桥接口了;
但是,也有非常简洁的方法配置桥接口,如果安装了virsh或libvirtd并且有virsh命令,因为virsh命令自己就能创建桥接口,并且它能自动创建一个物理桥,把物理网卡关联到桥接口上去;演示手动实现配置桥接接口:
]# cd /etc/sysconfig/network-scripts/ 复制网卡配置文件为桥设备配置文件: ]# cp ifcfg-eno16777736 ifcfg-br0 修改网卡配置文件为交换机使用: ]# vim ifcfg-eno16777736 修改: BOOTPROTO=none 删除接口地址; BRIDGE="br0" 编辑桥设备配置文件: ]# vim ifcfg-br0 修改: DEVICE=br0 TYPE=Bridge 必须首字母大写; 删除NAME,其它地址等保留; 使用virsh命令创建桥设备: ]# virsh iface-list 名称 状态 MAC 地址 --------------------------------------------------- eno16777736 活动 00:0c:29:3f:67:86 lo 活动 00:00:00:00:00:00 查看命令帮助: ]# virsh help iface-bridge 语法格式: iface-bridge <interface> <bridge> [--no-stp] [--delay <number>] [--no-start] 其中: OPTIONS [--interface] <string> 现有接口名称 [--bridge] <string> 新桥接设备名称 --no-stp 无法为这个桥接启用 STP --delay <number> 在新连接的端口中 squelch 流量的秒数 --no-start 不要立即启动桥接 interface:指明把哪个接口关联到桥上; bridge:桥的名称; --no-stp:表示不支持生成树协议;
创建物理桥:
注意:红帽研发的网络功能NetworkManager服务必须关闭,才能使用virsh创建桥;只使用network服务;
centos6和7都有这两种服务能管理网络功能NetworkManager和network;如果要使用桥接接口,不能使用NetworkManager服务,必须停掉,让network来作为网卡管理功能;然后,还有编辑网卡不受nm控制;
]# systemctl stop NetworkManager.service ]# systemctl disable NetworkManager.service ]# systemctl status network.service ]# virsh iface-bridge eno16777736 br0 使用附加设备 br0 生成桥接 eno16777736 失败 已启动桥接接口 br0 ]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.11.115 netmask 255.255.0.0 broadcast 172.18.255.255 inet6 fe80::20c:29ff:fe3f:6786 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:3f:67:86 txqueuelen 0 (Ethernet) RX packets 123 bytes 11913 (11.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 23 bytes 1902 (1.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 00:0c:29:3f:67:86 txqueuelen 1000 (Ethernet) RX packets 251384 bytes 87346879 (83.3 MiB) RX errors 0 dropped 527 overruns 0 frame 0 TX packets 17222 bytes 1562170 (1.4 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ... virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:8e:05:ad txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
此时,网卡已经变成交换机了;桥设备获得了ip地址;
]# virt-manager 弹出虚拟机管理界面; 创建新建时,选桥接;