關于linux網橋(Linux Bridge)的一些個人記錄

文章目錄

    • 1. Linux Bridge簡述
    • 2. 網橋創建
      • 創建
      • 配置持久化
        • 在Debian/Ubuntu系統上:
        • 在CentOS/RHEL系統上:
      • 啟用和驗證
    • 3. 關于linux網橋不轉發ip幀的問題
      • 原因
      • 解決
      • 配置持久化
    • 4. 查看網橋學習交換表
      • 手動添加或刪除條目
        • 添加條目
        • 刪除條目
      • 配置靜態條目
      • 設置條目的老化時間
      • 持久化配置
    • 5. 關于linux網橋STP
    • 6. 關于linux網橋不轉發LLDP幀
      • 原因
      • 解決
      • 持久化配置
    • 7. 網橋vlan
      • 配置持久化
    • 8. 其他
      • 1. 網卡混雜模式配置
      • 2. 網卡接收多播包配置
      • 3. 創建VLAN接口
    • 參考鏈接

作為一個工業自動化行業,常游走于各種 OT 網絡和 IT 網絡之間的碼農,linux 網橋是常使用的工具之一,每每涉及Linux 網橋, 這些記憶性的操作都要現查,零散且麻煩,所以簡單整理一下,主要方便自己查詢,同時分享給大家參考,希望對你有所幫助。

1. Linux Bridge簡述

有了虛擬網卡,我們很自然就會聯想到讓網卡接入到交換機里,來實現多個容器間的相互連接。而Linux Bridge就是 Linux 系統下的虛擬化交換機,雖然它是以“網橋”(Bridge)而不是“交換機”(Switch)為名,但在使用過程中,你會發現 Linux Bridge 看起來像交換機,功能使用起來像交換機、程序實現起來也像交換機,所以它實際就是一臺虛擬交換機。

Linux Bridge 是在 Linux Kernel 2.2 版本開始提供的二層轉發工具,由brctl命令創建和管理。Linux Bridge 創建以后,就能夠接入任何位于二層的網絡設備,無論是真實的物理設備(比如 eth0),還是虛擬的設備(比如 veth 或者 tap),都能與 Linux Bridge 配合工作。當有二層數據包(以太幀)從網卡進入 Linux Bridge,它就會根據數據包的類型和目標 MAC 地址,按照如下規則轉發處理:

  • 如果數據包是廣播幀,轉發給所有接入網橋的設備。如果數據包是單播幀,且 MAC 地址在地址轉發表中不存在,則洪泛(Flooding)給所有接入網橋的設備,并把響應設備的接口與 MAC 地址學習(MAC Learning)到自己的 MAC 地址轉發表中。

  • 如果數據包是單播幀,且 MAC 地址在地址轉發表中已存在,則直接轉發到地址表中指定的設備。

  • 如果數據包是此前轉發過的,又重新發回到此 Bridge,說明冗余鏈路產生了環路。由于以太幀不像 IP 報文那樣有 TTL 來約束,所以一旦出現環路,如果沒有額外措施來處理的話,就會永不停歇地轉發下去。那么對于這種數據包,就需要交換機實現生成樹協議(Spanning Tree Protocol,STP)來交換拓撲信息,生成唯一拓撲鏈路以切斷環路。

剛剛提到的這些名詞,比如二層轉發、泛洪、STP、MAC 學習、地址轉發表,等等,都是物理交換機中已經非常成熟的概念了,它們在 Linux Bridge 中都有對應的實現,所以我才說,Linux Bridge 不僅用起來像交換機,實現起來也像交換機。

不過,它與普通的物理交換機也還是有一點差別的,普通交換機只會單純地做二層轉發,Linux Bridge 卻還支持把發給它自身的數據包,接入到主機的三層協議棧中

對于通過brctl命令顯式接入網橋的設備,Linux Bridge 與物理交換機的轉發行為是完全一致的,它也不允許給接入的設備設置 IP 地址,因為網橋是根據 MAC 地址做二層轉發的,就算設置了三層的 IP 地址也沒有意義。然而,Linux Bridge 與普通交換機的區別是,除了顯式接入的設備外,它自己也無可分割地連接著一臺有著完整網絡協議棧的 Linux 主機,因為 Linux Bridge 本身肯定是在某臺 Linux 主機上創建的,我們可以看作是 Linux Bridge 有一個與自己名字相同的隱藏端口,隱式地連接了創建它的那臺 Linux 主機。

