Linux 网络虚拟化 Macvlan(基于物理网络接口虚拟网络接口) 认知
写在前面
- 博文内容涉及 Macvlan 的简单认知,以及一个Demo
- 博文内容根据
《 Kubernetes 网络权威指南:基础、原理与实践》整理 - 理解不足小伙伴帮忙指正
不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树
物理网卡的分身术:Macvlan
Macvlan(MAC Virtual LAN)是一种在 Linux 操作系统上实现的网络虚拟化技术。它允许您创建基于物理网络接口的虚拟网络接口,并为每个虚拟接口分配独立的 MAC 地址。每个 Macvlan 接口与物理网络接口(主接口)共享相同的物理网络连接,但具有不同的 MAC 地址,因此它们可以像独立的网络接口一样进行独立的网络通信。
通俗的来讲,macvlan 可以基于一个物理网卡设备,生成多个MAC地址和IP 地址不同的逻辑网卡
Macvlan五大工作模式解析
Macvlan出现之前,我们可以通过网卡别名(例如eth0:1)的方式为一块以太网卡添加多个IP地址,却不能为其添加多个MAC地址。原因是以太网卡是以MAC地址为唯一识别的,而网卡别名并没有改变这些网卡的MAC地址。
Macvlan 接口可以看作是物理以太网接口的虚拟子接口。Macvlan允许用户在主机的一个网络接口上配置多个虚拟的网络接口
每个Macvlan接口都有自己的区别于父接口的MAC地址,并且可以像普通网络接口一样分配IP地址。因此,使用Macvlan技术带来的效果是一块物理网卡上可以绑定多个IP地址,每个IP地址都有自己的MAC地址
用 Macvlan 虚拟出来的虚拟网卡,在逻辑上和物理网卡是对等的,应用程序可以像使用物理网卡的IP地址那样使用Macvlan 设备的 IP地址。
Macvlan 的主要用途是网络虚拟化(包括容器和虚拟机)。另外,有一些比较特殊的场景,例如,keepalived使用虚拟MAC地址。需要注意的是,使用Macvlan的虚拟机或者容器网络与主机在同一个网段,即同一个广播域中。
Macvlan支持5种模式,分别是bridge、VEPA、Private、Passthru和Source模式。
bridge模式
该模式类似 Linux bridge,是 Macvlan 最常用的模式,比较适合共享同一个父接口的Macvlan网卡进行直接通信的场景。
在 bridge 模式下,拥有相同父接口的两块 Macvlan 虚拟网卡可以直接通信,不需要把流量通过父接口发送到外部网络,广播帧将会被洪泛到连接在“网桥”上的所有其他子接口和物理接口。
网桥带双引号是因为实际上并没有网桥实体的产生,而是指在这些网卡之间数据流可以实现直接转发,这有点类似于
Linux网桥。
但Macvlan的bridge模式和Linux网桥不是一回事,它不需要学习MAC地址,也不需要生成树协议(STP),因此性能要优于Linux网桥。
用通俗的话理解,类似利用 Linux 网桥 建立了一个新的通道,允许 Macvlan 接口与物理网络中的其他设备进行通信,同时又保证了与物理网络的隔离
bridge模式的缺点是如果父接口故障,所有Macvlan子接口会跟着故障,子接口之间也将无法进行通信
VEPA模式
VEPA(Virtual Ethernet Port Aggregator,虚拟以太网端口聚合)是默认模式。
所有从Macvlan接口发出的流量,不管目的地址是什么,全部发送给父接口,类似于连接到一个特殊的交换机,这个交换机负责处理 Macvlan 接口与物理网络之间的通信,使得 Macvlan 接口可以与其他设备进行通信。
在二层网络下,由于生成树协议的原因,两个Macvlan接口之间的通信会被阻塞,这时就需要接入的外部交换机支持hairpin,把源和目的地址都是本地Macvlan接口地址的流量,发给相应的接口。
在VEPA模式下,从父接口收到的广播包会洪泛给所有的子接口。
目前,大多数交换机都不支持 hairpin 模式,但Linux可以通过一种hairpin模式的网桥,让VEPA模式下的 Macvlan接口能够直接通信,接下来,配置Linux网桥某个端口的hairpin模式:
brctl hairpin br0 eth0 on
以上命令的作用是配置Linux网桥br0,使得从eth0收到包后再从eth0发送出去。
以上brctl haripin子命令原型是:
irpin <bridge> <port> {on|off}
或者使用iproute2直接设置网卡的hairpin模式
ip link set dev eth0 hairpin on
也可以通过写sysfs目录下的设备文件设置网桥某个端口的hairpin模式。下面的例子设置了网桥br0的eth1端口的hairpin:
echo 1 > /sys/class/net/br0/brif/eth1/hairpin_mode
配置了 hairpin 后,源地址和目的地址都是本地 Macvlan 接口地址的流量,会被 Linux 网桥发回给相应的接口。
如果想在物理交换机层面对虚拟机或容器之间的访问流量进行优化设定,VEPA模式是一种比较好的选择。
Private模式
Private 模式类似于 VEPA 模式,但又增强了VEPA模式的隔离能力,其完全阻止共享同一父接口的Macvlan虚拟网卡之间的通信。即使配置了 hairpin,让从父接口发出的流量返回宿主机,相应的通信流量依然被丢弃。
就好像在一个封闭的空间里,Macvlan 接口只能与同一主机上的其他 Macvlan 接口进行通信,无法与外部网络中的设备进行通信
Private的具体实现方式是丢弃广播/多播数据,这就意味着以太网地址解析ARP将无法工作。除非手工探测 MAC 地址,否则通信将无法在同一宿主机下的多个Macvlan网卡间进行,如果需要Macvlan的隔离功能,那么Private模式会非常有用。
Passthru模式
Passthru模式翻译过来就是直通模式。在这种模式下,每个父接口只能和一个Macvlan网卡捆绑,并且Macvlan网卡继承父接口的MAC地址。就像是将数据包直接传递给物理网络设备,绕过了网络协议栈的处理,使得 Macvlan 接口可以直接与物理网络设备进行通信。
Source模式
在这种模式下,寄生在物理设备上,Macvlan 设备只接收指定的源 Mac 地址的数据包,其他数据包一概丢弃,使得 Macvlan 接口的 MAC 地址与该设备的 MAC 地址相同,并且只能与该设备进行通信
Macvlan 设备基本命令
在宿主机上创建 Macvlan 设备
ip link add veth2.1 link veth2 type macvlan mode bridge
ip link set veth2.1 up
查看该Macvlan网卡的详细信息:
ip -d link show eth0.1
一般情况下,Macvlan设备的MAC地址是Linux系统自动分配的,用户也可以自定义。使用以下命令就可在新建Macvlan网卡的同时指定其MAC地址:
ip link add eth0.1 link eth0 address f2:a7:fc:ac:59:c6 type macvlan mode vepa
root@cs-1080702884152-default:/home/liruilonger# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0veth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.26.3 netmask 255.255.255.0 broadcast 0.0.0.0inet6 fe80::f0e2:40ff:fe60:1190 prefixlen 64 scopeid 0x20<link>ether f2:e2:40:60:11:90 txqueuelen 1000 (Ethernet)RX packets 16 bytes 1244 (1.2 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 23 bytes 1830 (1.7 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0veth2.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet6 fe80::9093:55ff:fe97:7920 prefixlen 64 scopeid 0x20<link>ether 92:93:55:97:79:20 txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 7 bytes 586 (586.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Macvlan设备的跨机通信Demo
- A节点,IP地址为192.168.26.149;
- B节点,IP地址为192.168.26.106;
我们在A节点创建 macvlan 设备,与B节点的物理网卡进行通信
A 节点信息
┌──[root@liruilongs.github.io]-[~]
└─$ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:93:51:67 brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.26.149/24 brd 192.168.26.255 scope global dynamic noprefixroute ens160valid_lft 1792sec preferred_lft 1792secinet6 fe80::20c:29ff:fe93:5167/64 scope link noprefixroutevalid_lft forever preferred_lft forever
在 A 节点上创建Macvlan设备:
┌──[root@liruilongs.github.io]-[~]
└─$ip link add ens160.1 link ens160 type macvlan mode bridge
┌──[root@liruilongs.github.io]-[~]
└─$ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:93:51:67 brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.26.149/24 brd 192.168.26.255 scope global dynamic noprefixroute ens160valid_lft 1745sec preferred_lft 1745secinet6 fe80::20c:29ff:fe93:5167/64 scope link noprefixroutevalid_lft forever preferred_lft forever
4: ens160.1@ens160: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether aa:92:11:14:3c:34 brd ff:ff:ff:ff:ff:ff
Macvlan设备启用后会自动分配MAC地址而没有IP(v4)地址。为其分配IP地址。
┌──[root@liruilongs.github.io]-[~]
└─$ip addr add 192.168.26.141/24 dev ens160.1
┌──[root@liruilongs.github.io]-[~]
└─$ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:93:51:67 brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.26.149/24 brd 192.168.26.255 scope global dynamic noprefixroute ens160valid_lft 1710sec preferred_lft 1710secinet6 fe80::20c:29ff:fe93:5167/64 scope link noprefixroutevalid_lft forever preferred_lft forever
4: ens160.1@ens160: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether aa:92:11:14:3c:34 brd ff:ff:ff:ff:ff:ffinet 192.168.26.141/24 scope global ens160.1valid_lft forever preferred_lft forever
┌──[root@liruilongs.github.io]-[~]
└─$ip route
default via 192.168.26.2 dev ens160 proto dhcp src 192.168.26.149 metric 100
192.168.26.0/24 dev ens160 proto kernel scope link src 192.168.26.149 metric 100
┌──[root@liruilongs.github.io]-[~]
└─$ip link set ens160.1 up
使用新创建的 macvlan 设备 ping B 节点的IP
┌──[root@liruilongs.github.io]-[~]
└─$ping -c 3 -I ens160.1 192.168.26.106
PING 192.168.26.106 (192.168.26.106) from 192.168.26.141 ens160.1: 56(84) bytes of data.
64 bytes from 192.168.26.106: icmp_seq=1 ttl=64 time=0.692 ms
64 bytes from 192.168.26.106: icmp_seq=2 ttl=64 time=0.417 ms
64 bytes from 192.168.26.106: icmp_seq=3 ttl=64 time=0.363 ms--- 192.168.26.106 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2047ms
rtt min/avg/max/mdev = 0.363/0.490/0.692/0.144 ms
用当前的物理网卡 ping Macvlan 设备IP
┌──[root@liruilongs.github.io]-[~]
└─$ping -c 3 -I ens160 192.168.26.141
PING 192.168.26.141 (192.168.26.141) from 192.168.26.149 ens160: 56(84) bytes of data.
From 192.168.26.149 icmp_seq=1 Destination Host Unreachable
From 192.168.26.149 icmp_seq=2 Destination Host Unreachable
From 192.168.26.149 icmp_seq=3 Destination Host Unreachable--- 192.168.26.141 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2087ms
pipe 3
┌──[root@liruilongs.github.io]-[~]
└─$
在 B 节点使用 物理网卡对 A 节点的 Macvlan 设备 ping 测试
┌──[root@vms106.liruilongs.github.io]-[~]
└─$ping -c 3 192.168.26.141
PING 192.168.26.141 (192.168.26.141) 56(84) bytes of data.
64 bytes from 192.168.26.141: icmp_seq=1 ttl=64 time=0.548 ms
64 bytes from 192.168.26.141: icmp_seq=2 ttl=64 time=0.459 ms
64 bytes from 192.168.26.141: icmp_seq=3 ttl=64 time=0.430 ms--- 192.168.26.141 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2088ms
rtt min/avg/max/mdev = 0.430/0.479/0.548/0.050 ms
通过上面的测试可以发现, 桥接模式下,Macvlan 可以与同一网段的任一机器通信。
Macvlan是将虚拟机或容器通过二层连接到物理网络的一个不错的方案,但它也有一些局限性,例如:
- 每个虚拟网卡都要有自己的
MAC地址,所以Macvlan需要大量的MAC地址,而Linux主机连接的交换机可能会限制一个物理端口的MAC地址数量上限,而且许多物理网卡的MAC地址数量也有限制,超过这个限制就会影响到系统的性能; IEEE 802.11 标准(即无线网络)不喜欢同一个客户端上有多个MAC地址,这意味着你的Macvlan子接口没法在无线网卡上通信。
当然可以使用IPvlan 来解决上面的这些问题
博文部分内容参考
© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 😃
《 Kubernetes 网络权威指南:基础、原理与实践》
© 2018-2024 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)
相关文章:
Linux 网络虚拟化 Macvlan(基于物理网络接口虚拟网络接口) 认知
写在前面 博文内容涉及 Macvlan 的简单认知,以及一个Demo博文内容根据《 Kubernetes 网络权威指南:基础、原理与实践》 整理理解不足小伙伴帮忙指正 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前…...
Spark-Scala语言实战(1)
在之前的文章中,我们学习了如何在Linux安装Spark以及Scala,想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark及Scala的安装https:/…...
NBlog Java定时任务-备份MySQL数据
NBlog部署维护流程记录(持续更新):https://blog.csdn.net/qq_43349112/article/details/136129806 为了避免服务器被攻击,给博客添加了一个MySQL数据备份功能。 此功能是配合博客写的,有些方法直接用的已有的…...
微信小程序项目实战遇到的问题
我们以学生成绩平台来作为例子。这是我们想得到的效果。 以下是完整代码: index.js // index.js Page({//页面的初始数据data: {hello: 欢迎进入微信小程序的编程世界,score: 80,userArray: [{name: 张三,score: [66, 77, 86, 70, 90]},{name: 李四,score: [88, 7…...
网络原理(3)——TCP协议
目录 一、连接管理 二、三次握手 1、何为三次握手? 2、三次握手有何意义? 三、四次挥手 三次握手和四次挥手的相似之处和不同之处 (1)相似之处 (2)不同之处 四、TCP的状态 建立连接: 断开…...
nginx多级代理配置获取客户端真实ip
流量路径 #mermaid-svg-NX785p8k6RVBngHY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NX785p8k6RVBngHY .error-icon{fill:#552222;}#mermaid-svg-NX785p8k6RVBngHY .error-text{fill:#552222;stroke:#552222;}#…...
Django框架的全面指南:从入门到高级【第128篇—Django框架】
👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Django框架的全面指南:从入门到高级 Django是一个高效、功能强大的Python Web框…...
C++类和对象基础
目录 类的认识 访问限定符:public(公有),protected(保护),private(私有)。 类的两种定义方式: 类的实例化: 封装: 类的对象大小的计算: 类成员函数的this指针: C语言是面向过程的语言&am…...
消息队列常见的两种消费模式
一、点对点模式 点对点模式:生产者发送消息到消息队列,消费者从消息队列中接收、处理消息,消息被消费后,就不在消息队列中了。每个消息只能由一个消费者接收和处理。如果有多个消费者监听同一个队列,消息将被发送到其…...
php的伪协议详解
在 PHP 中,伪协议(pseudo-protocols)是一种特殊的语法,用于访问各种资源,如文件、网络、输入/输出流等。伪协议实际上并不是真正的协议,而是一种简便的语法,用于访问不同的资源类型。 以下是一…...
【研发日记】Matlab/Simulink技能解锁(四)——在Simulink Debugger窗口调试
文章目录 前言 Block断点 分解Block步进 Watch Data Value 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug》 见《【研发日记】Matlab/Simul…...
沪深主板打板胜率统计
统计了20100101以来的数据,以中信日K为数据来源。 计算方法: 选出每只股票 (收盘价-开盘价)/开盘价 >0.098的日期,然后往后取3天数据,如果3天内有一天能涨超0.2元,则认为打板成功。 总共打板: 52239次 胜: 43784次…...
Python中的列表推导式(List Comprehension)
Python中的列表推导式(List Comprehension)是一种强大且简洁的语法结构,用于快速创建列表。它通过一行代码就能完成原本需要多行代码才能实现的循环迭代与列表添加操作。列表推导式在Python中非常常用,它使得代码更加简洁、易读和…...
MusicHiFi: Fast High-Fidelity Stereo Vocoding
MusicHiFi: Fast High-Fidelity Stereo Vocoding 相关链接:arxiv github 关键字:音乐生成、高保真立体声、立体声编解码器、生成对抗网络、频带扩展 摘要 MusicHiFi是一种高效的高保真立体声编解码器,它通过将低分辨率的mel频谱图转换为音频…...
完美解决 RabbitMQ可视化界面Overview不显示折线图和队列不显示Messages
问题场景: 今天使用docker部署了一个RabbitMQ,浏览器打开15672可视化页面发送消息后不显示Overview中的折线图,还有队列中的Messages,因为我要看队列中的消息数量。 解决方案: 进入容器内部 docker exec -it 容器id…...
matlab 混沌系统李雅普洛夫指数谱相图分岔图和庞加莱界面
1、内容简介 略 65-可以交流、咨询、答疑 2、内容说明 matlab 混沌系统李雅普洛夫指数谱相图分岔图和庞加莱界面 混沌系统李雅普洛夫指数谱相图分岔图和庞加莱界面 李雅普洛夫指数谱、相图、分岔图、庞加莱界面 3、仿真分析 略 4、参考论文 略...
Linux-docker安装数据库mysql
1、拉去mysql镜像: docker pull mysql2、创建容器挂载路径 mkdir -p /usr/local/jiuxiang/mysql/data # 数据存储位置 mkdir -p /usr/local/jiuxiang/mysql/logs # 日志存储位置 mkdir -p /usr/local/jiuxiang/mysql/conf # 配置文件3、启动容器 docker run -…...
网工内推 | 七险一金,上市公司招信息安全工程师,大牛带队
01 启明星辰信息技术集团股份有限公司 招聘岗位:数据安全服务工程师 职责描述: 1、负责数据安全服务项目的管理,统筹组织并协调资源落实项目交付实施; 3、负责数据安全风险评估、数据分类分级、数据安全管理制度、数据安全体系规划等数据安…...
04.组件的组成和组件间通信
一、scoped解决样式冲突 1.默认情况: 写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。 全局样式: 默认组件中的样式会作用到全局,任何一个组件中都会受到此样式的影响 局部样式: 可以给组件加上scoped 属性,可以让样式只…...
【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理
欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
