首页 文章 精选 留言 我的

精选列表

搜索[分代式],共10000篇文章
优秀的个人博客,低调大师

准备 LVM Volume Provider - 每天5分钟玩转 OpenStack(49)

Cinder 真正负责 Volume 管理的组件是 volume provider。 Cinder 支持多种 volume provider,LVM 是默认的 volume provider。Devstack 安装之后,/etc/cinder/cinder 已经配置好了 LVM,如下图所示: 上面的配置定义了名为“lvmdriver-1”的 volume provider,也称作 back-end。其 driver 是 LVM,LVM 的 volume group 名为“stack-volumes-lvmdriver-1”。 Devstack 安装时并没有自动创建 volume group,所以需要我们手工创建。 如下步骤演示了在 /dev/sdb 上创建 VG “stack-volumes-lvmdriver-1”: 首先创建 physical volume /dev/sdbLinux 的 lvm 默认配置不允许在 /dev/sdb 上创建 PV,需要将 sdb 添加到 /etc/lvm.conf 的 filter 中。 然后创建 VG stack-volumes-lvmdriver-1 打开 Web GUI,可以看到 OpenStack 已经创建了 Volume Type “lvmdriver-1” 其 Extra Specs volume_backend_name 为 lvmdriver-1 后面各小节都将以 LVM 为 volume provider 详细讨论 volume 的各种操作。

优秀的个人博客,低调大师

Migrate Instance 操作详解 - 每天5分钟玩转 OpenStack(40)

Migrate 操作的作用是将 instance 从当前的计算节点迁移到其他节点上。 Migrate 不要求源和目标节点必须共享存储,当然共享存储也是可以的。 Migrate 前必须满足一个条件:计算节点间需要配置 nova 用户无密码访问。 下面是 Migrate instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-scheduler 执行调度 nova-scheduler 发送消息 nova-compute 执行操作 下面我们详细讨论每一个步骤。 向 nova-api 发送请求 客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:“帮我迁移这个 Instance” Migrate 操作是特权操作,只能在 Admin 的 instance 菜单中执行 查看日志 /opt/stack/logs/n-api.log nova-api 发送消息 nova-api 向 Messaging(RabbitMQ)发送了一条消息:“迁移这个 Instance” 查看源代码 /opt/stack/nova/nova/compute/api.py,方法是 resize。 没错,是 resize 而非 migrate。这是由于 migrate 实际上是通过 resize 操作实现的,至于为什么要这样设计,我们会在下一节 resize 中详细分析。 nova-scheduler 执行调度 nova-scheduler 收到消息后,会为 instance 选择合适的目标计算节点。 查看日志 /opt/stack/logs/n-sch.log 可以看到,因为 devstack-compute1 的权值比 devstack-controller 大,最终选择 devstack-compute1 作为目标节点。 看到上面的日志,大家发现什么问题没有? 在分析这段日志的时候,我发现 scheduler 选出来的计算节点有可能是当前节点源节点! 因为 scheduler 并没在初始的时候将源节点剔除掉,而是与其他节点放在一起做 filter,按照这个逻辑,只要源节点的权值足够大,是有可能成为目标节点的。 那紧接着的问题是:如果源节点和目标节点是同一个,migrate 操作会怎样进行呢? 实验得知,nova-compute 在做 migrate 的时候会检查目标节点,如果发现目标节点与源节点相同,会抛出 UnableToMigrateToSelf 异常。Nova-compute 失败之后,scheduler 会重新调度,由于有 RetryFilter,会将之前选择的源节点过滤掉,这样就能选到不同的计算节点了。 关于 RetryFilter,大家还有印象吗?如果生疏了可以看前面章节。 好,言归正传。在上面的操作中 sheduler 选择的目标节点是 devstack-compute1,意味着 instance 将从 devstack-controller 迁移到 devstack-compute1。 nova-scheduler 发送消息 nova-scheduler 发送消息,通知计算节点可以迁移 instance 了。 源代码在 /opt/stack/nova/nova/scheduler/filter_scheduler.py 第 95 行,方法为 select_destinations nova-compute 执行操作 nova-compute 会在源计算节点和目标计算节点上分别执行操作。 源计算节点 devstack-controller 迁移操作在源节点上首先会关闭 instance,然后将 instance 的镜像文件传到目标节点上。 日志在 /opt/stack/logs/n-cpu.log,具体步骤如下: 开始 migrate 在目标节点上创建 instance 的目录 nova-compute 首先会尝试通过 ssh 在目标节点上的 instance 目录里 touch 一个临时文件,日志如下 如果 touch 失败,说明目标节点上还没有该 instance 的目录,也就是说,源节点和目标节点没有共享存储。那么接下来就要在目标节点上创建 instance 的目录,日志如下 关闭 instance 将 instance 的镜像文件通过 scp 传到目标节点上 目标计算节点 devstack-compute1 在目标节点上启动 instance,过程与 launch instance 非常类似。 会经过如下几个步骤: 1. 为 instance 准备 CPU、内存和磁盘资源 2. 创建 instance 镜像文件 3. 创建 instance 的 XML 定义文件 4. 创建虚拟网络并启动 instance 日志记录在 /opt/stack/logs/n-cpu.log,分析留给大家练习。 Confirm 这时,instance 会处于 “Confirm or Revert Resize/Migrate”状态,需要用户确认或者回退当前的迁移操作,实际上给了用户一个反悔的机会。 当我们按下 Confirm 按钮后,会发生如下事情: nova-api 接收到 confirm 的消息 源计算节点删除 instance 的目录,并在 Hypervisor 上删除 instance。 目标计算节点不需要做任何事情 Revert 如果执行的是 Revert 操作会发生什么事情呢? nova-api 接收到 revert 的消息 在目标计算节点上关闭 instance,删除 instance 的目录,并在 Hypervisor 上删除 instance。 源计算节点上启动 instance 因为之前迁移的时候只是在源节点上关闭了该 instance,revert 操作只需重新启动 instance。 以上是 Migrate 操作的完整流程,这里有一点需要特别注意: 迁移过程中源和目标节点之前需要使用 ssh 和 scp,为了使操作顺利进行,必须要保证 nova-compute 进程的启动用户(通常是 nova,也可能是 root,可以通过 ps 命令确认)能够在计算节点之间无密码访问。否则 nova-compute 会等待密码输入,但后台服务是无法输入密码的,迁移操作会一直卡在那里。以上是 Migrate 操作的详细分析,下一节我们讨论 Resize。

