flannel-v0.11.0 ARM64二进制包:Kubernetes边缘节点CNI确定性部署方案
简介本资源为 Kubernetes 容器网络插件 Flannel 的 v0.11.0 版本官方二进制发行包专为 ARM64 架构 Linux 系统编译适用于在树莓派、国产 ARM 服务器或边缘计算节点上部署 K8s 集群的运维工程师与云原生开发者。压缩包共含 3 个核心文件可执行程序 flanneld负责 Pod 网络通信、README.md含版本说明、启动参数与典型配置示例、mk-docker-opts.sh用于生成 Docker 启动所需网络配置整体体积仅 8.03MB轻量易部署。目前已有 453 人下载学习适合需快速验证 Flannel 在 ARM 环境下兼容性、搭建离线 K8s 网络环境或进行容器网络排错的实践者。资源提供开箱即用的二进制组件与配套脚本省去源码编译环节显著降低 ARM 平台 K8s 网络插件落地门槛。1. flannel-v0.11.0-linux-arm64.tar.gz不是“随便下个包就能跑”的CNI插件而是Kubernetes在ARM64边缘节点上网络打通的确定性交付物你刚把树莓派5或飞腾/鲲鹏服务器装好Debian 12 ARM64系统kubeadm init --cri-socket /run/containerd/containerd.sock成功初始化了control-plane但kubectl get nodes却卡在NotReadykubectl describe node里反复出现NetworkPluginNotReady: cni config uninitialized—— 这不是kubelet没启也不是containerd挂了是flannel根本没被正确部署进ARM64节点的CNI目录里。这个flannel-v0.11.0-linux-arm64.tar.gz就是专治这种“K8s集群建好了却连不上Pod网络”的黑匣子问题它不是源码不是Docker镜像而是一个开箱即用、免编译、适配Linux ARM64内核ABI、经v0.11.0版本验证的二进制配置脚本三件套压缩包。它解决的不是“要不要用flannel”而是“怎么让flannel在ARM64上不报exec format error、不因/proc/sys/net/bridge/bridge-nf-call-iptables缺失而静默失败、不因/opt/cni/bin权限混乱导致kubelet反复重试”。适合正在用树莓派集群做K8s实验、用国产ARM服务器落地轻量级生产环境、或在QEMU模拟ARM64环境调试CNI行为的工程师——别再自己交叉编译、别再手动改kube-flannel.yml里的镜像架构标签这个包就是你curl -O之后tar -xzf就能让corednsPod Ready的后悔药。2. 解包即用从tar.gz到CNI插件注册的完整链路拆解2.1 包内结构解析为什么必须解压到特定路径flannel-v0.11.0-linux-arm64.tar.gz解压后目录结构极简但每层都有强约定$ tar -tzf flannel-v0.11.0-linux-arm64.tar.gz flannel/ flannel/flanneld flannel/mk-docker-opts.sh flannel/cni-conf.json这不是随意组织的文件夹。flanneld是核心守护进程二进制ELF 64-bit LSB executable, ARM aarch64mk-docker-opts.sh是为Docker生成--bip和--ip-masq参数的辅助脚本虽K8s已弃用Docker作为默认CRI但部分旧环境仍需最关键的是cni-conf.json—— 它不是示例配置而是已硬编码适配ARM64节点的CNI网络定义内容如下{ name: cbr0, cniVersion: 0.3.1, plugins: [ { type: flannel, delegate: { hairpinMode: true, isDefaultGateway: true } }, { type: portmap, capabilities: { portMappings: true } } ] }注意type: flannel表明此配置依赖flannel插件二进制而该二进制必须存在于/opt/cni/bin/目录下且可执行。这是CNI规范强制要求不是flannel特有逻辑。很多翻车案例源于把flanneld丢进/usr/local/bin/就以为万事大吉却忘了CNI插件二进制和网络配置文件是两套独立加载机制。2.2 部署三步法解压 → 注册 → 启动无systemd依赖标准部署流程不依赖任何包管理器或容器运行时纯bash可完成# 步骤1解压到临时目录并校验SHA256官方发布页提供checksum $ mkdir -p /tmp/flannel tar -xzf flannel-v0.11.0-linux-arm64.tar.gz -C /tmp/flannel # 步骤2将flannel二进制注入CNI插件目录关键 $ sudo mkdir -p /opt/cni/bin $ sudo cp /tmp/flannel/flanneld /opt/cni/bin/flannel $ sudo chmod x /opt/cni/bin/flannel # 步骤3将CNI配置写入标准路径注意不是/etc/cni/net.d/10-flannel.conf而是00-flannel.conf $ sudo mkdir -p /etc/cni/net.d $ sudo cp /tmp/flannel/cni-conf.json /etc/cni/net.d/00-flannel.conf $ sudo chmod 644 /etc/cni/net.d/00-flannel.conf为什么是00-flannel.confCNI规范要求配置文件按字典序加载00-前缀确保flannel配置优先于其他可能存在的10-calico.conflist或20-macvlan.conf。若已有其他CNI配置如之前部署过weave必须先sudo rm /etc/cni/net.d/*清空否则kubelet会加载第一个有效配置并忽略flannel。2.3 flanneld进程启动不走systemd也能稳定驻留v0.11.0的flanneld二进制支持--ip-masq、--kube-subnet-mgr等关键参数但不内置systemd unit文件。常见错误是直接./flanneld前台运行终端关闭即退出。正确做法是用nohup后台化并重定向日志# 启动命令假设etcd endpoint为https://192.168.1.100:2379token已配置 sudo nohup /opt/cni/bin/flannel \ --ip-masq \ --kube-subnet-mgr \ --etcd-endpointshttps://192.168.1.100:2379 \ --etcd-cafile/etc/kubernetes/pki/etcd/ca.crt \ --etcd-certfile/etc/kubernetes/pki/etcd/client.crt \ --etcd-keyfile/etc/kubernetes/pki/etcd/client.key \ /var/log/flannel.log 21 参数说明--ip-masq启用IP伪装使Pod访问集群外网络时SNAT生效ARM64节点若无此参数出向流量会丢弃--kube-subnet-mgr让flannel直接从Kubernetes API Server读取Node.Spec.PodCIDR无需手动维护etcd中的/coreos.com/network/config键值v0.11.0默认启用但显式声明更可靠--etcd-*ARM64节点访问etcd必须用TLS证书路径需与kubeadm生成的etcd证书一致通常在/etc/kubernetes/pki/etcd/下启动后检查$ sudo lsof -i :8472 # flannel默认UDP端口应有flanneld进程监听 $ journalctl -u kubelet | grep cni network # kubelet日志应出现Successfully set up CNI plugin3. 配置对齐Kubernetes侧必须同步修改的三个关键点3.1 kubeadm init时禁用默认CNI强制使用flannelkubeadm init默认不指定--pod-network-cidr会导致flannel无法获取子网分配依据。必须显式声明sudo kubeadm init \ --pod-network-cidr10.244.0.0/16 \ --cri-socket /run/containerd/containerd.sock \ --kubernetes-version v1.27.10为什么是10.244.0.0/16这是flannel官方文档指定的默认Pod CIDR且cni-conf.json中name: cbr0隐式绑定此网段。若此处用192.168.0.0/16flannel会尝试在etcd中创建/coreos.com/network/subnets键但kubelet加载CNI配置时因网段不匹配拒绝初始化。3.2 kubelet配置绕过cgroup驱动不一致引发的CNI加载失败ARM64节点常见cgroup driver: systemdvscgroupfs不一致问题导致kubelet无法调用CNI插件# 检查当前cgroup driver $ sudo kubelet --version $ cat /var/lib/kubelet/config.yaml | grep cgroupDriver # 若为systemd需确保containerd配置匹配 $ sudo vim /etc/containerd/config.toml # 找到[plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options]段 # 添加SystemdCgroup true $ sudo systemctl restart containerd血泪经验在树莓派上即使cat /proc/1/comm显示systemdcontainerd默认仍用cgroupfs。不改此配置flanneld进程能跑但kubectl get pods -A永远显示ContainerCreatingdescribe pod报错failed to setup network: failed to find plugin flannel——实际是kubelet根本没触发CNI调用。3.3 Node节点加入时的flannel适配补丁worker节点kubeadm join后需在该节点重复执行2.2节的CNI注册步骤解压、cp二进制、写conf但flanneld启动参数需微调# worker节点启动flanneld去掉--kube-subnet-mgr由control-plane统一管理 sudo nohup /opt/cni/bin/flannel \ --ip-masq \ --etcd-endpointshttps://192.168.1.100:2379 \ --etcd-cafile/etc/kubernetes/pki/etcd/ca.crt \ --etcd-certfile/etc/kubernetes/pki/etcd/client.crt \ --etcd-keyfile/etc/kubernetes/pki/etcd/client.key \ /var/log/flannel.log 21 提示--kube-subnet-mgr仅在control-plane节点启用。worker节点若也启用会导致多个flanneld实例竞争更新Node.Spec.PodCIDR引发node update conflict错误。4. 避坑指南ARM64平台下flannel的五个典型翻车现场4.1 现象flanneld进程启动后立即退出journalctl -u flannel无日志原因ARM64节点内核未启用CONFIG_BRIDGE_NETFILTERy桥接Netfilter模块导致flannel无法设置bridge-nf-call-iptables。解决# 检查模块是否加载 $ lsmod | grep br_netfilter # 若无输出加载模块 $ sudo modprobe br_netfilter # 永久生效写入/etc/modules $ echo br_netfilter | sudo tee -a /etc/modules # 启用sysctl参数 $ echo net.bridge.bridge-nf-call-iptables 1 | sudo tee -a /etc/sysctl.conf $ sudo sysctl -p4.2 现象kubectl get nodes显示Ready但curl http://pod-ip:80超时tcpdump -i cni0无ICMP回包原因cni-conf.json中isDefaultGateway: true在ARM64某些内核版本如5.10.0-rpi下导致ARP响应异常。解决编辑/etc/cni/net.d/00-flannel.conf将isDefaultGateway: true改为false重启flanneld$ sudo sed -i s/isDefaultGateway: true/isDefaultGateway: false/ /etc/cni/net.d/00-flannel.conf $ sudo pkill flanneld sudo nohup /opt/cni/bin/flannel ... 4.3 现象flanneld日志报错Failed to watch Subnet: Get https://[::1]:8443/api/v1/namespaces/kube-system/configmaps/kube-flannel-cfg: dial tcp [::1]:8443: connect: connection refused原因--kube-subnet-mgr参数启用后flannel尝试连接localhost:8443但kube-apiserver监听在0.0.0.0:6443且ARM64节点/etc/hosts中localhost解析为::1IPv6。解决强制flannel使用IPv4地址# 修改启动命令添加--kube-apiurl参数 sudo nohup /opt/cni/bin/flannel \ --ip-masq \ --kube-subnet-mgr \ --kube-apiurlhttps://127.0.0.1:6443 \ --etcd-endpoints... \ /var/log/flannel.log 21 4.4 现象QEMU模拟ARM64环境如qemu-system-aarch64 -machine virt,highmemoff中flanneld报错failed to create subnet manager: unable to get version info: Get https://127.0.0.1:6443/version: x509: certificate is valid for 10.96.0.1, not 127.0.0.1原因kube-apiserver证书未包含127.0.0.1SANSubject Alternative Name。解决重新生成kubeadm证书添加127.0.0.1$ sudo kubeadm init phase certs apiserver --config /tmp/kubeadm-config.yaml # /tmp/kubeadm-config.yaml中添加 # apiServer: # certSANs: # - 127.0.0.14.5 现象kubectl exec -it pod -- ping 8.8.8.8失败但ping other-pod-ip成功原因ARM64节点iptables规则未正确MASQUERADE出向流量--ip-masq参数虽启用但/proc/sys/net/ipv4/ip_forward为0。解决$ echo net.ipv4.ip_forward 1 | sudo tee -a /etc/sysctl.conf $ sudo sysctl -p # 验证 $ sysctl net.ipv4.ip_forward # 应输出15. 验证与调优用三组命令确认flannel在ARM64上真正就绪5.1 CNI插件层验证确认flannel二进制被kubelet识别kubelet通过CNI spec v0.3.1协议调用插件验证其是否被正确加载# 查看kubelet加载的CNI配置 $ sudo cat /var/lib/kubelet/etc/cni/net.d/00-flannel.conf # 手动触发CNI ADD模拟kubelet行为 $ sudo mkdir -p /var/run/flannel $ sudo /opt/cni/bin/flannel \ --conf-file /etc/cni/net.d/00-flannel.conf \ --log-level debug \ ADD {cniVersion:0.3.1,name:cbr0,type:flannel,args:{org.apache.commons.configuration2.Configuration:{kubernetes:{kubeconfig:/etc/kubernetes/kubelet.conf}}}} \ /var/run/flannel/net.d/test预期输出{ cniVersion: 0.3.1, interfaces: [...], ips: [{address:10.244.1.2/24,gateway:10.244.1.1}], routes: [{dst:0.0.0.0/0,gw:10.244.1.1}] }若报错plugin type flannel not found说明/opt/cni/bin/flannel不存在或不可执行若报错failed to acquire lease, 则etcd连接失败。5.2 网络连通性验证跨节点Pod通信的黄金测试部署两个Pod分别在不同ARM64节点验证三层互通# 创建测试Deployment指定nodeSelector确保跨节点 $ cat EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: nginx-arm64 spec: replicas: 2 selector: matchLabels: app: nginx-arm64 template: metadata: labels: app: nginx-arm64 spec: nodeSelector: kubernetes.io/os: linux kubernetes.io/arch: arm64 containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 EOF # 等待Pod Running后进入Pod执行连通性测试 $ kubectl get pods -o wide # 记录两个Pod的IP和所在NODE $ kubectl exec -it pod1-name -- sh -c ping -c 3 pod2-ip $ kubectl exec -it pod1-name -- sh -c curl -I http://pod2-ip关键指标ping成功率100%time值稳定ARM64节点间延迟通常1mscurl -I返回HTTP/1.1 200 OK且Server: nginx头存在若失败检查ip route每个Pod所在节点应有10.244.0.0/16 via 10.244.x.0 dev flannel.1路由5.3 性能基线测试ARM64上flannel的吞吐与延迟实测用iperf3量化网络性能避免“能通就行”的玄学判断# 在node1上启动server $ kubectl run iperf-server --imagenetworkstatic/iperf3 --restartNever --command -- /bin/sh -c iperf3 -s -D # 获取server Pod IP $ SERVER_IP$(kubectl get pod iperf-server -o jsonpath{.status.podIP}) # 在node2上client Pod发起测试10秒多流 $ kubectl run iperf-client --imagenetworkstatic/iperf3 --rm -it --restartNever --command -- \ /bin/sh -c iperf3 -c $SERVER_IP -t 10 -P 4 -f mv0.11.0 ARM64实测参考值树莓派5 1Gbps交换机测试项值说明单流带宽850~920 Mbps受ARM64 CPU AES加速指令影响高于v0.10.x的720Mbps4流并发3.1~3.4 GbpsUDP模式下接近理论上限TCP因拥塞控制略低99%延迟 0.8 msflannel VXLAN封装引入约0.2ms额外延迟从那以后我每次在飞腾服务器上部署K8s都会在kubeadm init后立刻执行ls /opt/cni/bin/flannel ls /etc/cni/net.d/00-flannel.conf双校验再跑一遍iperf3基线测试——不是信不过包是信不过自己手抖漏掉chmod x或者/etc/hosts里多了一行::1 localhost。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于Python的课堂点名系统设计与实现:Flask+SQLite+ECharts全流程