因此,Linux Bridge 允許給自己設置 IP 地址,這樣就比普通交換機多出了一種特殊的轉發情況:如果數據包的目的 MAC 地址為網橋本身,并且網橋設置了 IP 地址的話,那該數據包就會被認為是收到發往創建網橋那臺主機的數據包,這個數據包將不會轉發到任何設備,而是直接交給上層(三層)協議棧去處理。這時,網橋就取代了物理網卡 eth0 設備來對接協議棧,進行三層協議的處理。

涉及工具:

sudo apt-get install bridge-utils iproute2   # 對于Debian/Ubuntu系統

2. 網橋創建

創建

創建網橋br0 并將eth0eth1 添加到網橋:

# 創建網橋 br0
sudo brctl addbr br0# 添加物理接口 eth0 到網橋
sudo brctl addif br0 eth0
sudo brctl addif br0 eth1# set up
sudo ifconfig br0 up
sudo ifconfig br0 eth0
sudo ifconfig br0 eth1

或者使用ip命令:

# 使用 ip 命令
sudo ip link add name br0 type bridge
sudo ip link set dev br0 up
sudo ip link set dev eth0 master br0
sudo ip link set dev eth1 master br0

可以使用以下命令驗證網橋和接口的配置:

# 查看網橋信息
sudo bridge link show
sudo bridge fdb show br0# 或者
sudo brctl show

配置持久化

為了在系統重啟后保持網橋配置,你需要將相應的配置添加到網絡配置文件中。

在Debian/Ubuntu系統上:

編輯/etc/network/interfaces文件,添加如下內容:

auto br0
iface br0 inet staticaddress 192.168.1.100netmask 255.255.255.0bridge_ports eth0 eth1bridge_stp on
在CentOS/RHEL系統上:

創建或編輯/etc/sysconfig/network-scripts/ifcfg-br0文件,添加如下內容:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
ONBOOT=yes
STP=on# 添加橋接的接口
BRIDGE_PORTS="eth0 eth1"

并確保eth0eth1的配置文件中有以下內容:

# /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0# /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
BRIDGE=br0

啟用和驗證

重新啟動網絡服務以應用配置:

# 對于Debian/Ubuntu
sudo systemctl restart networking# 對于CentOS/RHEL
sudo systemctl restart network

通過檢查網橋狀態和接口狀態來驗證配置:

# 查看網橋信息
sudo bridge link show
sudo bridge fdb show br0# 或者
sudo brctl show

3. 關于linux網橋不轉發ip幀的問題

原因

Docker使用iptables時,默認將通過網橋的數據包發送到iptables進行處理,sysctl屬性net.bridge.bridge-nf-call-iptables=1)。

這使得橋接幀(以太網,第2層)受制于iptables filter(IP,第3層),導致網橋上的3層協議通信異常。

允許{ip、ip6、arp}表看到橋接通信可以使用位于/proc/sys/net/bridge/中的適當proc條目禁用或啟用:

bridge-nf-call-arptables
bridge-nf-call-iptables
bridge-nf-call-ip6tables

對應內核橋模塊識別的3個“可調參數”的設置:

net.bridge.bridge-nf-call-arptables
net.bridge.bridge-nf-call-ip6tables
net.bridge.bridge-nf-call-iptables

它們控制是否將通過網橋的數據包發送到iptables進行處理。在使用網橋將虛擬機連接到網絡的情況下,通常這種處理是不希望的,因為它會導致guests流量被阻止,因為主機iptables規則只考慮主機本身,而不是guests。