优秀的个人博客,低调大师

Unshelve Instance 操作详解 - 每天5分钟玩转 OpenStack(39)

上一节我们 shelve instance 到 Glance,本节讨论如何通过 unshelve 操作恢复该 instance。 因为 Glance 中保存了 instance 的 image,unshelve 的过程其实就是通过该 image launch 一个新的 instance,nova-scheduler 也会调度合适的计算节点来创建该 instance。 instance unshelve 后可能运行在与 shelve 之前不同的计算节点上,但 instance 的其他属性(比如 flavor,IP 等)不会改变。 下面是 Unshelve instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-scheduler 执行调度 nova-scheduler 发送消息 nova-compute 执行操作 下面我们详细讨论每一个步骤。 向 nova-api 发送请求 客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:“帮我 Unshelve 这个 Instance” 查看日志 /opt/stack/logs/n-api.log nova-api 发送消息 nova-api 向 Messaging(RabbitMQ)发送了一条消息:“unshelve 这个 Instance” 查看源代码 /opt/stack/nova/nova/compute/api.py,方法是 unshelve。 nova-scheduler 执行调度 nova-scheduler 收到消息后,会为 instance 选择合适的计算节点。 查看日志 /opt/stack/logs/n-sch.log 经过筛选,最终 devstack-controller 被选中 launch instance。 nova-scheduler 发送消息 nova-scheduler 发送消息,告诉被选中的计算节点可以 launch instance 了 源代码在 /opt/stack/nova/nova/scheduler/filter_scheduler.py 第 95 行,方法为 select_destinations nova-compute 执行操作 nova-compute 执行 unshelve 的过程与 launch instance 非常类似。 一样会经过如下几个步骤: 1. 为 instance 准备 CPU、内存和磁盘资源 2. 创建 instance 镜像文件 3. 创建 instance 的 XML 定义文件 4. 创建虚拟网络并启动 instance 日志记录在 /opt/stack/logs/n-cpu.log,分析留给大家练习。 以上就是 Unshelve 操作的分析,下一节我们讨论 Migrate 操作。