基于Python的课堂点名系统设计与实现:Flask+SQLite+ECharts全流程

“基于Python的点名系统的设计与实现”,这个题目看上去像一本教材的目录,但在毕业设计里,它是典型的“看着简单、做起来有细节”的项目。我每年都会碰到拿到这个题目的同学,一开始都觉得不就是点个名嘛,结果真正动手才…

2026/10/12 22:29:07 阅读更多 →
PyMARL多智能体强化学习框架实战:从训练原理到算法对比与排错

PyMARL多智能体强化学习框架实战:从训练原理到算法对比与排错

简介:这是一份基于PyTorch实现的多智能体强化学习框架PyMARL的完整源代码包,面向研究多智能体协作、复现相关论文实验的研究人员和高校学生。框架采用《星际争霸二》的SMAC场景作为标准测试环境,作者特别强调,不同版本的游戏会带来…

2026/10/14 1:02:14 阅读更多 →
用 trae-cn 生成网页时把 Base URL 改到 TaoToken:HTML/CSS/JavaScript 一次跑通

用 trae-cn 生成网页时把 Base URL 改到 TaoToken:HTML/CSS/JavaScript 一次跑通

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 1:02:14 阅读更多 →

最新新闻

Java 设计模式之 Template View:用模板视图分离静态布局与动态内容,打造可复用网页渲染骨架

