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》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...