优秀的个人博客,低调大师

Shelve Instance 操作详解 - 每天5分钟玩转 OpenStack(38)

Instance 被 Suspend 后虽然处于 Shut Down 状态,但 Hypervisor 依然在宿主机上为其预留了资源,以便在以后能够成功 Resume。 如果希望释放这些预留资源,可以使用 Shelve 操作。 Shelve 会将 instance 作为 image 保存到 Glance 中,然后在宿主机上删除该 instance。 下面是 shelve instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-compute 执行操作 下面我们详细讨论每一个步骤。 向 nova-api 发送请求 客户(可以是 OpenStack 最终用户,也可以是其他程序)向API(nova-api)发送请求:“帮我 shelve 这个 Instance” 查看日志 /opt/stack/logs/n-api.log nova-api 发送消息 nova-api 向 Messaging(RabbitMQ)发送了一条消息:“shelve 这个 Instance” 查看源代码 /opt/stack/nova/nova/compute/api.py,方法是 shelve。 nova-compute 执行操作 查看日志 /opt/stack/logs/n-cpu.log 首先,关闭 instance 然后对 instance 执行 snapshot 操作 成功后,snapshot 生成的 image 会保存在 Glance 上,命名为 <instance name>-shelved 最后删除 instance 在宿主机上的资源 暂停操作成功执行后,instance 的状态变为 Shelved Offloaded,电源状态是 Shut Down 以上就是 Shelve 操作的分析,下一节我们讨论 Unshelve 操作。

优秀的个人博客,低调大师

Rebuild Instance 操作详解 - 每天5分钟玩转 OpenStack(37)

上一节我们讨论了 snapshot,snapshot 的一个重要作用是对 instance 做备份。 如果 instance 损坏了,可以通过 snapshot 恢复,这个恢复的操作就是 Rebuild。 Rebuild 会用 snapshot 替换 instance 当前的镜像文件,同时保持 instance 的其他诸如网络,资源分配属性不变。 下面是 rebuild instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-compute 执行操作 下面我们详细讨论每一个步骤。 向 nova-api 发送请求 客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:“Rebuild 这个 Instance” 选择用于恢复的 image 查看日志/opt/stack/logs/n-api.log nova-api 发送消息 nova-api 向 Messaging(RabbitMQ)发送了一条消息:“Rebuild 这个 Instance” 源代码在 /opt/stack/nova/nova/compute/api.py,方法是 rebuild。 nova-compute 执行操作 查看日志 /opt/stack/logs/n-cpu.log 关闭 instance 下载新的 image,并准备 instance 的镜像文件 启动 instance Rebuild 后,GUI 显示 instance 已经使用新的 image 以上就是 Rebuild 操作的分析,下一节我们讨论 Shelve 操作。

优秀的个人博客,低调大师

Snapshot Instance 操作详解 - 每天5分钟玩转 OpenStack(36)

本节我们通过日志详细讨论 instance 的 snapshot 操作。 有时候操作系统损坏得很严重,通过 Rescue 操作无法修复,那么我们就得考虑通过备份恢复了。当然前提是我们之前对instance做过备份。 Nova 备份的操作叫 Snapshot,其工作原理是对 instance 的镜像文件(系统盘)进行全量备份,生成一个类型为 snapshot 的 image,然后将其保存到 Glance 上。 从备份恢复的操作叫 Rebuild,将在下一节重点讨论。 下面是 snapshot instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-compute 执行操作 下面我们详细讨论每一个步骤。 向nova-api发送请求 客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:“对这个 Instance 做个快照” 查看日志 /opt/stack/logs/n-api.log nova-api 发送消息 nova-api 向 Messaging(RabbitMQ)发送了一条消息:“对这个 Instance 做快照” 源代码在 /opt/stack/nova/nova/compute/api.py,方法是 snapshot。 nova-compute 执行操作 查看日志 /opt/stack/logs/n-cpu.log 暂停 instance 对 instance 的镜像文件做快照 恢复 instance 将快照上传到 Glance Snapshot 成功保存在 Glance 中 instance 备份成功,下节我们讨论如何通过 snapshot 恢复。