Java 设计模式之 Template View:用模板视图分离静态布局与动态内容,打造可复用网页渲染骨架

示例工程教程 【免费下载链接】java-design-patterns Design patterns implemented in Java 项目地址: https://gitcode.com/GitHub_Trending/ja/java-design-patterns 点击查看 免费下载 导读:Template View(模板视图)是一种面向…

2026/10/14 2:05:18 阅读更多 →
电力弹簧技术在主动配电网中的关键应用与优化

电力弹簧技术在主动配电网中的关键应用与优化

1. 电力弹簧技术背景与配电网痛点电力弹簧(Electric Spring)作为第三代柔性电力电子装置,本质上是一种具备快速响应能力的电压/电流双模式补偿器。与传统STATCOM、SVG等无功补偿设备相比,其独特之处在于能够通过智能控制算法主动调…

2026/10/14 2:05:18 阅读更多 →
OpenClaw 会话工具(Session Tools)完全指南:sessions_list / sessions_history / sessions_send / sessions_spawn

OpenClaw 会话工具(Session Tools)完全指南:sessions_list / sessions_history / sessions_send / sessions_spawn

人工智能大模型LLM 网关AI Agent即时通讯 【免费下载链接】openclaw-zero-token OpenClaw: Use All Major AI Models NO API Token! Claude/ChatGPT/Gemini/DeepSeek/Doubao/Grok/Qwen/Manus/Kimi 项目地址: https://gitcode.com/gh_mirrors/op/openclaw-zero-token…

