Linux67 绑定网卡【bonding和team】

news2024/12/26 19:26:35

Linux 网卡绑定在RHEL 7 之前,网卡绑定常用的是bonding模块,在RHEL7开始,支持使用team作网卡绑定,但在RHEL7中,bonding依然可用。以下主要介绍bonding模块配置双网卡绑定。Linux网卡绑定模式介绍模式简介0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4

Linux 网卡绑定

在RHEL 7 之前,网卡绑定常用的是bonding模块,在RHEL7开始,支持使用team作网卡绑定,但在RHEL7中,bonding依然可用。以下主要介绍bonding模块配置双网卡绑定。

Linux网卡绑定模式介绍

模式简介

0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4 for 802.3ad, 5 for balance-tlb, 6 for balance-alb

常用的有三种模式

mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。

mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。

mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定。

mode=4 需要支持802.3ad。

mode5和mode6不需要交换机端的设置,网卡能自动聚合,因为做bonding的这两块网卡是使用不同的MAC地址。

模式详细说明

  1. mode=0(balance-rr)(平衡抡循环策略)
    链路负载均衡,增加带宽,支持容错,一条链路故障会自动切换正常链路。交换机需要配置聚合口,思科叫port channel。
    特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环下去,直到最后一个传输完毕),此模式提供负载平衡和容错能力;但是我们知道如果一个连接
    或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降

  2. mode=1(active-backup)(主-备份策略)
    这个是主备模式,只有一块网卡是active,另一块是备用的standby,所有流量都在active链路上处理,交换机配置的是捆绑的话将不能工作,因为交换机往两块网卡发包,有一半包是丢弃的。
    特点:只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见得,从外面看来,bond的MAC地址是唯一的,以避免switch(交换机)发生混乱。
    此模式只提供了容错能力;由此可见此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N

  3. mode=2(balance-xor)(平衡策略)
    表示XOR Hash负载分担,和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy,需要交换机配置port channel)
    特点:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能力

  4. mode=3(broadcast)(广播策略)
    表示所有包从所有网络接口发出,这个不均衡,只有冗余机制,但过于浪费资源。此模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题。需要和交换机的聚合强制不协商方式配合。
    特点:在每个slave接口上传输每个数据包,此模式提供了容错能力

  5. mode=4(802.3ad)(IEEE 802.3ad 动态链接聚合)
    表示支持802.3ad协议,和交换机的聚合LACP方式配合(需要xmit_hash_policy).标准要求所有设备在聚合操作时,要在同样的速率和双工模式,而且,和除了balance-rr模式外的其它bonding负载均衡模式一样,任何连接都不能使用多于一个接口的带宽。
    特点:创建一个聚合组,它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。
    外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的 是,并不是所有的传输策略都是802.3ad适应的,
    尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应 性。
    必要条件:
    条件1:ethtool支持获取每个slave的速率和双工设定
    条件2:switch(交换机)支持IEEE 802.3ad Dynamic link aggregation
    条件3:大多数switch(交换机)需要经过特定配置才能支持802.3ad模式

  6. mode=5(balance-tlb)(适配器传输负载均衡)
    是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。该模式要求slave接口的网络设备驱动有某种ethtool支持;而且ARP监控不可用。
    特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
    必要条件:
    ethtool支持获取每个slave的速率

  7. mode=6(balance-alb)(适配器适应性负载均衡)
    在5的tlb基础上增加了rlb(接收负载均衡receive load balance).不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的.
    特点:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance, rlb),而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
    来自服务器端的接收流量也会被均衡。当本机发送ARP请求时,bonding驱动把对端的IP信息从ARP包中复制并保存下来。当ARP应答从对端到达 时,bonding驱动把它的硬件地址提取出来,并发起一个ARP应答给bond中的某个slave。
    使用ARP协商进行负载均衡的一个问题是:每次广播 ARP请求时都会使用bond的硬件地址,因此对端学习到这个硬件地址后,接收流量将会全部流向当前的slave。这个问题可以通过给所有的对端发送更新 (ARP应答)来解决,应答中包含他们独一无二的硬件地址,从而导致流量重新分布。
    当新的slave加入到bond中时,或者某个未激活的slave重新 激活时,接收流量也要重新分布。接收的负载被顺序地分布(round robin)在bond中最高速的slave上
    当某个链路被重新接上,或者一个新的slave加入到bond中,接收流量在所有当前激活的slave中全部重新分配,通过使用指定的MAC地址给每个 client发起ARP应答。下面介绍的updelay参数必须被设置为某个大于等于switch(交换机)转发延时的值,从而保证发往对端的ARP应答 不会被switch(交换机)阻截。
    必要条件:
    条件1:ethtool支持获取每个slave的速率;
    条件2:底层驱动支持设置某个设备的硬件地址,从而使得总是有个slave(curr_active_slave)使用bond的硬件地址,同时保证每个bond 中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的 curr_active_slave接管
    其实mod=6与mod=0的区别:mod=6,先把eth0流量占满,再占eth1,….ethX;而mod=0的话,会发现2个口的流量都很稳定,基本一样的带宽。而mod=6,会发现第一个口流量很高,第2个口只占了小部分流量。