优秀的个人博客,低调大师

Terminate Instance 操作详解 - 每天5分钟玩转 OpenStack(33)

本节通过日志详细分析 Nova Terminate 操作。 Terminate 操作就是删除 instance,下面是 terminate instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-compute 执行操作 下面我们详细讨论每一个步骤。 向 nova-api 发送请求 客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:“帮我删除这个 Instance” 查看日志 /opt/stack/logs/n-api.log nova-api 发送消息 nova-api 向 Messaging(RabbitMQ)发送了一条消息:“删除这个 Instance” 源代码在 /opt/stack/nova/nova/compute/api.py,方法是 _do_force_delete。 nova-compute 执行操作 查看日志 /opt/stack/logs/n-cpu.log 关闭 instance 删除 instance 的镜像文件 释放虚拟网络等其他资源 以上就是 terminate 的详细分析,下一节我们继续分析 Pause/Resume 操作。

优秀的个人博客,低调大师

Start Instance 操作详解 - 每天5分钟玩转 OpenStack(31)

本节通过日志文件详细分析 instance start 操作。 下面是 start instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-compute 执行操作 下面我们详细讨论每一个步骤。 向 nova-api 发送请求 客户(可以是 OpenStack 最终用户,也可以是其他程序)向API(nova-api)发送请求:“帮我启动这个 Instance” 查看日志 /opt/stack/logs/n-api.log nova-api 发送消息 nova-api 向 Messaging(RabbitMQ)发送了一条消息:“启动这个 Instance” 查看源代码 /opt/stack/nova/nova/compute/api.py 的 2002 行,方法是 start。 self.compute_rpcapi.start_instance() 的作用就是向 RabbitMQ 上 nova-compute 的消息队列里发送一条 start instance 的消息。 nova-compute 执行操作 查看日志 /opt/stack/logs/n-cpu.log 开始启动 准备虚拟网卡 准备 instance 的 XML 文件 准备 instance 镜像文件 成功启动 Start 操作的分析就得这里,下节继续讨论其他 nova 操作。

优秀的个人博客,低调大师

如何使用 OpenStack CLI - 每天5分钟玩转 OpenStack(22)