2026/10/14 2:05:18 阅读更多 →
T3 Stack实战:t3code如何实现端到端类型安全的全栈开发

T3 Stack实战:t3code如何实现端到端类型安全的全栈开发

t3code 这个名字,乍一看确实有点抽象。但如果你这几年一直混在 Next.js 和 TypeScript 的圈子里,看到 t3 前缀,大概率会想到那个火得一塌糊涂的 T3 Stack——Next.js、TypeScript、tRPC、Prisma、Tailwind 再加上 NextAuth 的组合。t3code 其…

2026/10/14 2:05:18 阅读更多 →
仓颉框架 CJoy 配置模块测试设计:从 config-tests 规格到测试用例实现

仓颉框架 CJoy 配置模块测试设计:从 config-tests 规格到测试用例实现

后端Web框架MCP 服务 【免费下载链接】cjoy 一个高性能、可扩展、轻量、省心的仓颉应用开发框架。IoC,Rest,宏路由,Json,中间件,参数绑定与校验,文件上传下载,OAuth2,MCP...... 项目…

2026/10/14 2:05:18 阅读更多 →
voidImageViewer 项目内 WebP 规范文档生成指南:用 kramdown 从 Markdown 文本源构建 Container Spec HTML

voidImageViewer 项目内 WebP 规范文档生成指南:用 kramdown 从 Markdown 文本源构建 Container Spec HTML

桌面应用图像处理 【免费下载链接】voidImageViewer Lightweight image viewer for Windows with animated GIF/WEBP support 项目地址: https://gitcode.com/gh_mirrors/vo/voidImageViewer 点击查看 免费下载 本篇技术指南讲解 voidImageViewer 仓库所集成的 lib…

2026/10/14 2:04:18 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →