KVM网卡模式(初探KVM)

2023-11-18

    最近在看“KVM虚拟化技术实战与原理解析”这本书, 略读了前四章后, 开始动手创建并安装一个虚拟机. 然后发现一个很严重的问题, 就是我没有办法通过ssh连接到虚拟机(linux), 也没有办法通过mstsc连到到虚拟机(windows), 因为我在创建虚拟机时网卡模式只能选择NAT, 不知道为什么没有其他选择方式.


    我知道解决这个情况的办法是使用桥接, 因为以前用virtualbox或者vmware的时候都是选择网卡桥接模式, 然后我就开始阅读第四章的网卡配置. 按照书上的例子, 无法实现桥接(连最基本的virbr0是怎么来的都没有介绍……中间省略500字……, 就不继续吐嘈了).


    然后上网找了一些文档阅读了之后, 明白了几个关键点:

        1. virbr0是虚拟网络适配器(即虚拟网卡), 该网卡由virsh维护.

        2. 创建的虚拟机都会绑定在这个网卡上, 通过brctl show可以看到.

        3. 需要将物理网卡(eth0)与virbr0绑定在一起并且将物理网卡上的所有ip平移到虚拟网卡上, 才能实现共享网络.


    由于知识匮乏, 不知道如何继续集成使桥接的配置更灵活. 每次开机后都要把几个命令反复的粘贴来实现桥接.

        1. ifconfig eth0 0;

        2. ip addr add ip地址/子网 dev virbr0

        3. route add default gw 网关地址 dev virbr0

        4. brctl addif virbr0 eth0

    几天下来之后我就感觉到比较烦躁了, 于是又有了下面这段代码, 来减少我对桥接的阴影.

[root@localhost ~]# vim bridgeWay.py
# -.- coding:utf-8 -.-
__author__ = 'root'

import re
import os
import sys
import getopt
from xml.sax import parse
from xml.sax.handler import ContentHandler

# 获取XML文件中的Bridge网卡名称
class getHandler(ContentHandler):
    def __init__(self):
        self.bridge = []

    def startElement(self, name, attrs):
        if name == "bridge":
            self.bridge.append(attrs["name"])

# 输出帮助信息
def printHelp():
    print "INTRODUCTION"
    print "-"*60
    print "Syntax(1): python %s -i ethX [-h]" % sys.argv[0]
    print "Syntax(2): python %s --interface ethX [--help]" % sys.argv[0]
    print "-i or --interface: network interface which to grant bridge."
    print "-"*60

# 处理网卡配置,提取出一组或多组ip信息.
def handleNI(interface):
    with open("/etc/sysconfig/network-scripts/ifcfg-%s" % interface, "r") as netCar:
        ipAddress = {}
        result = []
        splitVar = []
        extrNum = []

        # 获取出多组ip信息(IP地址, 子网掩码, 网关)
        for i in netCar.readlines():
            # 拆分文本内容.
            eachPara = i.replace("\n", "").split("=")
            # 如果是注释掉的内容则不处理.
            if "#" in eachPara[0]: continue
            # 提取ip信息(ipaddr、preffix、netmask、gateway).
            if re.findall(r"IPADDR|PREFIX|NETMASK|GATEWAY", eachPara[0]):
                ipAddress[eachPara[0]] = eachPara[1]

        for i in ipAddress.keys():
            # 拆分变量名称(ipaddr2 --> ['ipaddr', '2'])
            splitVar.append([re.split(r"[0-9]+", i)[0], re.split(r"[a-zA-Z]+", i)[1]])
            # 提取变量数字(ipaddr2, ipaddr3 --> ['2', '3'])
            extrNum.append(re.split(r"[a-zA-Z]+", i)[1])

        # 提取并组合正确的ip组(即每组对应一个ip、preffix、netmask、gateway)
        for i in list(set(extrNum).intersection(set(extrNum))):
            temp = {}
            for j in splitVar:
                if i == j[1]:
                    temp[j[0]] = ipAddress[''.join(j)]
            result.append(temp)
        return result