然而,內核中的橋模塊將所有這三個值的默認值設置為“1”(“on”,即“do send the packets to iptables”),并且由于歷史原因,內核維護人員拒絕更改此默認值(參見http://patchwork.ozlabs.org/patch/29319/)。

在內核拒絕了上述對編譯默認值的更改之后,許多Linux發行版(包括Fedora,RHEL和CentOS)試圖通過在/etc/sysctl.conf中添加行來修改編譯到橋模塊中的默認設置來解決這個問題:

net.bridge.bridge-nf-call-arptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0

解決

要禁用br_netfilter's代碼對iptable的調用,如下所示:

sudo sysctl -w net.bridge.bridge-nf-call-iptables=0
#或者
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

內核(>= 5.3),在每個橋單獨啟用,而不是每個命名空間啟用。

sudo ip link set dev br0 type bridge nf_call_iptables 1

參考鏈接https://wiki.libvirt.org/Net.bridge.bridge-nf-call_and_sysctl.conf.html

配置持久化

除使用最原始的腳本配置外,可以使用udev+systemd,在橋的創建(加載模塊)上重寫udev規則來實現。

1)在文件/etc/udev/rules.d/99-bridge.rules中:

ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", RUN+="/usr/lib/systemd/systemd-sysctl --prefix=net/bridge

2)在文件/etc/sysctl.d/bridge.conf中:

net.bridge.bridge-nf-call-arptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0

3)重新引導或重新加載udev和sysctl。

4. 查看網橋學習交換表

使用bridge命令查看網橋的學習交換表:

bridge fdb show br br0

這個命令會展示網橋br0的當前學習交換表,包括各個MAC地址和它們對應的端口。

手動添加或刪除條目

添加條目

你可以手動添加一個MAC地址到網橋的學習交換表中。假設你要將MAC地址00:11:22:33:44:55綁定到接口eth0

sudo bridge fdb add 00:11:22:33:44:55 dev eth0 master br0
刪除條目

同樣,你可以手動刪除一個MAC地址條目:

sudo bridge fdb del 00:11:22:33:44:55 dev eth0 master br0

配置靜態條目

你可以配置靜態條目,這樣這些MAC地址永遠不會從網橋的學習交換表中刪除:

sudo bridge fdb add 00:11:22:33:44:55 dev eth0 

設置條目的老化時間

網橋會自動老化條目,并在一段時間不使用后刪除它們。可以設置這個老化時間(以秒為單位):

sudo ip link set dev br0 type bridge ageing_time 300

這會將老化時間設置為300秒(5分鐘)。

持久化配置

為了在系統重啟后保持這些配置,可以將相應的命令添加到啟動腳本中。例如,在Debian/Ubuntu系統中,可以將這些命令添加到/etc/network/interfaces文件中:

auto br0
iface br0 inet staticaddress 192.168.1.100netmask 255.255.255.0bridge_ports eth0 eth1post-up bridge fdb add 00:11:22:33:44:55 dev eth0 master br0 static

在CentOS/RHEL系統中,可以將命令添加到/etc/sysconfig/network-scripts/ifcfg-br0文件中:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
ONBOOT=yes# Add these lines to the end of the file
BRIDGE_STP=no
BRIDGE_PORTS="eth0 eth1"
BRIDGE_AGEING_TIME=300# Add static FDB entries
POST_UP="bridge fdb add 00:11:22:33:44:55 dev eth0 master br0 static"

5. 關于linux網橋STP

STP的目的是防止網絡環路,這可能導致網絡中的流量風暴。Linux橋接從2.4和2.6內核系列開始就支持STP。要在網橋上啟用STP:

sudo ip link set br0 type bridge stp_state 1
#或者
sudo brctl stp br0 on

注意:Linux網橋不支持快速生成樹協議(RSTP)

網橋上顯示STP阻塞狀態:

sudo ip -j -p -d link show br0 | grep root_port
sudo bridge link show
#或
sudo brctl showstp br0

要更改STP call時間:

sudo ip link set br0 type bridge hello_time 300sudo ip -j -p -d link show br0 | grep \"hello_time\""hello_time": 300,

可以使用相同的基本方法來更改其他STP參數,如最大年齡、轉發延遲、老化時間等

6. 關于linux網橋不轉發LLDP幀

原因

IEEE為標準協議留出的范圍,使用這些地址的包將被網橋過濾,而不會被轉發。

IEEE 802.1D MAC Bridge Filtered MAC Group Addresses: 01-80-C2-00-00-00 to 01-80-C2-00-00-0F; MAC frames that have a destination MAC address within this range are not relayed by MAC bridges conforming to IEEE 802.1D.