RHEL 6 网卡绑定操作

验证bonding模块

[root@rac1 ~]# modprobe bonding
[root@rac1 ~]# lsmod |grep  bonding
[root@rac1 ~]# modinfo  bonding
filename:       /lib/modules/4.1.12-94.3.9.el7uek.x86_64/kernel/drivers/net/bonding/bonding.ko
author:         Thomas Davis, tadavis@lbl.gov and many others
description:    Ethernet Channel Bonding Driver, v3.7.1
version:        3.7.1
license:        GPL
alias:          rtnl-link-bond
srcversion:     F8D6873B85C4EE219C56662
depends:        
intree:         Y
vermagic:       4.1.12-94.3.9.el7uek.x86_64 SMP mod_unload modversions 
signer:         Oracle CA Server
sig_key:        87:3F:B2:2B:C5:C1:07:C3:48:F2:D8:5F:43:D7:D7:ED:5D:62:3C:98
sig_hashalgo:   sha512

创建bonding模块配置

[root@rac1 network-scripts]# vi /etc/modprobe.d/bonding.conf 
 --给新创建的bonding.conf中写入:
alias bond0 bonding
options bonding  miimon=100 mode=1

--// miimon 表示每间隔多少毫秒(ms)监控一次bond0
--// mode 表示要创建的bond0网卡的负载模式

创建bonding网卡配置文件

[root@rac1 network-scripts]# cat > /etc/sysconfig/network-scripts/ifcfg-bond0 <<EOF
DEVICE=bond0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
DNS1=114.114.114.114
IPV6INIT=no
USERCTL=no
EOF

修改物理网卡配置文件

[root@rac1 network-scripts]# cat >> /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
BOOTPROTO=none
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes
--取消此配置文件中的IP相关设置
[root@rac1 network-scripts]# cat >> /etc/sysconfig/network-scripts/ifcfg-eth1 <<EOF
BOOTPROTO=none
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes
--取消此配置文件中的IP相关设置

重启网络

--//重新加载bonding模块,如果修改了bonding.conf之后,需要重新加载
# modprobe -r bonding   

--//重启网络
# service restart network

--//验证bonding状态
# cat /proc/net/bonding/bond0 

独立修改bonding参数