def rebuildBridge(netInterface, bridgeName, ipList):
    result = []
    # 绑定网卡为桥接模式
    os.popen("brctl addif %s %s >> /dev/null 2>&1" % (bridgeName, netInterface))

    for i in ipList:
        # 清除原网卡上所设定的ip地址
        os.popen("ip addr del %s/%s dev %s >> /dev/null 2>&1" % (i["IPADDR"], i["PREFIX"], netInterface))
        # 在桥接口上添加ip地址
        os.popen("ip addr add %s/%s dev %s >> /dev/null 2>&1" % (i["IPADDR"], i["PREFIX"], bridgeName))

        # 只要ip列表中包含有网关, 则会启用该网关.
        if i.has_key("GATEWAY"):
            os.popen("route del default gw %s dev %s >> /dev/null 2>&1" % (i["GATEWAY"], netInterface))
            os.popen("route add default gw %s dev %s >> /dev/null 2>&1" % (i["GATEWAY"], bridgeName))

            # 若网关设置好了之后无法被ping通, 则会将该条默认网关清除掉.
            getPing = os.popen("ping -c 1 %s >> /dev/null 2>&1; echo $?" % i["GATEWAY"]).read().replace("\n", "")
            # linux中的操作, 正确返回0, 错误返回非0.
            if int(getPing) != 0:
                result.append(("error", i["GATEWAY"]))
                os.popen("route del default gw %s dev %s >> /dev/null 2>&1" % (i["GATEWAY"], bridgeName))
            else:
                result.append(("correct", i["GATEWAY"]))

    for i in result:
        if "correct" in i[0]:
            print "网关可以正常使用: ", i[1]

# 检查输入参数是否正确
def checkArguments(*args):
    options, args = getopt.getopt(sys.argv[1:], shortopts="hi:", longopts=["help", "interface="])

    for name, value in options:
        if name in ("-h", "--help"):
            printHelp()
            sys.exit(1)
        elif name in ("-i", "--interface"):
            return value
        else:
            printHelp()
            sys.exit(1)

if __name__ == "__main__":
    if len(sys.argv) > 1:
        # 定义kvm读取网卡(virbrX)的配置信息.
        filePath = "/etc/libvirt/qemu/networks/default.xml"
        # 检查参数是否正确.
        interface = checkArguments(sys.argv[1:])
        # 获取ip信息
        ipList = handleNI(interface)
        # 获取桥接网卡名称(Bridge Name).
        handleXML = getHandler()
        parse(filePath, handleXML)
        bridgeName = handleXML.bridge[0]
        # 创建桥接. 
        rebuildBridge(interface, bridgeName, ipList)
    else:
        printHelp()


以后我要用虚拟机的时候,运行一下这个脚本, 就会帮助我解决网络的问题.

[root@localhost ~]# python bridgeWay.py -i eth0


转载于:https://blog.51cto.com/9614554/1579884

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KVM网卡模式(初探KVM) 的相关文章

