/images/avatar.jpg

Kiosk Studio (2022)

使用Open-vSwitch创建虚拟网络

前面的文章 虚拟化-创建一个虚拟机 介绍了如何创建一个虚拟机,但是整个Iaas生态,网络的虚拟化也是非常大的一块。我们需要将同一台物理机上的虚拟机连通,虚拟机可以上网,甚至还需要将不同物理机上的虚拟机连通。 而 OpenvSwitch 就是为了上述需求而诞生的SDN软件。 OpenvSwtich OpenvSwitch (简称 OVS) 是一个用 C 语言开发的多层虚拟交换机。现如今基本上已经成为了开源 SDN(软件定义网络)基础设施层的事实标准。 OVS 支持功能 支持标准 802.1Q VLAN协议,允许端口配置trunk模式。 支持组播 支持多种隧道协议(GRE、VXLAN、STT、Geneve 和 IPsec) 支持内核和用户空间的转发引擎选项 OVS的术语解释 Bridge 中文名称网桥,一个 Bridge 代表一个以太网交换机(Switch),一台主机可以创建一个或多个 Bridge,Bridge 可以根据一定的规则,把某一个端口接收到的数据报文转发到另一个或多个端口上,也可以修改或丢弃数据报文。 Port 交换机上的插口,可以接水晶头,Port隶属于 Bridge,必须先添加了 Bridge 才能在 Bridge 上添加 Port。 ​ Normal:用户可以把操作系统中已有的网卡添加到 OVS 上,OVS会自动生成一个同名的Port。此类型的 Port 常用于 VLAN 模式的多台物理主机相连的口,交换机的一端属于 Trunk 模式 ​ Internal:当Port的类型是 Internal 时,OVS会自动创建一个虚拟网卡(Interface),此端口收到的数据报文都会转发到这个网卡。 ​ Patch:Patch Port 和 veth pair 功能相同,总是成双成对的出现,在其中一端收到的数据报文会被转发到另一个 Patch Port 上,就像是一根网线一样,Patch Port 常用于链接两个 Bridge,使两个网桥合并成为一个网桥

虚拟化-创建一个虚拟机

现如今,随着云计算技术的越来越成熟,我们在腾讯云、阿里云上购买的服务器本质上都是虚拟机,这就需要在一台物理服务器上虚拟化出更多的虚拟机,还要让这些虚拟机能够弹性伸缩,实现跨主机迁移。 而虚拟化技术正是这些能力的基石,而其中的核心技术就是 KVM 虚拟化技术。 虚拟化 虚拟化的本质是一种资源管理的技术,它可以通过各种技术手段把计算机的实体资源(如:CPU、RAM、存储、网络、I/O 等等)进行抽象和转换,让这些资源可以重新分割、排列与组合,实现最大化使用物理资源的目的。 服务器上的虚拟化软件,多使用 qemu ,其中 emu 是 emulator 模拟器的意思。单纯使用 qemu 采用的是完全虚拟化模式。但是完全虚拟化是非常低效的,所以要使用硬件辅助的虚拟化技术 Interl-VT,AMD-V,所以需要CPU 硬件开启这个标志位,一般是在 BIOS 里面设置。 当开启了标注位后,通过 KVM ,GuestOS 的指令不再用 Qemu 转译,直接运行,大大提高了速度。 CPU 虚拟化 为什么需要 CPU 虚拟化 X86 操作系统是设计在直接运行在裸硬件上的,x86 架构提供4个特权级别给内核(操作系统)来访问硬件,Ring 是指 CPU 的运行级别,Ring 0 是最高级别,依次到 Ring3。以 Linux x86 来说 操作系统(内核)需要直接访问硬件和内存,因此它的代码需要直接运行在最高级别 Ring 0 上,这样它就可以使用特权指令去控制中断,修改页表,访问设备。 应用程序的代码运行在 Ring 3 上,如果需要访问硬件,必须通过系统调用,执行系统调用的时候,CPU 的运行级别会从 Ring3 切换到 Ring0 ,并跳转到系统调用对应的内核代码位置执行,完成后从 Ring3 回到 Ring0。这个过程就是用户态到内核态的转换。 那么,虚拟化在这里就遇到了一个难题。由于宿主机的操作系统工作于 Ring0,VM 客户机操作系统就不能再工作在 Ring0 上了,但是 VM 客户机的内核操作系统不知道这一点,以前执行什么指令,现在还是执行什么指令。但是没有执行权限会出错。这时 VMM(虚拟机管理程序)就要开始工作了,虚拟机通过 VMM 实现 Guest CPU 对硬件的访问,根据原理有三种实现技术:

认识 Openstack

最近机缘巧合,需要重新认识一下 openstack 这门技术,之前其实也接触过很多虚拟化的技术,但是不够统一,也打算将之前了解的虚拟化技术好好的回顾一遍。

一条MySQL查询语句经历了什么--事务

上篇文章介绍了MySQL的索引机制,基本上对MySQL如何优化查询速度做了比较充分的了解

第二篇文章介绍一下事务,事务不是 MySQL 的原生支持,而是 InnoDB 存储引擎带来的 Feature。旧版本MySQL的默认存储引擎 MyISAM 就不支持事务能力。正因为事物能力,MySQL 的功能越发强大,也是因为事务,MySQL经常存在和索引无关的很多慢查询。

eBPF超乎你想象

eBPF 是什么? eBPF:过去 50 年操作系统最大的变革!!! 在过去,如果想让应用程序处理网络数据包是不可能的,因为应用程序运行在Linux的用户空间,它是不能直接访问主机的网络缓冲区,这里由内核管理和保护。内核保证了进程隔离,进程只能通过系统调用(syscall)来获取自己的网络数据包信息。 1992 年的 USENIX 会议上,The BSD Packet Filter: A New Architecture for User-level Packet Capture ,第一次提到 BSD Packet Filter (简称BPF)这个概念,这篇论文带来了一个革命性技术。正如其名称他是包过滤相关的技术,其基本原理是用户态定义 BPF 字节码来定义过滤表达式,然后传递给内核,再由虚拟机解释运行。 有了 BPF 之后,应用程序不再需要 syscall,数据包不需要在内核空间和用户空间之间来回交互传递。而是我们将代码直接交给内核,让内核自己执行,这样就可以让代码全速运行,效率更高。 我们使用的 tcpdump 主要通过 libpcap 实现,而libpcap 就是基于 eBPF 。执行下面的命令,导出 tcpdump 所灌入内核的 BPF 程序。如下的 tcpdump 命令,可以直接过滤出IP地址包含 1.1.1.1 和 2.2.2.2 的数据包。 tcpdump -d 'ip src 1.1.1.1 or ip src 2.2.2.2' (000) ldh [12] # 找到以太网类型字段 (001) jeq #0x800 jt 2 jf 6 # 判断是否为以太网 (002) ld [26] # 判断IP头部 (003) jeq #0x1010101 jt 5 jf 4 (004) jeq #0x2020202 jt 5 jf 6 (005) ret #262144 (006) ret #0 1 2 3 4 5 6 7 8 9 // Filter BPF Code static struct sock_filter bpfcode[8] = { { 0x28, 0, 0, 0x0000000c }, // (000) ldh [12] xxxx }; sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); bind(sock, (struct sockaddr *) &addr, sizeof(addr)); setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &bpf, sizeof(bpf)); Linux 利用 socketopt 中的 SO_ATTACH_FILTER、SO_DETACH_FILTER 来执行系统调用,具体可参考 socket manual page。