在系统” /sys/class/net/bond/bonding/* ” 目录下,可以单独设置关于bonding的参数。(修改这些参数前,需要停用bonding网卡)

# ifconfig down bond0
# echo 1000 >  /sys/class/net/bond/bonding/miimon
# echo 6 >  /sys/class/net/bond/bonding/mode
# echo balance-alb >  /sys/class/net/bond/bonding/mode
--// 其中mode可以设置为以下数字或字符:
	0 for balance-rr
	1 for active-backup
	2 for balance-xor
	3 for broadcast
	4 for 802.3ad
	5 for balance-tlb
	6 for balance-alb

RHEL 7网卡绑定操作(bonding)

可以使用类似RHEL 6中的,直接修改ifcfg配置文件做bonding,也可以使用NetworkManager工具配置bonding。

RHEL 7开始,bonding已弃用了/etc/modprobe.d/bonding.conf和/etc/modprobe.conf配置bonding

验证bonding模块

与6的相同

方式1:使用修改配置文件的方式

  1. 禁用NetworkManager服务
# systemctl stop NetworkManager
# systemctl disable NetworkManager
# systemctl status NetworkManager
  1. 创建bond0网卡配置文件
# vi /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
TYPE=bond			--//RHEL7中与6的参数不同,必须为bond
NAME=bond0
BONDING_MASTER=yes
BOOTPROTO=static
USERCTL=no
ONBOOT=yes
IPADDR=192.168.0.1
PREFIX=24
GATEWAY=192.168.0.254
DNS=114.114.114.114
BONDING_OPTS="miimon=100 mode=1"
  1. 修改物理网卡配置文件
# vi /etc/sysconfig/network-scripts/ifcfg-ens192
NAME=ens192
DEVICE=ens192
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
DEFROUTE=yes
MASTER=bond0
SLAVE=yes
# vi /etc/sysconfig/network-scripts/ifcfg-ens210
NAME=ens210
DEVICE=ens210
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
DEFROUTE=yes
MASTER=bond0
SLAVE=yes
  1. 重启网络
# modprobe -r bonding
# systemctl restart network
# cat /proc/net/bonding/bond0

方式2:使用nmcli工具的方式

  1. 查看物理网卡信息
# nmcli device
  1. 查看网卡连接信息
# nmcli connection show 
  1. 删除已有connection的物理网卡信息
# nmcli connection delete ens192
# nmcli connection delete ens224
# nmcli connection show

  1. 创建绑定网卡bond0 并设置IP地址
# nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode active-backup primary ens192 ipv4.addresses 192.168.201.231/24


# nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode active-backup primary ens192 ipv4.method manual ipv4.addresses 192.168.201.232/24 ipv4.gateway 192.168.201.254
--//如果使用第二个语句创建bond0,就可以不需要使用下文“7.修改bond0网卡参数”
  1. 创建bond0的子接口
# nmcli connection add type bond-slave ifname ens192 con-name bond0-ens192 master bond0 
# nmcli connection add type bond-slave ifname ens224 con-name bond0-ens224 master bond0 
  1. 查看已激活的网络接口
# nmcli connection show --active 

  1. 修改bond0网卡参数
# nmcli connection modify bond0 ipv4.method manual		--如果不修改此项,则bond0网卡因为bootproto 参数为DHCP而无法UP

# nmcli connection modify bond0 ipv4.gateway 192.168.201.254

如果bond0及其子接口有未激活的,手动激活。

  1. 激活网络接口
# nmcli connection up bond0-ens192
# nmcli connection up bond0-ens224
# nmcli connection up bond0
  1. 查看bond0状态
# cat /proc/net/bonding/bond0

方式3:视图nmtui工具

# nmtui

nmtui参考链接

–//nmtui待完善

RHEL 7网卡绑定(Team)

了解网络成组

联合或合并网络连接,以提供具有较高吞吐量的本地连接或冗余的方式可称为“频道绑定”、“以太网绑定”、“端
口聚合”、“频道成组”、“NIC 成组”、“链接合并” 等等。这个最初在 Linux 内核中应用的概念泛指“绑定”。现使
用网络成组(Network Teaming)代表这个概念的最新应用。这不会影响现有的绑定驱动程序,网络成组会作
为备选方法提供,且不会替换 Red Hat Enterprise Linux 7 中的绑定。

  • team驱动

网络成组或成组旨在通过提供小内核驱动程序,以便使用不同的方法应用这个概念,实现数据包流的快速处理,并让各种用户空间应用程序在用户空间执行各种任务。该驱动程序有一个应用程序编程接口(API),即“成组 Netlink API”,可使用该接口进行 Netlink 通讯。用户空间程序库使用这个 API 与该驱动程序通讯。库指的是 “lib”,可用来进行成组 Netlink 通讯及 RT Netlink 信息在用户空间的换行。

  • teamd守护进程

该守护进程通过使用附加代码(即 “运行程序”)采用负载平衡及 active-backup 逻辑(比如轮询)。通过使用这个方式分离代码,可方便网络成组对负载平衡及冗余要求的扩展及延伸解决方案。例如:使用 teamd 编写自定义运行程序应用新的逻辑可相对简单,即使 teamd 为自选程序,用户仍可编写其自己的应用程序以便使用 libteam。

  • teamctl管理工具

teamdctl 提供一个用来控制使用 D-bus 运行 teamd 实例的工具。它可为 teamd D-Bus API 提供 D-Bus 换行程序。默认情况下,teamd 使用 Unix 域套接字(Unix Domain Socket)进行侦听和通讯,但仍监控 D-Bus。这样做是保证能够在没有 D-Bus 或者尚未载入 D-Bus 的环境中使用 teamd。例如:引导 teamd 链接时不一定载入 D-Bus。可在运行时使用 teamdctl 工具读取配置、连接监控程序状态、端口状态检查及变更、添加和删除端口以及将端口状态在 active 和 backup 状态间切换。

安装teamd daemon

# yum install -y teamd

方式1:使用nmcli配置网络成组

  1. 查看当前的网络连接信息
[root@localhost ~]# nmcli conn show 
NAME                UUID                                  TYPE      DEVICE 
ens33               701ebac7-b4c5-44ac-9707-022b7ec7973f  ethernet  ens33  
Wired connection 1  9a8854d6-36b3-3afe-adb9-fa2cf8916e03  ethernet  ens34  
Wired connection 2  0e11da32-2ab3-3041-9fc0-432788a1852c  ethernet  ens37
  1. 创建team网络接口
[root@localhost ~]# nmcli conn add type team con-name cteam0 ifname iteam0 config '{"runner":{"name":"activebackup"}}'
Connection 'cteam0' (83c35d77-69b3-42ec-8fcb-8375d47ec3dd) successfully added.

[root@localhost ~]# nmcli conn show 
NAME                UUID                                  TYPE      DEVICE 
ens33               701ebac7-b4c5-44ac-9707-022b7ec7973f  ethernet  ens33  
Wired connection 1  9a8854d6-36b3-3afe-adb9-fa2cf8916e03  ethernet  ens34  
Wired connection 2  0e11da32-2ab3-3041-9fc0-432788a1852c  ethernet  ens37  
cteam0              83c35d77-69b3-42ec-8fcb-8375d47ec3dd  team      iteam0

nmcli conn add type team 的语法:

nmcli conn add type team con-name CNAME ifname IFNAME [config JSON]

  • JSON (JavaScript Object Notation)语法格式:‘{“runner”:{“name”:“METHOD”}}’

    METHOD 是以下的其中一个:broadcast、activebackup、roundrobin、loadbalance 或者 lacp。

  1. 为cteam0接口添加物理子接口
[root@localhost ~]# nmcli conn add type team-slave con-name cteam0-port1 ifname ens34 master cteam0
[root@localhost ~]# nmcli conn add type team-slave con-name cteam0-port2 ifname ens37 master cteam0

要启用成组,必须首先激活这些子端口.

[root@localhost ~]# nmcli conn show
NAME                UUID                                  TYPE      DEVICE 
cteam0              83c35d77-69b3-42ec-8fcb-8375d47ec3dd  team      iteam0 
cteam0-port1        2b5c185c-7dad-435e-9658-2f5f2729be53  ethernet  ens34  
cteam0-port2        49d7309d-0223-4c8f-aa51-8813d4c05563  ethernet  ens37  
ens33               701ebac7-b4c5-44ac-9707-022b7ec7973f  ethernet  ens33  
Wired connection 1  9a8854d6-36b3-3afe-adb9-fa2cf8916e03  ethernet  --     
Wired connection 2  0e11da32-2ab3-3041-9fc0-432788a1852c  ethernet  --      
  1. 为team接口配置IP等
[root@localhost ~]# nmcli connection modify cteam0 ipv4.addresses "192.168.0.110/24" ipv4.method manual 
[root@localhost ~]# nmcli connection modify cteam0 ipv4.gateway "192.168.0.1"
  1. 依次序激活网卡
[root@localhost ~]# nmcli connection up cteam0-port1 
[root@localhost ~]# nmcli connection up cteam0-port2
[root@localhost ~]# nmcli connection up cteam0
  1. 修改team接口的 team.config配置
[root@localhost ~]# nmcli connection modify cteam0 team.config '{"runner":{"name":"activebackup"},"link_watch":{"name":"ethtool"}}'
  1. 测试team网卡连通性
  • 在服务器侧分别断开只其中一个物理接口的线缆或者down掉接口,测试与team网卡的连通性。
  • 当前team网卡状态
[root@localhost ~]# teamdctl iteam0 state view
setup:
  runner: activebackup
ports:
  ens34
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 0
  ens37
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 0
runner:
  active port: ens34
  • down掉当前主网卡
[root@localhost ~]# nmcli connection down cteam0-port1
Connection 'cteam0-port1' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/21)
[root@localhost ~]# teamdctl iteam0 state view
setup:
  runner: activebackup
ports:
  ens37
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 0
runner:
  active port: ens37
  • 然后重新up主网卡,然后down掉另一个网卡,测试。
  • 测试结果
......
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=4ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=17ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=5ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=9ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=11ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=5ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64

192.168.0.110 的 Ping 统计信息:
    数据包: 已发送 = 71,已接收 = 71,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 3ms,最长 = 39ms,平均 = 5ms
  • 不加任何config参数的配置如下
#默认team接口的配置:
[root@localhost ~]# nmcli conn add type team con-name cteam0 ifname iteam0 
team.config:                            --
team.notify-peers-count:                0 (disabled)
team.notify-peers-interval:             0 (default)
team.mcast-rejoin-count:                0 (disabled)
team.mcast-rejoin-interval:             0 (default)
team.runner:                            roundrobin
team.runner-hwaddr-policy:              --
team.runner-tx-hash:                    --
team.runner-tx-balancer:                --
team.runner-tx-balancer-interval:       -1
team.runner-active:                     no
team.runner-fast-rate:                  no
team.runner-sys-prio:                   -1
team.runner-min-ports:                  -1
team.runner-agg-select-policy:          --
team.link-watchers:                     --

方式2:使用ifcfg配置文件创建team组

在 /etc/sysconfig/network-scripts/ 目录中创建一个team主接口的配置文件,配置参考如下:

文件名:ifcfg-cteam0

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-cteam0
TEAM_CONFIG="{\"runner\": {\"name\": \"activebackup\"}, \"link_watch\": {\"name\": \"ethtool\"}}"
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=cteam0
UUID=83c35d77-69b3-42ec-8fcb-8375d47ec3dd
DEVICE=iteam0
ONBOOT=yes
DEVICETYPE=Team
IPADDR=192.168.0.110
PREFIX=24
  1. 然后创建子接口的配置文件

文件名:ifcfg-cteam0-port1

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-cteam0-port1 
NAME=cteam0-port1
UUID=2b5c185c-7dad-435e-9658-2f5f2729be53
DEVICE=ens34
ONBOOT=yes
TEAM_MASTER_UUID=83c35d77-69b3-42ec-8fcb-8375d47ec3dd
TEAM_MASTER=iteam0
DEVICETYPE=TeamPort

文件名:ifcfg-cteam0-port2

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-cteam0-port2
NAME=cteam0-port2
UUID=49d7309d-0223-4c8f-aa51-8813d4c05563
DEVICE=ens37
ONBOOT=yes
TEAM_MASTER_UUID=83c35d77-69b3-42ec-8fcb-8375d47ec3dd
TEAM_MASTER=iteam0
DEVICETYPE=TeamPort

子接口的配置中可以加 优先级参数 TEAM_PORT_CONFIG='{"prio": 100}'

其中:prio的取值范围是 -32767 到 32767 之间

prio默认为0.

  1. 启动接口
# ifup cteam0
# ip link show 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebSocket 通信说明与基于 ESP-IDF 的 WebSocket 使用

一、 WebSocket 出现的背景 最开始 客户端&#xff08;Client&#xff09; 和 服务器&#xff08;Server&#xff09; 通信使用的是 HTTP 协议&#xff0c;HTTP 协议有一个的缺陷为&#xff1a;通信只能由客户端&#xff08;Client&#xff09;发起。 在一些场景下&#xff0…

linux(centos) 环境部署,安装JDK,docker(mysql, redis,nginx,minio,nacos)

目录 1.安装JDK (非docker)1.1 将文件放在目录下&#xff1a; /usr/local/jdk1.2 解压至当前目录1.3 配置环境变量 2.安装docker2.1 验证centos内核2.2 安装软件工具包2.3 设置yum源2.4 查看仓库中所有docker版本&#xff0c;按需选择安装2.5 安装docker2.6 启动docker 并 开机…

CODESYS可视化秒表分批计时详细制作案例(一)

#制作一个在可视化界面可用于秒表计时的详细案例# 前言: 在电脑和手机的时钟上,都有一个秒表计时的功能。除此之外,在赛事上,也有更为专业的秒表计时器设备。举一反三,那么对于工控设备,为了衡量生产效率和节拍,引入了"Cycle Time(CT)"的概念,我们可以通…

openGauss开源数据库实战十八

文章目录 任务十八 openGauss逻辑结构:构:用户和权眼管理任务目标实施步骤一、准备工作二、用户和角色管理1.使用CREATE USER语句创建用户2.使用CREATE ROLE语句创建用户3.删除用户和角色 三、权限管理1.系统权限清理工作 任务十八 openGauss逻辑结构:构:用户和权眼管理 任务目…

Scratch游戏推荐 | 我的世界:平台冒险——像素世界的全新挑战! ⛏️

&#x1f3ae; Scratch游戏推荐 | 我的世界&#xff1a;平台冒险——像素世界的全新挑战&#xff01; ⛏️&#x1f30d; 今天给大家推荐一款精彩绝伦的Scratch平台冒险游戏——《我的世界&#xff1a;平台冒险 – 第二章》&#xff01;由atomicmagicnumber制作&#xff0c;这…

【java-数据结构篇】揭秘 Java LinkedList:链表数据结构的 Java 实现原理与核心概念

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 目录 1. Java LinkedList 基础 1.1 LinkedList 简介 1.2 LinkedList 的实现原理 1.3 LinkedList 与 ArrayList 的区别 2. 链表基础 2.1 链…

北斗道路运输车辆管理应用:违规驾驶行为监测、车辆编队管理、安全跟踪(车辆历史轨迹查询)、车辆动态位置数据的实时查看和管理

文章目录 场景概述解决方案应用案例合作构想场景概述 面向旅游大巴车、危险品运输车及重型载货运输车等车辆,利用北斗定位导航服务,结合互联网通信技术,实现车辆安全驾驶管理与调度,有效降低道路事故发生风险,提升道路运输管理水平及车辆调度能力。 解决方案 在车辆上安…

【ABAP——DAILOG_2】

文章目录 使用Tabstrip控件实现分页签效果标签页的修改使用Table Control控件实现表单输出表格控件使用向导创建Table ControlTable Control列的修改 用户通过界面输入数据&#xff0c;数据通过屏幕控件传递到ABAP/4程序中的变量&#xff0c;程序在PBO中准备数据并显示界面&…

资料文件夹转移工具5.2.3 |快速转移到D盘,释放C盘空间

这是一款支持将C盘的常用文件夹转移到其他磁盘分区的工具&#xff0c;提供仅变目录、复制资料和转移资料三种转移方式。该工具完全免费&#xff0c;单文件免安装&#xff0c;大小仅为546KB&#xff0c;非常适合需要释放C盘空间的用户。 大小&#xff1a;546KB 下载地址&#…

使用STM32CubeMX配置串口各种功能

使用STM32CubeMX配置串口各种功能 STM32CubeMX软件的安装接收空闲中断STM32CubeMX配置1.新建工程2. 选择芯片3. 选择时钟和下载方式4. 配置串口5.设置工程消息6.生成代码7.修改生成的代码 空闲中断DMA转运STM32CubeMX配置4.配置串口5.设置工程消息6.生成代码7.修改生成的代码 S…

Javascript中DOM操作和事件监听综合练习 (具备三种功能的轮播图案例)

#如何去实现图片轮播效果图&#xff0c;通过创建一个基本的 HTML 页面结构&#xff0c;包含用于展示轮播图片的区域、左右切换箭头以及放置轮播图片的容器。# 整体架构 一、CSS 样式 接下来创建一个 styles.css 文件来设置页面的样式&#xff0c;让轮播效果看起来更美观。定义…

无人设备遥控器之防水性能篇

无人设备遥控器的防水性能是评估其耐用性和适应不同环境能力的重要指标。随着无人设备技术的不断发展&#xff0c;越来越多的遥控器在设计时融入了防水元素&#xff0c;以满足用户在不同天气条件下的使用需求。 一、防水等级与标准 无人设备遥控器的防水性能通常通过防水等级来…

【JAVA】Java入门 - 循环结构进阶

第1关 for循环的进阶使用-嵌套循环&#xff08;1&#xff09; 第2关 for循环的进阶使用-嵌套循环&#xff08;2&#xff09; 第3关 99乘法表 第4关 综合练习之ATM取款机 第5关 选择题 D、BC、B

【AI系统】AI 编译器后端优化

AI 编译器后端优化 AI 编译器分为多层架构&#xff0c;最顶层由各种 AI 训练框架编写的神经网络模型架构&#xff0c;一般由 Python 编写&#xff0c;常见的 AI 训练框架有 PyTorch、MindSpore、PaddlePaddle 等。在导入 AI 编译器时需要用对应框架的 converter 功能转换为 AI…

力扣 三角dp

动态规划基础题&#xff0c;当前所在元素来自上一行的两列的值。 题目 从图可以看出&#xff0c;每一行的第一个数与最后一个数都是1&#xff0c;然后中间的数是来自它左上方和右上方的数的和。当然并不是要打印这个三角形的形状&#xff0c;因此可以想到正常的打印方式应该是…

Oracle检查加强版本

支持更丰富了&#xff0c;代码也更乱了 #!/bin/bash## 实例个数 告警日志 实例状态 会话 活动会话 锁 集群状态 服务状态 磁盘空间 侦听日志 ## 单机、RAC Linux、AIX 11g、19c、23ai ## 依赖adrci配置正常&#xff0c;也可以改为 getAlert() ## ver 1.2case uname inAIX)ps…

RoBERTa- 稳健优化的 BERT 预训练模型详解

一、引言 自 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;问世&#xff0c;预训练语言模型在自然语言处理&#xff08;NLP&#xff09;领域掀起革命浪潮&#xff0c;凭卓越表现大幅刷新诸多任务成绩。RoBERTa 承继 BERT 架构&#x…

【流程图】各元素形状和含义

判定、文档、数据、数据库、流程处理节点 矩形 - 动词 平行四边形 - 图像 下波浪 - 数据 图片来源http://baike.cu12.com/bkss/62449.shtml

「Mac畅玩鸿蒙与硬件41」UI互动应用篇18 - 多滑块联动控制器

本篇将带你实现一个多滑块联动的控制器应用。用户可以通过拖动多个滑块&#xff0c;动态控制不同参数&#xff08;如红绿蓝三色值&#xff09;&#xff0c;并实时显示最终结果。我们将以动态颜色调节为例&#xff0c;展示如何结合状态管理和交互逻辑&#xff0c;打造一个高级的…

PyQt6 开发基础

<?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Form</class><widget class"QWidget" name"Form"><property name"geometry"><rect><x>0<…