摘要

在去堆叠/MLAG 场景下,默认 bonding 只会以单口回复 ARP,另一台交换机收不到 ARP Reply。本文在 Linux bonding 驱动中增加参数 arp_broadcast_mode,当开启时对 ARP 包临时切换到 广播模式,实现双口同时发 ARP Reply。文内提供可直接套用的补丁与完整编译、替换、验证流程,并覆盖常见坑位(Module.symvers 不匹配、Secure Boot、NetworkManager/ifcfg、sshd OpenSSL 版本错配等)。


基础信息

  • OS:Rocky Linux 9.0(RHEL 9 系列适用)

  • 内核:5.14.0-70.13.1.el9_0.x86_64

  • bonding 模式:mode=6(balance-alb,其他模式同理)

  • 构建工具:gcc make bison flex elfutils-libelf-devel openssl-devel perl kernel-devel kernel-headers

关键点:运行内核版本必须与kernel-devel 版本一致,否则会出现 Module.symvers missing / undefined symbol 等问题。


一、环境准备

1. 确认内核版本

uname -r

例如:5.14.0-70.13.1.el9_0.x86_64

2. 安装依赖工具链

dnf install -y gcc make bison flex elfutils-libelf-devel \openssl-devel perl

注:依据实际情况,如有其他依赖正常安装即可。 PS:最好直接报报错给大模型,输出命令执行就行。 

3. 安装内核开发包(必须和 uname -r 一致)

dnf download --source kernel-$(uname -r) rpm -ivh kernel-*.src.rpm

如果下载的不对dnf,你就要手动安装如下三个包。 

rpm -ivh kernel-5.14.0-70.13.1.el9_0.src.rpm  
rpm -ivh kernel-devel-5.14.0-70.13.1.el9_0.x86_64.rpm  
rpm -ivh kernel-headers-5.14.0-70.13.1.el9_0.x86_64.rpm

 源码安装后会解压到:

ls ~/rpmbuild/BUILD/kernel-<version>/

其实就是安装这三个包,如果你看到安装的不是, 那你就自己下载就行。 

https://dl.rockylinux.org/stg/rocky/9.0-sources-only/tree/Packages/k/kernel-5.14.0-70.13.1.el9.src.rpm

https://downloads.rockylinux.org/vault/rocky/9.0/devel/x86_64/kickstart/Packages/k/kernel-devel-5.14.0-70.13.1.el9_0.x86_64.rpm

https://downloads.rockylinux.org/vault/rocky/9.0/devel/x86_64/kickstart/Packages/k/kernel-headers-5.14.0-70.13.1.el9_0.x86_64.rpm

验证:

ls -ld /lib/modules/$(uname -r)/build 
ls /usr/src/kernels/$(uname -r)/

正常会看到对应源码目录存在。

二、补丁说明(新增模块参数 + 仅对 ARP 强制临时广播)

思路:

  1. bond_main.c 中新增可控参数:

/* ---- ARP broadcast extension ---- */
static int arp_broadcast_mode = 0;
module_param(arp_broadcast_mode, int, 0644);
MODULE_PARM_DESC(arp_broadcast_mode,"broadcast ARP packet to all slaves, 0=off(default), 1=on.");