随机推荐

  • Anaconda3安装PyEcharts包后无法正常调用

    最近在研究数据可视化问题 然后得知了Python的PyEcharts包库 使用pip install pyecharts 命令安装显示成功 但是在Spyder中输入from pyecharts import Bar 显示无法import b
  • [机器学习与scikit-learn-35]:算法-分类-支持向量机-线性分类代码示例

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123800789 目录 前言 第1步骤
  • python - 数据分析之matplotlib绘图模块一览总表

    Matplotlib 入门 https deepinout com matplotlib matplotlib tutorials matplotlib easy to start html Matplotlib 教程 https geek
  • GitHub私活利器【开源版】前后端分离的Java 商城系统(已上线)

    项目介绍 Smart Shop 是一款基于 Spring Cloud MybatisPlus XXL JOB redis Vue 的前后端分离 分布式 微服务架构的 Java 商城系统 添加图片注释 不超过 140 字 可选 技术架构 运行
  • 中间件(redis,rabbitmq,zookeeper,kafka)集群讨论及搭建

    一 前言 大家好 我是小墨 这一篇文章我们来一个中间件的集群的搭建的大团圆章节 将围绕我们使用的主流几个中间件 我使用过的 的集群构建方式进行原理讨论和实际搭建方案探讨 包括zookeeper redis rabbitmq zookeepe
  • 从物业管理到IT互联网精英,月薪11k的她几经辗转,终得偿所愿!

    所谓 男怕入错行 其实对女生来说也是一样 不同行业对人生的改变太大 想要找到满意的工作 就要不断去尝试 西安的学员小文 大学毕业后从事的本专业 物业管理 工作 但不是很喜欢 薪资也偏低 后面转到建筑行业做人力资源管理 需要跟着项目走 考虑到
  • MyBatis课后练习题——(狂神说系列)

    MyBatis课后练习题 1 导入数据库 及配置文件 1 1 导入数据库 1 1 1 smbms address CREATE TABLE smbms address id bigint 20 NOT NULL AUTO INCREMENT
  • 云服务器我的数据保存在哪个文件夹,云服务器存储在哪里

    云服务器存储在哪里 内容精选 换一换 整机镜像是包含云服务器操作系统 应用软件和业务数据的镜像 一般适用于云服务器数据整体搬迁 例如 将云服务器共享给其他租户将 华北 北京一 的云服务器迁移至 华南 广州 区域将老旧云服务器上的数据迁移至新
  • java: framework from BLL、DAL、IDAL、MODEL、Factory, using Ms SQL server

    sql create database geovindu go use geovindu go 基础数据设置BasicDataSet 书分类目录kind BookKindForm IF EXISTS select from sysobjec
  • VMware 15 安装ubuntu 18.04的总结

    换了新电脑 想安装了VMware12 0版本的 结果发现安装包和我现在的电脑并不匹配 所以下载了较新版本的vmware 15 5 网上找到对应版本的序列号注册 在安装完成后激活即可 emsp 从Linux公社的文章 Ubuntu 18 04
  • 一个开源项目维护者的笔记:为什么我关闭 PR

    原文出处 jeffgeerling 译文出处 oschina 局长 我在 GitHub 上和其他地方维护着许多的开源项目 截止本文写作时超过 160 个 在过去几年里 我已经合并 以及 或者 关闭了上千个 Pull Requests PRs
  • Linux 下面编译内核模块的 方法

    1 选择好你的内核版本 内核模块经常是和内核版本紧密相关的 建议尽量选择高内核的版本 否则有可能会遇到很大的问题 2 下载内核代码到 usr src kernel 目录 如果有了 则不用下载 3 mkdir p lib modules 3
  • [FPGA系列] 扩展知识 --- 时钟小结

    一 基本概念 时钟域 由同一个时钟信号控制的区域 时钟抖动 Jitter 相对于理想时钟信号 实际时钟信号存在时而超前 时而之后的偏移 时钟偏斜 Skew 时钟信号到达数字电路各个部分所用时间的差异 时钟漂移 Wander 工程上解释 抖动
  • Day【10】相交链表

    原题链接 思路 代码 public class Solution public ListNode getIntersectionNode ListNode headA ListNode headB if headA null headB n
  • Typora的安装与配置

    Markdown对于码农来讲有多重要就不多说了吧 那么Typora作为一款极好用的生产工具 它的重要性也不言而喻了吧 Typora简介 Typora 是一款支持实时预览的 Markdown 文本编辑器 风格极简 多种主题 支持 macOS
  • Linux操作系统

    一 Linux系统概述 1 1Linux操作系统的组成 Linux操作系统是由Linux系统内核和系统级应用程序两部分组成的 1 内核提供系统核心的功能 如调度CPU 调度内存 调度系统文件 调度网路通讯 调度IO 2 系统级应用程序可以理
  • 【PythonCode】这些题,不会做就选D

    PythonCode 这些题 不会做就选D 前言 在很多高大上的项目中 一个花费很长时间 消耗大量人力物力才查出来的BUG 经常是一个符号错误 一个值传错 一个基本函数的用法没有考虑周到等基本问题 所以基础不牢 地动山摇 真的不是开玩笑 2
  • Qt信号槽自动关联的用法

    Qt除使用connect方法显式的关联信号与槽 还可以通过自动关联机制实现信号与槽函数的连接 自动关联的槽函数命名规则 void on lt 窗口部件名称 gt lt 信号名称 gt lt 信号参数 gt 实现信号与槽函数关联的步骤 1 在
  • Android 安全机制(1)uid 、 gid 与 pid

    1 概述 Android 安全机制来源于Linux 并且以Linux权限管理为基础 要了解Android的安全机制 需要从linux中的安全机制了解开始 而用户的权限管理又是linux安全机制的最基本的一个组成 Android的创新之处是在
  • KVM网卡模式(初探KVM)

    最近在看 KVM虚拟化技术实战与原理解析 这本书 略读了前四章后 开始动手创建并安装一个虚拟机 然后发现一个很严重的问题 就是我没有办法通过ssh连接到虚拟机 linux 也没有办法通过mstsc连到到虚拟机 windows 因为我在创建虚