IEEE協議中規定的預留的MAC地址表如下:

MAC addressProtocol
01-80-C2-00-00-00Spanning Tree (STP/RSPT/MSTP)
生成樹(STP/RSPT/MSTP)
01-80-C2-00-00-01Ethernet Flow Control (pause frames)
以太網流量控制(暫停幀)
01-80-C2-00-00-02Link Aggregation Control Protocol (LACP)
鏈路聚合控制協議(LACP)
01-80-C2-00-00-03802.1X Port-Based Network Access Control
802.1X基于端口的網絡訪問控制
01-80-C2-00-00-08Provider Bridge protocols (STP)
供應商橋接協議(STP)
01-80-C2-00-00-0DProvider Bridge protocols (MVRP)
提供商橋接協議(MVRP)
01-80-C2-00-00-0E802.1AB Link Layer Discovery Protocol (LLDP)
802.1AB鏈路層發現協議(LLDP)

解決

綜上網橋不轉發LLDP(鏈路層發現協議)幀,但從Linux內核2.6開始,允許通過在/sys/class/net/bridge-iface/bridge/group_fwd_mask中設置特定的位掩碼來控制網橋應該轉發IEEE 802.1D中定義的范圍內的哪些鏈路本地幀。默認值0表示Linux網橋不轉發任何鏈路本地幀。

將此值設置為16384將允許網橋轉發LLDP幀(01-80-C2-00-00- 0E):

# 關閉網橋的 LLDP 過濾
echo 16384 > /sys/class/net/br0/bridge/group_fwd_mask

需要注意的是,在默認的發行版本中,對于該MAC地址范圍中的前三個(-00,-01,-02)是不能通過以上方式控制的, 意味著在gns3的模擬環境中,我們仍然不能成功的測試STP,流控和LACP。要克服這個限制,必須要自己編譯linux kernel才行,也可以下載EVE編譯好的版本,點擊進入鏈接。這樣就可以隨意調整group_fwd_mask的值,支持不過濾01-80-C2-00-00-0x的所有地址了。

前文中把group_fwd_mask設為16384,對應的MAC是01-80-C2-00-00-0E,對應的協議是LLDP, 那么group_fwd_mask是如何計算的呢?

位掩碼是一個16位的數字,其中第一位(最低有效位)表示MAC地址01-80-C2-00 - 00-00,第16位(最高有效位)表示01-80-C2-00-00-0F。默認值(所有位均為0)不轉發任何鏈路本地幀。要啟用特定MAC地址的幀轉發,我們需要將相應的位設置為1。例如,為了允許轉發LLDP幀(01-80-C2-00-00- 0E),我們需要將第15位設置為1,并將其余位保留為0:

MAC0F0E0D0C0B0A09080706050403020100
BIt0100000000000000

這意味著我們使用二進制數0100 0000 0000 0000作為位掩碼,它轉換為十進制數16384,就像我們在前面的例子中使用的那樣。

如果我們想將LACP(01-80-C2-00-00-02)和802.1X(01-80-C2-00-00-03)添加到混合中,我們還將第3位和第4位設置為1。

MAC0F0E0D0C0B0A09080706050403020100
BIt0100000000001100

bitmasks是二進制數0100 0000 0000 1100, 轉換成10進制則為16396。這樣就可以允許LLDP,LACP,802.1x協議了。

按照這樣的方法,要解除linux網橋對規定地址范圍內所有地址的過濾,就把所有的bit都置為1 即可。

持久化配置

/etc/rc.local中添加:

#!/bin/bash# 設置網橋 br0 的組轉發掩碼
echo 65 > /sys/class/net/br0/bridge/group_fwd_mask
exit 0

確保腳本具有可執行權限:

sudo chmod +x /etc/rc.local

或者使用systemd 創建或編輯一個系統服務單元文件,例如/etc/systemd/system/set-group-fwd-mask.service