本节首先讨论 image 删除操作,然后介绍 OpenStack CLI 的使用方法,最后讨如何 Troubleshoot。 Web UI删除 image admin 登录后,Project -> Compute -> Images在列表中选择格式为 ARI 和 AKI 的 image,点击 点击确认删除 操作成功 CLI删除 image 设置环境变量 查询现有image 删除image 如何使用 OpenStack CLI OpenStack 服务都有自己的 CLI。 命令很好记,就是服务的名字,比如 Glance 就是 glance,Nova 就是 nova。 但 Keystone 比较特殊,现在是用 openstack 来代替老版的 keystone 命令。 比如查询用户列表,如果用 keystone user-list 会提示 keystone 已经 deprecated 了。 用 openstack 命令代替 不同服务用的命令虽然不同,但这些命令使用方式却非常类似,可以举一反三。 1. 执行命令之前,需要设置环境变量。 这些变量包含用户名、Project、密码等; 如果不设置,每次执行命令都必须设置相关的命令行参数 2. 各个服务的命令都有增、删、改、查的操作 其格式是 CMD <obj>-create [parm1] [parm2]… CMD <obj>-delete [parm] CMD <obj>-update [parm1] [parm2]… CMD <obj>-list CMD <obj>-show [parm] 例如 glance 管理的是 image,那么: CMD 就是 glance;obj 就是 image 对应的命令就有 glance image-create glance image-delete glance image-update glance image-list glance image-show 再比如 neutron 管理的是网络和子网等,那么: CMD 就是 neutron;obj 就是 net 和 subnet 对应的命令就有 网络相关操作 neutron net-create neutron net -delete neutron net -update neutron net -list neutron net –show 子网相关操作 neutron subnet-create neutron subnet -delete neutron subnet -update neutron subnet -list neutron subnet–show 有的命令<obj>可以省略,比如 nova 下面的操作都是针对 instance nova boot nova delete nova list nova show 3. 每个对象都有 ID delete,show 等操作都以 ID 为参数,例如 4. 可用 help 查看命令的用法 除了 delete,show 等操作只需要 ID 一个参数,其他操作可能需要更多的参数,用 help 查看所需的参数,格式是 CMD help [SUB-CMD] 例如查看 glance 都有哪些 SUB-CMD 查看 glance image-update 的用法 如何 Troubleshooting OpenStack 排查问题的方法主要是通过日志,Service 都有自己单独的日志。 Glance 主要有两个日志,glance_api.log 和 glance_registry.log,保存在 /opt/stack/logs/ 目录里。 devstack 的 screen 窗口已经帮我们打开了这两个日志,可以直接查看 g-api 窗口显示 glance-api 日志,记录 REST API 调用情况 g-reg 窗口显示 glance-registry 日志,记录 Glance 服务处理请求的过程以及数据库操作 如果需要得到最详细的日志信息,可以在 /etc/glance/*.conf 中打开 debug 选项。 devstack 默认已经打开了 debug。 在非 devstack 安装中,日志在 /var/log/glance/ 目录里。下节我们开始学习 Nova。

优秀的个人博客,低调大师

通过例子学习 Keystone - 每天5分钟玩转 OpenStack(19)

上一节介绍了 Keystone 的核心概念。本节我们通过“查询可用 image”这个实际操作让大家对这些概念建立更加感性的认识。 User admin 要查看 Project 中的 image 第 1 步 登录 当点击时,OpenStack 内部发生了哪些事情?请看下面 Token 中包含了 User 的 Role 信息 第 2 步 显示操作界面 请注意,顶部显示 admin 可访问的 Project 为 “admin” 和 “demo”。 其实在此之前发生了一些事情: 同时,admin 可以访问 Intance, Volume, Image 等服务 这是因为 admin 已经从 Keystone 拿到了各 Service 的 Endpoints 第 3 步 显示 image 列表 点击 “Images”,会显示 image 列表 背后发生了这些事: 首先,admin 将请求发送到 Glance 的 Endpoint Glance 向 Keystone 询问 admin 身份的有效性。 接下来 Glance 会查看 /etc/glance/policy.json。 判断 admin 是否有查看 image 的权限 权限判定通过,Glance 将 image 列表发给 admin。 Troubleshoot OpenStack 排查问题的方法主要是通过日志。 每个 Service 都有自己的日志文件。 Keystone 主要有两个日志: keystone.log 和 keystone_access.log 保存在 /var/log/apache2/ 目录里。 devstack 的 screen 窗口已经帮我们打开了这两个日志。 可以直接查看: 如果需要得到最详细的日志信息,可以在 /etc/keystone/keystone.conf 中打开 debug 选项 在非 devstack 安装中,日志可能在 /var/log/keystone/ 目录里。Keystone 就到这里,下一节我们开始学习 Glance。

优秀的个人博客,低调大师

云计算与 OpenStack - 每天5分钟玩转 OpenStack(14)

“云计算” 算是近年来最热的词了。现在 IT 行业见面不说这三个字您都不好意思跟人家打招呼。 对于云计算,学术界有各种定义,大家有兴趣可以百度一下。 CloudMan 这里主要想从技术的角度谈谈对云计算的理解。 基本概念 所有的新事物都不是突然冒出来的,都有前世和今生。 云计算也是IT技术不断发展的产物。 要理解云计算,需要对IT系统架构的发展过程有所认识。 请看下图 IT系统架构的发展到目前为止大致可以分为3个阶段: 物理机架构这一阶段,应用部署和运行在物理机上。 比如企业要上一个ERP系统,如果规模不大,可以找3台物理机,分别部署Web服务器、应用服务器和数据库服务器。 如果规模大一点,各种服务器可以采用集群架构,但每个集群成员也还是直接部署在物理机上。 我见过的客户早期都是这种架构,一套应用一套服务器,通常系统的资源使用率都很低,达到20%的都是好的。 虚拟化架构摩尔定律决定了物理服务器的计算能力越来越强,虚拟化技术的发展大大提高了物理服务器的资源使用率。 这个阶段,物理机上运行若干虚拟机,应用系统直接部署到虚拟机上。 虚拟化的好处还体现在减少了需要管理的物理机数量,同时节省了维护成本。 云计算架构 虚拟化提高了单台物理机的资源使用率,随着虚拟化技术的应用,IT环境中有越来越多的虚拟机,这时新的需求产生了: 如何对IT环境中的虚拟机进行统一和高效的管理。 有需求就有供给,云计算登上了历史舞台。 计算(CPU/内存)、存储和网络是 IT 系统的三类资源。 通过云计算平台,这三类资源变成了三个池子。 当需要虚机的时候,只需要向平台提供虚机的规格。 平台会快速从三个资源池分配相应的资源,部署出这样一个满足规格的虚机。 虚机的使用者不再需要关心虚机运行在哪里,存储空间从哪里来,IP是如何分配,这些云平台都搞定了。 云平台是一个面向服务的架构,按照提供服务的不同分为 IaaS、PaaS 和 SaaS。 请看下图 IaaS(Infrastructure as a Service)提供的服务是虚拟机。 IaaS 负责管理虚机的生命周期,包括创建、修改、备份、启停、销毁等。 使用者从云平台得到的是一个已经安装好镜像(操作系统+其他预装软件)的虚拟机。 使用者需要关心虚机的类型(OS)和配置(CPU、内存、磁盘),并且自己负责部署上层的中间件和应用。 IaaS 的使用者通常是数据中心的系统管理员。 典型的 IaaS 例子有 AWS、Rackspace、阿里云等 PaaS(Platform as a Service)提供的服务是应用的运行环境和一系列中间件服务(比如数据库、消息队列等)。 使用者只需专注应用的开发,并将自己的应用和数据部署到PaaS环境中。 PaaS负责保证这些服务的可用性和性能。 PaaS的使用者通常是应用的开发人员。 典型的 PaaS 有 Google App Engine、IBM BlueMix 等 SaaS(Software as a Service)提供的是应用服务。 使用者只需要登录并使用应用,无需关心应用使用什么技术实现,也不需要关系应用部署在哪里。 SaaS的使用者通常是应用的最终用户。 典型的 SaaS 有 Google Gmail、Salesforce 等 云计算和 OpenStack OpenStack is a cloud operating system that controls large pools of compute, storage, and networking resources throughout a datacenter, all managed through a dashboard that gives administrators control while empowering their users to provision resources through a web interface. 以上是官网对 OpenStack 的定义,OpenStack 对数据中心的计算、存储和网络资源进行统一管理。 由此可见,OpenStack 针对的是 IT 基础设施,是 IaaS 这个层次的云操作系统。 下一节我们将正式开始 OpenStack 之旅。

优秀的个人博客,低调大师

动手实践 Linux VLAN - 每天5分钟玩转 OpenStack(13)

本节我们来看如何在实验环境中实施和配置如下 VLAN 网络 配置 VLAN 编辑 /etc/network/interfaces,配置 eth0.10、brvlan10、eth0.20 和 brvlan20。 下面用 vmdiff 展示了对 /etc/network/interfaces 的修改 重启宿主机,ifconfig 各个网络接口 用 brctl show 查看当前 Linux Bridge 的配置。 eth0.10 和 eth0.20 分别挂在 brvlan10 和 brvlan20上 了 在宿主机中已经提前创建好了虚机 VM1 和 VM2,现在都处于关机状态 配置 VM1 在 virt-manager 中将 VM1 的虚拟网卡挂到 brvlan10 上。 启动 VM1 查看 Bridge,发现 brvlan10 已经连接了一个 vnet0 设备 通过 virsh 确认这就是 VM1 的虚拟网卡。 配置VM2 类似的,将 VM2 的网卡挂在 brvlan20 上 启动 VM2 查看 Bridge,发现 brvlan20 已经连接了一个 vnet1 设备 通过 virsh 确认这就是 VM2 的虚拟网卡。 验证 VLAN 的隔离性 为了验证 VLAN10 和 VLAN20 之间的隔离,我们为 VM1 和 VM2 配置同一网段的 IP。 配置 VM1 的 IP 配置 VM2 的 IP Ping 测试结果: VM1 与 VM2 是不通的 原因如下: 1. VM2 向 VM1 发 Ping 包之前,需要知道 VM1 的 IP 192.168.100.10 所对应的 MAC 地址。VM2 会在网络上广播 ARP 包,其作用就是问 “谁知道 192.168.100.10 的 MAC 地址是多少?” 2. ARP 是二层协议,VLAN 的隔离作用使得 ARP 只能在 VLAN20 范围内广播,只有 brvlan20 和 eth0.20 能收到,VLAN10 里的设备是收不到的。VM1 无法应答 VM2 发出的ARP包。 3. VM2 拿不到 VM1 vnet0 的 MAC 地址,也就 Ping 不到 VM1。 Linux Bridge + VLAN = 虚拟交换机 现在对 KVM 的网络虚拟化做个总结。 物理交换机存在多个 VLAN,每个 VLAN 拥有多个端口。 同一 VLAN 端口之间可以交换转发,不同 VLAN 端口之间隔离。 所以交换机其包含两层功能:交换与隔离。 Linux 的 VLAN 设备实现的是隔离功能,但没有交换功能。 一个 VLAN 母设备(比如 eth0)不能拥有两个相同 ID 的 VLAN 子设备,因此也就不可能出现数据交换情况。 Linux Bridge 专门实现交换功能。 将同一 VLAN 的子设备都挂载到一个 Bridge 上,设备之间就可以交换数据了。 总结起来,Linux Bridge 加 VLAN 在功能层面完整模拟现实世界里的二层交换机。 eth0 相当于虚拟交换机上的 trunk 口,允许 vlan10 和 vlan20 的数据通过 eth0.10,vent0 和 brvlan10 都可以看着 vlan10 的 access 口 eth0.20,vent1 和 brvlan20 都可以看着 vlan20 的 access 口

优秀的个人博客,低调大师

Linux 如何实现 VLAN - 每天5分钟玩转 OpenStack(12)

LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机。一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在同一个 LAN 中。 一个 LAN 表示一个广播域。 其含义是:LAN 中的所有成员都会收到任意一个成员发出的广播包。 VLAN 表示 Virtual LAN。一个带有 VLAN 功能的switch 能够将自己的端口划分出多个 LAN。计算机发出的广播包可以被同一个 LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。 简单地说,VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。 比方说,有两组机器,Group A 和 B。我们想配置成 Group A 中的机器可以相互访问,Group B 中的机器也可以相互访问,但是 A 和 B 中的机器无法互相访问。 一种方法是使用两个交换机,A 和 B 分别接到一个交换机。 另一种方法是使用一个带 VLAN 功能的交换机,将 A 和 B 的机器分别放到不同的 VLAN 中。 请注意,VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越 VLAN 的边界。但在三层上(比如IP)是可以通过路由器让 A 和 B 互通的。概念上一定要分清。 现在的交换机几乎都是支持 VLAN 的。 通常交换机的端口有两种配置模式: Access 和 Trunk。看下图 Access 口这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。 不同 VLAN 用 VLAN ID 来区分,VLAN ID 的 范围是 1-4096。 Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access 口后就被打上了所在 VLAN 的标签。 Access 口只能属于一个 VLAN。 Trunk 口假设有两个交换机 A 和 B。 A 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);B 上也有 VLAN1、2、3 那如何让 AB 上相同 VLAN 之间能够通信呢? 办法是将 A 和 B 连起来,而且连接 A 和 B 的端口要允许 VLAN1、2、3 三个 VLAN 的数据都能够通过。这样的端口就是Trunk口了。 VLAN1、2、3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的 VLAN 标签。 了解了 VLAN 的概念之后,我们来看 KVM 虚拟化环境下是如何实现 VLAN 的。还是先看图, eth0 是宿主机上的物理网卡,有一个命名为 eth0.10 的子设备与之相连。 eth0.10 就是 VLAN 设备了,其 VLAN ID 就是 VLAN 10。 eth0.10 挂在命名为 brvlan10 的 Linux Bridge 上,虚机 VM1 的虚拟网卡 vent0 也挂在 brvlan10 上。 这样的配置其效果就是: 宿主机用软件实现了一个交换机(当然是虚拟的),上面定义了一个 VLAN10。 eth0.10,brvlan10 和 vnet0 都分别接到 VLAN10 的 Access口上。而 eth0 就是一个 Trunk 口。VM1 通过 vnet0 发出来的数据包会被打上 VLAN10 的标签。 eth0.10 的作用是:定义了 VLAN10 brvlan10 的作用是:Bridge 上的其他网络设备自动加入到 VLAN10 中 我们再增加一个 VLAN20,见下图 这样虚拟交换机就有两个 VLAN 了,VM1 和 VM2 分别属于 VLAN10 和 VLAN20。 对于新创建的虚机,只需要将其虚拟网卡放入相应的 Bridge,就能控制其所属的 VLAN。 VLAN 设备总是以母子关系出现,母子设备之间是一对多的关系。 一个母设备(eth0)可以有多个子设备(eth0.10,eth0.20 ……),而一个子设备只有一个母设备。下一节我们通过实验来实践 VLAN。

优秀的个人博客,低调大师

理解 virbr0 - 每天5分钟玩转 OpenStack(11)

virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。 virbr0 默认分配了一个IP 192.168.122.1,并为连接其上的其他虚拟网卡提供 DHCP 服务。 下面我们演示如何使用 virbr0。 在 virt-manager 打开 VM1 的配置界面,网卡 Source device 选择 “default”,将 VM1 的网卡挂在 virbr0 上。 启动 VM1,brctl show 可以查看到 vnet0 已经挂在了 virbr0 上。 # brctl show bridge name bridge id STP enabled interfaces br0 8000.000c298decbe no eth0 virbr0 8000.fe540075dd1a yes vnet0 用 virsh 命令确认 vnet 就是 VM1 的虚拟网卡。 # virsh domiflist VM1 Interface Type Source Model MAC ------------------------------------------------------- vnet0 network default rtl8139 52:54:00:75:dd:1a virbr0 使用 dnsmasq 提供 DHCP 服务,可以在宿主机中查看该进程信息 # ps -elf|grep dnsmasq 5 S libvirt+ 2422 1 0 80 0 - 7054 poll_s 11:26 ? 00:00:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf 在 /var/lib/libvirt/dnsmasq/ 目录下有一个 default.leases 文件,当 VM1 成功获得 DHCP 的 IP 后,可以在该文件中查看到相应的信息 # cat /var/lib/libvirt/dnsmasq/default.leases 1441525677 52:54:00:75:dd:1a 192.168.122.6 ubuntu * 上面显示 192.168.122.6 已经分配给 MAC 地址为 52:54:00:75:dd:1a 的网卡,这正是 vnet0 的 MAC。之后就可以使用该 IP 访问 VM1 了。 # ssh 192.168.122.6 root@192.168.122.6's password: Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.16.0-30-generic x86_64) Last login: Sun Sep 6 01:30:23 2015 root@VM1:~# ifconfig eth0 Link encap:Ethernet HWaddr 52:54:00:75:dd:1a inet addr:192.168.122.6 Bcast:192.168.122.255 Mask:255.255.255.0 inet6 addr: fe80::5054:ff:fe75:dd1a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:61 errors:0 dropped:0 overruns:0 frame:0 TX packets:66 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:7453 (7.4 KB) TX bytes:8649 (8.6 KB) Ping一下外网。 root@VM1:~# ping www.baidu.com PING www.a.shifen.com (180.97.33.107) 56(84) bytes of data. 64 bytes from 180.97.33.107: icmp_seq=1 ttl=52 time=36.9 ms 64 bytes from 180.97.33.107: icmp_seq=2 ttl=52 time=119 ms 64 bytes from 180.97.33.107: icmp_seq=3 ttl=52 time=88.5 ms 64 bytes from 180.97.33.107: icmp_seq=4 ttl=52 time=38.0 ms 64 bytes from 180.97.33.107: icmp_seq=5 ttl=52 time=122 ms 没有问题,可以访问外网,说明 NAT 起作用了。 需要说明的是,使用 NAT 的虚机 VM1 可以访问外网,但外网无法直接访问 VM1。 因为 VM1 发出的网络包源地址并不是 192.168.122.6,而是被 NAT 替换为宿主机的 IP 地址了。 这个与使用 br0 不一样,在 br0 的情况下,VM1 通过自己的 IP 直接与外网通信,不会经过 NAT 地址转换。 下节我们讨论 vlan 在 linux bridge 中的实现

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册