2.在 __bond_start_xmit() 函数里,仅当是 ARP 且开关=1 时,将 switch (BOND_MODE(bond)) 动态替换为 BOND_MODE_BROADCAST,从而实现仅对 ARP双发。对其他报文不影响原有模式。


    三、开始打补丁(适配 RHEL9 5.14 源码)

    文件路径:~/rpmbuild/BUILD/kernel-<version>/drivers/net/bonding/bond_main.c
    说明:上下文行适配 RHEL9 5.14;若行号有偏差,可采用“手工改动”或下文“一键 sed”方案。

    我测试的路径:/root/rpmbuild/BUILD/kernel-5.14.0-70.13.1.el9_0/linux-5.14.0-70.13.1.el9.x86_64/drivers/net/bonding

    增加1:打开之后放在include部分第一行就行

    #include <linux/moduleparam.h>

    增加2:放在#include部分最后就行。 

    /* ---- ARP broadcast extension ---- */
    static int arp_broadcast_mode = 0;
    module_param(arp_broadcast_mode, int, 0644);
    MODULE_PARM_DESC(arp_broadcast_mode,"broadcast ARP packet to all slaves, 0=off(default), 1=on.");
    

    在我的测试里, 我把#include <linux/moduleparam.h> 放在了首行,如图:

    增加3:检索 __bond_start_xmit部分,

    注意,+号是增加的内容, +号不用复制。-号部分是删除的。 

    static netdev_tx_t __bond_start_xmit(struct sk_buff *skb, struct net_device *dev){struct bonding *bond = netdev_priv(dev);
    +
    +       /* ARP-only broadcast trigger */
    +       bool is_arp = (vlan_get_protocol(skb) == cpu_to_be16(ETH_P_ARP));
    +       bool do_bcast = arp_broadcast_mode && is_arp;if (bond_should_override_tx_queue(bond) &&!bond_slave_override(bond, skb))return NETDEV_TX_OK;#if IS_ENABLED(CONFIG_TLS_DEVICE)if (skb->sk && tls_is_sk_tx_device_offloaded(skb->sk))return bond_tls_device_xmit(bond, skb, dev);#endif
    -       switch (BOND_MODE(bond)) {
    +       switch (do_bcast ? BOND_MODE_BROADCAST : BOND_MODE(bond)) {case BOND_MODE_ROUNDROBIN:return bond_xmit_roundrobin(skb, dev);case BOND_MODE_ACTIVEBACKUP:

    如果补丁由于上下文差异无法直接打入,建议手工按“三处改动”完成:①在 include 区增加 #include <linux/moduleparam.h>;②在全局参数区增加 arp_broadcast_mode 参数;③在 __bond_start_xmit() 里加 is_arp/do_bcast 并替换 switch


    四、(可选)一键 sed 注入脚本

    在源码根目录Makefile 所在处)执行:

    # 1) 确保引入 moduleparam 头(若已有不会重复)
    grep -q 'linux/moduleparam.h' drivers/net/bonding/bond_main.c || \sed -i '/#include <linux\/preempt.h>/a #include <linux/moduleparam.h>' drivers/net/bonding/bond_main.c# 2) 在 "bonding_priv.h" 之后插入参数块(若已存在请忽略)
    awk '
    /#include "bonding_priv.h"/ && !done {print;print "";print "/* ---- ARP broadcast extension ---- */";print "static int arp_broadcast_mode = 0;";print "module_param(arp_broadcast_mode, int, 0644);";print "MODULE_PARM_DESC(arp_broadcast_mode,";print "        \"broadcast ARP packet to all slaves, 0=off(default), 1=on.\");";print "";done=1; next
    }1' drivers/net/bonding/bond_main.c > .bond_main.c.new && mv .bond_main.c.new drivers/net/bonding/bond_main.c# 3) 在 __bond_start_xmit() 中插入 is_arp/do_bcast(若已插过会失败,忽略即可)
    sed -i '/struct bonding \*bond = netdev_priv(dev);/a \ \ \ \ bool is_arp = (vlan_get_protocol(skb) == cpu_to_be16(ETH_P_ARP));\n\ \ \ \ bool do_bcast = arp_broadcast_mode && is_arp;' drivers/net/bonding/bond_main.c# 4) 仅替换 __bond_start_xmit() 中的第一个 switch
    awk 'BEGIN{infunc=0; depth=0}/static netdev_tx_t __bond_start_xmit\(struct sk_buff \*skb, struct net_device \*dev\)/{infunc=1}{if(infunc && $0 ~ /switch \(BOND_MODE\(bond\)\) \{/ && !done){sub(/switch \(BOND_MODE\(bond\)\) \{/, "switch (do_bcast ? BOND_MODE_BROADCAST : BOND_MODE(bond)) {"); done=1}print}/{/{if(infunc) depth++}/}/{if(infunc){depth--; if(depth==0) infunc=0}}
    ' drivers/net/bonding/bond_main.c > .bond_main.c.new && mv .bond_main.c.new drivers/net/bonding/bond_main.c
    

    五、编译 bonding 模块

    1)我们在第一步环境准备时已经安装好相关源码包了

    2)进入源码目录并构建(外部构建,确保符号版本匹配)

    cd ~/rpmbuild/BUILD/kernel-5.14.0-70.13.1.el9_0/linux-5.14.0-70.13.1.el9.x86_64# 使用当前运行内核的配置
    cp -v /boot/config-$(uname -r) .config
    yes "" | make olddefconfig# 准备头文件(只有第一次需要)
    make prepare && make modules_prepare# 用匹配内核的 build 来编译指定子目录模块(推荐)
    make -C /lib/modules/$(uname -r)/build M=$PWD/drivers/net/bonding clean
    make -C /lib/modules/$(uname -r)/build M=$PWD/drivers/net/bonding modules -j"$(nproc)"
    

    产物:drivers/net/bonding/bonding.ko

    提示 “Skipping BTF generation … vmlinux 不在” 不影响加载。


    六、部署并让系统优先用自编译模块

    方案 A(推荐):放到 weak-updates 并覆盖 modprobe 安装行为

    # 放置新模块
    mkdir -p /lib/modules/$(uname -r)/weak-updates/bonding/
    cp -v /root/rpmbuild/BUILD/kernel-5.14.0-70.13.1.el9_0/linux-5.14.0-70.13.1.el9.x86_64/drivers/net/bonding/bonding.ko /lib/modules/$(uname -r)/weak-updates/bonding/
    depmod -a# 持久化默认参数(开启双发)
    echo 'options bonding arp_broadcast_mode=1' > /etc/modprobe.d/bonding.conf# 强制 modprobe 始终加载我们这份(避免回退到内置 .xz)
    cat >/etc/modprobe.d/override-bonding.conf <<'EOF'
    install bonding /sbin/insmod /lib/modules/$(uname -r)/weak-updates/bonding/bonding.ko $CMDLINE_OPTS
    EOF
    

    之后 modprobe bonding 会优先加载我们放在 weak-updates 的模块。

    Secure Boot 提醒:若启用 Secure Boot,加载未签名模块会报 Required key not available。需关闭 Secure Boot 或对 bonding.ko 本地签名并导入 MOK。

    重新加载

    modprobe -r bonding 2>/dev/null || true modprobe bonding

    验证参数存在:

    modinfo bonding | egrep 'filename|vermagic|parm'
    # filename 应指向 weak-updates/bonding/bonding.ko
    # parm 应含 arp_broadcast_modecat /sys/module/bonding/parameters/arp_broadcast_mode   # 应=1
    

    注意:有可能你编译的内核和使用的内核一样, 所以加载的bonding需要注意一下,使用的是新编译的内核, 还是老内核。 


    七、网络脚本参考(ifcfg)

    /etc/sysconfig/network-scripts/ifcfg-bond0

    DEVICE=bond0
    NAME=bond0
    TYPE=Bond
    ONBOOT=yes
    BOOTPROTO=none
    IPADDR=10.10.10.11
    NETWORK=24
    GATEWAY=10.10.10.1
    NM_CONTROLLED=yes
    BONDING_OPTS="mode=6 miimon=100 arp_validate=all arp_all_targets=all lp_interval=1 updelay=200 downdelay=200" 
    

    参数说明:

    • arp_validate=all + arp_all_targets=all:用 ARP 健康检查,两个目标都 OK 才算通过(配合你环境的网关/探测 IP)

    • lp_interval=1:学习包间隔(ALB 需要)

    • 打开你打的补丁开关/etc/modprobe.d/bonding.confoptions bonding arp_broadcast_mode=1

    • 交换机侧:两个上联口不要加入聚合,保持二层转发正常;必要时放宽 MAC 移动抑制/告警阈值,观察是否有 MAC flap

    • updelay=200

      • 当检测到链路恢复(link up)时,bond 不会立刻启用这块口,而是要等 200ms 连续稳定后才认为口真正可用。

      • 避免“抖动”或短暂恢复又掉线的情况。

    • downdelay=200

      • 当检测到链路断开(link down)时,bond 不会立刻标记为 down,而是要连续 200ms 检测失败才认为口真的挂了。

      • 避免偶发丢包/闪断导致的误判。

    /etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0
    TYPE=Ethernet
    BOOTPROTO=none
    ONBOOT=yes
    MASTER=bond0
    SLAVE=yes
    NM_CONTROLLED=yes
    

    /etc/sysconfig/network-scripts/ifcfg-eth1

    DEVICE=eth1
    TYPE=Ethernet
    BOOTPROTO=none
    ONBOOT=yes
    MASTER=bond0
    SLAVE=yes
    NM_CONTROLLED=yes
    

    启用:

    nmcli con reload
    nmcli con up bond0
    cat /proc/net/bonding/bond0
    

    八、功能验证(ARP 双发)

    方法一:远端 ping 触发 ARP

    # 终端A
    tcpdump -ni eth0 arp -vv
    # 终端B
    tcpdump -ni eth1 arp -vv
    

    在另一台同网段机器 ping bond0_IP,你应看到同一时间两个口都有 ARP Reply。

    方法二:本机主动 arping

    arping -c 3 -I bond0 <对端IP或网关IP>
    # 同时在 eth0/eth1 抓包观察
    

    九、常见坑位与排障速查

    1. Module.symvers 缺失/符号未定义

    • 现象:Module.symvers missingundefined symbol …

    • 处理:确保 kernel-develuname -r 一致;使用
      make -C /lib/modules/$(uname -r)/build M=... 外部构建。

    1. 加载到旧模块(.xz)

    • 现象:modinfo bonding | grep filename 显示 .xz

    • 处理:modprobe -r bondingdepmod -a → 用 override-bonding.conf 强制 insmod 我们的 weak-updates 版本。

    1. Secure Boot 导致无法加载

    • 报错:Required key not available

    • 处理:关闭 Secure Boot 或签名模块并导入 MOK。

    1. bond0 为 DOWN 或无 IP

    • 检查:cat /proc/net/bonding/bond0,确认 slave 绑定与 MII Status

    • 给 bond0 配置 IP/PREFIX,BONDING_OPTS 中设置 miimon=100

    • nmcli con up bond0 后再 ip a show bond0

    1. sshd 起不来(OpenSSL 版本错配)

    • 错误:OpenSSL version mismatch. Built against 30000010, you have 30200020

    • 处理:升级 openssh-server 到与系统 OpenSSL 对齐的版本(Rocky 有 8.7p1-45.el9.rocky.0.1 等),或降级 OpenSSL(不推荐)。


    十、结语

    本文通过极小的代码改动,为 bonding 增加了 arp_broadcast_mode 参数,实现仅对 ARP 报文的“临时广播”,从而满足去堆叠/MLAG 场景下的“双发 ARP”需求。方案对非 ARP 流量无侵入,并保留原有模式行为。生产环境上线前,建议在维护时段配合交换机侧做充分验证。


    附:最小操作清单(懒人版)

    # 0) 安装匹配的 kernel-devel
    rpm -ivh --oldpackage /opt/kernel-devel-$(uname -r).x86_64.rpm# 1) 修改源码 (按上文补丁三处改动)
    cd ~/rpmbuild/BUILD/kernel-*/linux-*/   # 进入源码根
    # (可用上文 sed 快捷脚本)# 2) 构建
    cp -v /boot/config-$(uname -r) .config
    yes "" | make olddefconfig
    make prepare && make modules_prepare
    make -C /lib/modules/$(uname -r)/build M=$PWD/drivers/net/bonding clean
    make -C /lib/modules/$(uname -r)/build M=$PWD/drivers/net/bonding modules -j"$(nproc)"# 3) 部署 + 持久化参数
    mkdir -p /lib/modules/$(uname -r)/weak-updates/bonding/
    cp -v drivers/net/bonding/bonding.ko /lib/modules/$(uname -r)/weak-updates/bonding/
    depmod -a
    echo 'options bonding arp_broadcast_mode=1' > /etc/modprobe.d/bonding.conf
    cat >/etc/modprobe.d/override-bonding.conf <<'EOF'
    install bonding /sbin/insmod /lib/modules/$(uname -r)/weak-updates/bonding/bonding.ko $CMDLINE_OPTS
    EOF# 4) 重载并验证
    modprobe -r bonding 2>/dev/null || true
    modprobe bonding
    modinfo bonding | egrep 'filename|parm'
    cat /sys/module/bonding/parameters/arp_broadcast_mode# 5) 抓包验证
    tcpdump -ni eth0 arp -vv &
    tcpdump -ni eth1 arp -vv &
    # 在另一台同网段 ping bond0_IP,观察两口同时 ARP Reply
    

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

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    网页连接摄像头

    摄像机处理 <!-- camera_solve.html --> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

    FPGA雷达信号处理之:自适应门限阈值

    一、原理 参考这个博主&#xff0c;讲的很仔细&#xff1a;基于脉冲功率的雷达脉冲参数检测原理详解 二、FPGA实现 使用system generator搭建算法模型如下&#xff1a; 在这里&#xff0c;滤波器窗长度为8&#xff0c;原博主设置为50效果更好&#xff0c;门限公式如下&#xf…

    Vue 中实现选中文本弹出弹窗的完整指南

    在现代 Web 应用中&#xff0c;选中文本后显示相关操作或信息是一种常见的交互模式。本文将详细介绍如何在 Vue 中实现选中文本后弹出弹窗的功能&#xff0c;包括其工作原理、多种实现方式以及实际项目中的应用示例。 一、实现原理 1. 文本选中检测机制 浏览器提供了 Select…

    第4节-排序和限制-FETCH

    摘要: 在本教程中&#xff0c;你将学习如何使用 PostgreSQL 的 FETCH 子句从查询中检索部分行。 PostgreSQL FETCH 简介 在 PostgreSQL 中&#xff0c;OFFSET 子句的作用类似于 LIMIT 子句。FETCH 子句允许你限制查询返回的行数。 LIMIT 子句并非 SQL 标准的一部分。不过&#…

    洛谷 P2680 [NOIP 2015 提高组] 运输计划(二分答案 + 树上差分)

    题目链接题目概括与评价 很经典&#xff0c;突破口藏的很深&#xff0c;求最小值这里&#xff0c;是问题切入点&#xff0c;想到用二分答案&#xff0c;然后思考怎么写 f_check 函数。二分答案树上差分。代码 #include <iostream> #include <vector> #include <…

    接力邓承浩,姜海荣能讲好深蓝汽车新故事吗?

    出品 | 何玺排版 | 叶媛深蓝汽车迎来新话事人。9月5日&#xff0c;新央企长安汽车旗下品牌深蓝汽车传出新的人事调整。多家业内媒体报道称&#xff0c;荣耀前中国区CMO姜海荣已正式加入长安汽车&#xff0c;并出任旗下深蓝汽车CEO一职。原CEO邓承浩则升任深蓝汽车董事长&#x…

    esp32-c3写一个收集附近 WiFi 和蓝牙信号通过

    下面给你一个基于 ESP-IDF(v5.x) 的完整示例&#xff1a;在 ESP32-C3 上同时扫描附近 Wi-Fi 与蓝牙&#xff08;BLE&#xff09;广播&#xff0c;把结果以 JSON 结构统一输出到串口&#xff0c;并且可可选通过 MQTT 上报到服务器&#xff08;打开一个宏即可&#xff09;。日志默…

    文心大模型 X1.1:百度交出的“新深度思考”答卷

    文心大模型 X1.1&#xff1a;百度交出的“新深度思考”答卷 2025年9月9日&#xff0c;WAVE SUMMIT 2025深度学习开发者大会在北京正式召开&#xff0c;由深度学习技术及应用国家工程研究中心主办&#xff0c;百度飞桨与文心大模型联合承办。大会上&#xff0c;百度正式发布了基…

    开始 ComfyUI 的 AI 绘图之旅-Flux.1图生图(八)

    文章标题一、Flux Kontext Dev1.关于 FLUX.1 Kontext Dev1.1 版本说明1.2 工作流说明1.3 模型下载2.Flux.1 Kontext Dev 工作流2.1 工作流及输入图片下载2.2 按步骤完成工作流的运行3.Flux Kontext 提示词技巧3.1 基础修改3.2 风格转换3.3 角色一致性3.4 文本编辑4.常见问题解决…

    Java 生成微信小程序二维码

    1. java 二维码生成工具类import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.pdatao.api.controller.file.FileController; import com.pdatao.api.error.CommunityException; import org.apache.commons.io.IOUtils; import org.springframe…

    智慧健康触手可及:AI健康小屋——未来健康管理的全能守护者

    AI健康小屋&#xff0c;这座融合人工智能、物联网与医疗科技的“健康堡垒”&#xff0c;正悄然重构健康管理生态。它以科技为引擎&#xff0c;将专业医疗资源下沉至社区、企业、家庭&#xff0c;通过智能检测、精准分析、个性化干预&#xff0c;实现从疾病治疗到主动预防的健康…

    [工作表控件19] 验证规则实战:如何用正则表达式规范业务输入?

    在企业应用中,数据准确性至关重要。工作表控件通过“验证规则”能力,支持在文本字段和附件字段中使用正则表达式(RegEx)进行格式校验。它能帮助开发者轻松实现邮箱、身份证号、车牌号、URL 等格式的高效验证,大幅提升数据质量与表单使用体验。 一、官方功能介绍与基础能力…

    uniapp分包实现

    关于分包优化的说明 在对应平台的配置下添加"optimization":{"subPackages":true}开启分包优化 目前只支持mp-weixin、mp-qq、mp-baidu、mp-toutiao、mp-kuaishou的分包优化 分包优化具体逻辑&#xff1a; 静态文件&#xff1a;分包下支持 static 等静态…

    ctfshow_web14------(PHP+switch case 穿透+SQL注入+文件读取)

    题目&#xff1a;解释&#xff1a;$c intval($_GET[c]); //获取整数值 6sleep($c);//延迟执行当前脚本若干秒。提示一下哈没有break会接着执行下面的但是像是44444&#xff0c;555555,sleep的时间太久我们用3进入here_1s_your_f1ag.php是一个查询页面&#xff0c;sql注入查看源…

    linux x86_64中打包qt

    下载安装 地址: Releases linuxdeploy/linuxdeploy mv linuxdeploy-x86_64.AppImage linuxdeployqtchmod 777 linuxdeployqtsudo mv linuxdeployqt /usr/local/bin/linuxdeployqt --version报错 Applmage默认依赖FUSE&#xff0c;需要挂载自身为虚拟文件系统才能运行, ubuntu…

    华为昇腾CANN开发实战:算子自定义与模型压缩技术指南

    点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 随着人工智能技术的飞速发展&#xff0c;越来越多…

    Vue3源码reactivity响应式篇之reactive响应式对象的track与trigger

    概览 在BaseReactiveHandler类的get方法中&#xff0c;有如下代码块if (!isReadonly2){track(target, "get", key);}&#xff0c;这表示通过reactive、shallowReactive创建的响应式对象&#xff0c;非只读的&#xff0c;当读取代理对象proxyTarget的某个属性key时&am…

    VRRP 多节点工作原理

    VRRP 多节点工作原理 基本概念 VRRP 的设计初衷是给一组节点提供一个 虚拟路由器&#xff0c;对外只表现出一个 VIP。协议规定&#xff1a;同一个 VRRP 实例 下始终只有 一个 Master 持有 VIP&#xff0c;其它全部是 Backup。 Master → 持有 VIP&#xff0c;负责转发流量到Mas…

    Gradio全解11——Streaming:流式传输的视频应用(9)——使用FastRTC+Gemini创建沉浸式音频+视频的艺术评论家

    Gradio全解11——Streaming&#xff1a;流式传输的视频应用&#xff08;9&#xff09;——使用FastRTCGemini创建沉浸式音频视频的艺术评论家11.9 使用FastRTCGemini创建实时沉浸式音频视频的艺术评论家11.9.1 准备工作及音频图像编码器1. 项目说明及准备工作2. 音频和图像编码…

    Django入门笔记

    Python知识点&#xff1a;函数、面向对象。前端开发&#xff1a;HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架&#xff1a;Flask&#xff0c;自身短小精悍 第三方组件。Django&#xff0c;内部已集成了很多组件 第三方组件。【主要】1.安装djang…