[Unit]
Description=Set group forward mask for bridge br0
After=network.target[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo 65 > /sys/class/net/br0/bridge/group_fwd_mask'
RemainAfterExit=yes[Install]
WantedBy=multi-user.target

啟用并啟動該服務:

sudo systemctl enable set-group-fwd-mask.service
sudo systemctl start set-group-fwd-mask.service

參考鏈接

https://interestingtraffic.nl/2017/11/21/an-oddly-specific-post-about-group_fwd_mask/

http://standards.ieee.org/develop/regauth/tut/macgrp.pdf

7. 網橋vlan

查看網橋vlan信息

bridge vlan show

要顯式禁用網橋的VLAN 過濾功能,可以使用以下命令:

sudo ip link set dev br0 type bridge vlan_filtering 0

這將確保網橋br0不會處理VLAN標簽

要顯示VLAN流量狀態,啟用VLAN統計(在內核4.7中添加):

sudo ip link set br0 type bridge vlan_stats_enabled 1

前面的命令只在網橋上啟用全局VLAN統計信息,并且沒有細粒度地顯示每個VLAN的狀態。要在網橋中沒有端口號時啟用每個VLAN的統計信息,還需要啟用vlan_stats_per_port(在內核4.20中添加)

sudo ip link set br0 type bridge vlan_stats_per_port 1

顯示vlan統計信息

sudo bridge -s vlan show

配置持久化

為了在系統重啟后保持配置,你需要將相應的命令添加到網絡配置文件中。

在Debian/Ubuntu系統上編輯/etc/network/interfaces文件,添加如下內容:

auto br0
iface br0 inet staticaddress 192.168.1.100netmask 255.255.255.0bridge_ports eth0 eth1post-up ip link set dev br0 type bridge vlan_filtering 0

8. 其他

1. 網卡混雜模式配置

#打開混雜模式
sudo ip link set eth0 promisc on#關閉混雜模式
sudo ip link set eth0 promisc off

或者使用ifconfig

#打開混雜模式
sudo ifconfig eth0 promisc#關閉混雜模式
sudo ifconfig eth0 -promisc

2. 網卡接收多播包配置

# 確認你要配置的網絡接口名稱
ip link show#加入多播組
sudo ip maddr add 239.255.255.250 dev eth0#使能網卡接收多播幀
sudo ifconfig eth0 allmulti
#或
sudo ip link set dev eth0 allmulticast on#驗證配置
ip maddr show dev eth0

3. 創建VLAN接口

啟用802.1Q VLAN標簽支持

sudo modprobe 8021q

為了使網卡能夠接收所有VLAN包,你需要為每個VLAN創建虛擬接口。假設你需要接收VLAN ID為10和20的包。

sudo ip link add link eth0 name eth0.10 type vlan id 10
sudo ip link add link eth0 name eth0.20 type vlan id 20
sudo ip link set dev eth0.10 up
sudo ip link set dev eth0.20 up

或者使用 vconfig 命令創建VLAN接口(舊版命令)

sudo vconfig add eth0 10
sudo vconfig add eth0 20
sudo ifconfig eth0.10 up
sudo ifconfig eth0.20 up

你可以使用以下命令來驗證VLAN接口是否已正確配置:

ip -d link show eth0.10
ip -d link show eth0.20

為了在系統重啟后保持這些配置,你需要將相應的命令添加到系統啟動腳本中。

在ubuntu上,編輯/etc/network/interfaces文件,添加如下內容:

auto eth0
iface eth0 inet staticaddress 192.168.1.100netmask 255.255.255.0up ip link set eth0 promisc onauto eth0.10
iface eth0.10 inet manualvlan-raw-device eth0auto eth0.20
iface eth0.20 inet manualvlan-raw-device eth0

在CentOS/RHEL系統上:

創建或編輯/etc/sysconfig/network-scripts/ifcfg-eth0文件,確保包含以下內容:

DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
PROMISC=yes

創建或編輯VLAN接口配置文件,例如/etc/sysconfig/network-scripts/ifcfg-eth0.10/etc/sysconfig/network-scripts/ifcfg-eth0.20

# /etc/sysconfig/network-scripts/ifcfg-eth0.10
DEVICE=eth0.10
BOOTPROTO=none
ONBOOT=yes
VLAN=yes# /etc/sysconfig/network-scripts/ifcfg-eth0.20
DEVICE=eth0.20
BOOTPROTO=none
ONBOOT=yes
VLAN=yes

重新啟動網絡服務以應用配置:

# 對于Debian/Ubuntu
sudo systemctl restart networking# 對于CentOS/RHEL
sudo systemctl restart network

參考鏈接

https://developers.redhat.com/articles/2022/04/06/introduction-linux-bridging-commands-and-features#vlan_filter

https://interestingtraffic.nl/2017/11/21/an-oddly-specific-post-about-group_fwd_mask/

http://standards.ieee.org/develop/regauth/tut/macgrp.pdf

https://wiki.libvirt.org/Net.bridge.bridge-nf-call_and_sysctl.conf.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65547.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65547.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65547.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

期末概率論總結提綱(僅適用于本校,看文中說明)

文章目錄 說明A選擇題1.硬幣2.兩個事件的關系 與或非3.概率和為14.概率密度 均勻分布5.聯合分布率求未知參數6.聯合分布率求未知參數7.什么是統計量(記憶即可)8.矩估計量9.117頁12題10.顯著水平阿爾法(背公式就完了) 判斷題11.事件…

Inno Setup制作安裝包,安裝給win加環境變量

加 ; 加環境變量,開啟,下面一行 ChangesEnvironmentyes 和 ; 加環境變量wbrj變量名,{app}\project\bin變量值,{app}\后接文件名,{app}表示安裝路徑。下面一行,{olddata};原來的值上拼接 Root: HKLM; Subkey: “SYSTEM\…

Golang學習筆記_23——error補充

Golang學習筆記_20——error Golang學習筆記_21——Reader Golang學習筆記_22——Reader示例 文章目錄 error補充1. 基本錯誤處理2. 自定義錯誤3. 錯誤類型判斷3.1 類型斷言3.2 類型選擇 4. panic && recover 源碼 error補充 1. 基本錯誤處理 在Go中,函數…

Python中的asyncio:高效的異步編程模型

隨著互聯網應用的快速發展,程序的響應性和處理效率成為衡量系統性能的重要指標。傳統的同步編程模型在面對高并發和IO密集型任務時,常常顯得捉襟見肘,難以滿足現代應用的需求。Python的asyncio庫作為一種高效的異步編程模型,為開發…

JavaScript -- 數組詳解(使用頻率高)【數組專題】

文章目錄 前言一、創建數組1.1 使用Array構造函數1.2 使用數組字面量表示法1.3 ES6語法轉換數組1.3.1 from( )用于將類數組結構轉換為數組實例1.3.2 of( )用于將一組參數轉換為數組實例 二、數組常用方法2.1 復制和填充2.1.1 copyWithin( )2.1.2 fill( ) 2.2 數組轉換2.2.1 toS…

操作系統之文件系統的基本概念

目錄 用戶和磁盤視角的文件 文件控制塊(FCB)和索引結點(inode) 文件的操作 創建文件(create系統調用) 寫文件(write系統調用) 讀文件(read系統調用) 重…

如何制作一份出色的公司介紹PPT?

制作一份公司介紹的PPT需要精心設計,以確保內容既專業又吸引人。以下是一個基本的框架和一些建議,幫助您創建一份有效的公司介紹PPT: PPT標題頁 標題:公司全稱(可使用公司Logo作為背景或嵌入標題中)副標題…

springboot項目部署至linux

1.修改pom.xml 確認是否有以下代碼&#xff0c;沒有請進行添加&#xff0c;mainClass改成你的啟動類 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.ve…

vue.js 使用router-link替代a標簽實現高亮

在Vue.js中&#xff0c;可以使用<router-link>組件來替代<a>標簽實現高亮效果。<router-link>是Vue-Router提供的組件&#xff0c;用于路由導航。 首先&#xff0c;需要在Vue項目中安裝Vue-Router。可以使用以下命令安裝&#xff1a; npm install vue-rout…

FPGA隨記——時鐘時序一些基本知識

原文鏈接&#xff1a;跨時鐘域設計-CSDN博客 前言 CDC&#xff08;clock domain crossing&#xff09;檢查&#xff08;跨時鐘域的檢查&#xff09;是對電路設計中同步電路設計的檢查。非同步時鐘沒有固定的相位關系&#xff0c;這樣Setup/Hold不滿足而產生了亞穩態是無法避免…

實例解析網絡釣魚攻擊的幕后

網絡釣魚是通過大量發送聲稱來自于銀行或其他知名機構的欺騙性垃圾郵件&#xff0c;意圖引誘收信人給出敏感信息&#xff08;如用戶名、口令、帳號ID、ATM PIN碼或信用卡詳細信息&#xff09;的一種攻擊方式。最典型的網絡釣魚攻擊將收信人引誘到一個通過精心設計與目標組織的網…

STM32+WIFI獲取網絡時間+8位數碼管顯示+0.96OLED顯

資料下載地址&#xff1a;STM32WIFI獲取網絡時間8位數碼管顯示0.96OLED 1、項目介紹 主控芯片STM32C8T6 接線&#xff1a;串口1&#xff1a;PA9 PA10 OELD &#xff1a;PB6 PB7 數碼管使用&#xff1a;MAX7219 8位數碼管 Max7219_pinCLK PAout(5) Max7219_pinC…

1688平臺商品關鍵詞搜索的多樣性與Python爬蟲應用實踐

在當今這個信息化、數字化飛速發展的時代&#xff0c;電子商務平臺已經成為人們日常生活中不可或缺的一部分。而1688作為國內知名的B2B電商平臺&#xff0c;憑借其龐大的商品種類和豐富的供應鏈資源&#xff0c;為無數商家和消費者提供了便捷的交易渠道。除了廣受關注的女裝品類…

記錄將springboot的jar包和lib分離,使用docker-compose部署

本文講訴如何把jar里的lib依賴包獨立出來&#xff0c;方便更新服務時&#xff0c;縮小jar的體積&#xff0c;下面以若依的system服務為例&#xff0c;配置中的路徑請酌情修改&#xff0c;主要提供大致配置邏輯 第一步&#xff1a;修改項目的pom.xml&#xff0c;調整build的配…

如何解決Redis中的熱點key問題

Redis中的熱點Key問題是指某些特定的Key被頻繁訪問&#xff0c;導致Redis中某個節點&#xff08;或實例&#xff09;承擔過高的壓力&#xff0c;可能引發性能瓶頸&#xff0c;甚至若緩存承受不住服務壓力掛掉后&#xff0c;仍有大量請求時直接打到DB上&#xff0c;由于DB層相對…

單片機實現模式轉換

[任務] 要求通過單片機實現以下功能&#xff1a; 1.單片機有三種工作模式(定義全局變量MM表示模式&#xff0c;MM1&#xff0c;2&#xff0c;3表示三種不同的模式) LED控制模式 風扇控制模式 蜂鳴器控制模式 2.可以在某一個模式下通過拓展板KEY1按鍵控制設備 (按…

安卓OCR使用(Google ML Kit)

OCR是一個很常用的功能&#xff0c;Google ML Kit提供了OCR能力&#xff0c;用起來也很簡單&#xff0c;本文介紹一下使用方法。 1. 相關概念 名詞概念解釋TextBlock塊一個段落Line行一行文本Element元素單詞&#xff1b;對漢字來說&#xff0c;類似"開頭 (分隔符)中間&…

數據庫(3)--針對列的CRUD操作

1.Create 新增 語法&#xff1a; insert into 表名 &#xff08;列名&#xff09;values &#xff08;列&#xff09;... 創建一個學生表用于演示&#xff1a; create table if not exists student( id bigint comment 編號, name varchar(20) comment 姓名 ); 1.1直接增加…

【設計模式-1】軟件設計模式概述

1. 軟件設計模式的產生背景 “設計模式”這個術語最初并不是出現在軟件設計中&#xff0c;而是被用于建筑領域的設計中。 1977 年&#xff0c;美國著名建筑大師、加利福尼亞大學伯克利分校環境結構中心主任克里斯托夫亞歷山大&#xff08;Christopher Alexander&#xff09;在…

Python爬蟲基礎——認識網頁結構(各種標簽的使用)

1、添加<div>標簽的代碼定義了兩個區塊的寬度和高度均為100px&#xff0c;邊框的格式也相同&#xff0c;只是區塊中顯示的內容不同&#xff1b; 2、添加<ul>和<ol>標簽分別用于定義無序列表和有序列表。<il>標簽位于<ul>標簽或<ol>標簽之…