SELinux状态查看与模式切换:从强制模式到关闭的完整指南
1. 项目概述为什么我们需要关注SELinux在Linux系统运维和开发中尤其是涉及到服务部署、端口监听、文件访问时你很可能遇到过一些“诡异”的权限问题。比如你的Nginx配置完全正确但就是无法访问某个目录下的静态文件你的MySQL服务明明启动了却无法写入数据目录或者你编译安装了一个新软件启动时却报了一堆“Permission denied”的错误即使用root用户也无济于事。如果你反复检查了文件权限ls -l、用户组归属甚至用setfacl加了ACL规则都无果那么是时候把目光投向一个更深层的安全卫士——SELinux了。SELinux全称Security-Enhanced Linux直译过来就是“安全增强的Linux”。它不是某个具体的软件而是由美国国家安全局NSA主导开发并贡献给开源社区的一套强制访问控制MAC安全架构。与我们熟悉的自主访问控制DAC就是rwx权限不同SELinux为系统中的进程、文件、端口、网络接口等所有对象都打上了“安全上下文”标签并制定了一套极其严格的策略规则。这套规则定义了“谁”进程在什么条件下可以访问“什么”资源。简单来说在DAC检查通过后SELinux还会进行第二轮更严格的审查。这就像进一个机密大楼DAC检查你是否有门禁卡文件权限而SELinux则要核查你的身份级别、访问目的和要进入的具体房间是否全部符合安全手册的规定。对于初学者甚至一些中级运维人员来说SELinux的严格策略常常是“麻烦”的代名词。当你不了解其工作原理时它带来的阻碍远大于安全感。因此掌握如何查看SELinux的当前状态以及在调试和测试环境中如何临时或永久地调整其模式包括关闭就成为了一项非常基础且关键的生存技能。这绝不是鼓励在生产环境关闭SELinux恰恰相反理解如何操作是为了更好地排查问题并最终学会在开启SELinux的前提下让应用顺畅运行。2. SELinux核心概念与状态解读在动手操作之前我们必须先理解几个核心概念这能帮你明白你看到的每一个状态输出究竟意味着什么。2.1 SELinux的三种运行模式SELinux并非只有“开”和“关”两种状态它有三种主要的运行模式这决定了其策略的执行严格程度。Enforcing强制模式这是SELinux的完全体。在此模式下所有策略规则都会被强制执行。任何违反策略的访问都会被阻止并在审计日志中记录。这是生产环境推荐的安全模式。Permissive宽容模式这是一个极其有用的“学习”和“调试”模式。在此模式下SELinux策略依然被加载和计算但当发生违反策略的访问时不会真正阻止只会记录一条警告信息到日志。你可以把它想象成一个只报警但不拦截的保安。这个模式对于排查“是否是SELinux导致的问题”至关重要因为它允许你看到所有潜在的策略违规而不会中断服务。Disabled关闭模式SELinux内核模块完全不被加载系统使用传统的DAC权限控制。从Permissive或Enforcing切换到Disabled通常需要重启系统反之亦然。重要提示在生产环境中最佳实践是保持Enforcing模式并通过修改策略或安全上下文来解决问题而不是直接禁用。Permissive模式是排查问题的黄金工具。2.2 理解安全上下文Security ContextSELinux的世界里一切对象文件、目录、进程、端口等都有一个“标签”叫做安全上下文。你可以通过ls -Z和ps -Z命令来查看。# 查看文件的安全上下文 ls -Z /var/www/html/ # 输出可能类似-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html # 查看进程的安全上下文 ps -Z -C nginx # 输出可能类似system_u:system_r:httpd_t:s0 1234 ? nginx: worker process一个典型的安全上下文格式为用户:角色:类型:灵敏度。对我们日常问题排查最有用的部分是类型Type。例如httpd_sys_content_t是Web内容文件的类型httpd_t是Apache/Nginx进程的类型。策略规则大量基于类型来定义访问权限比如“允许httpd_t类型的进程读取httpd_sys_content_t类型的文件”。2.3 策略Policy是什么策略是一套预定义的规则库它明确规定了不同安全上下文之间的允许交互。主流的策略有targeted针对常见网络服务默认和mls多级安全更复杂。我们通常使用targeted策略它只保护关键的系统进程和服务对普通用户进程限制较少在安全性和易用性之间取得了平衡。3. 查看SELinux状态的详细方法当遇到权限问题时第一步永远是确认SELinux的当前状态。以下是几种最常用、最全面的方法。3.1 使用getenforce命令最直接这是最快、最常用的方法它直接返回当前的执行模式。getenforce输出结果只有三种可能Enforcing、Permissive或Disabled。这个命令通常是你诊断问题的起点。3.2 使用sestatus命令信息最全如果你想获得一份关于SELinux的“体检报告”sestatus命令是不二之选。它提供了比getenforce丰富得多的信息。sestatus一个典型的输出如下SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 33我们来逐行解读这个报告SELinux status: 核心开关enabled表示已启用可能是Enforcing或Permissivedisabled表示已禁用。Current mode: 当前运行模式即getenforce的结果。Mode from config file: 配置文件/etc/selinux/config中设定的模式决定下次重启后的模式。Loaded policy name: 当前加载的策略名称通常是targeted。这个命令能帮你一眼看出“当前状态”和“配置状态”是否一致对于诊断因配置未生效导致的问题非常有用。3.3 检查配置文件/etc/selinux/config这个文件决定了系统启动时SELinux的初始状态。即使你运行时用命令改了模式重启后还是会以这个文件为准。cat /etc/selinux/config关键的两行是SELINUXenforcing SELINUXTYPEtargetedSELINUX可以设置为enforcing,permissive, 或disabled。SELINUXTYPE指定策略类型。3.4 内核启动参数检查在极少数情况下SELinux可能会在内核启动时被参数禁用。你可以通过以下命令检查cat /proc/cmdline | grep selinux如果输出中包含selinux0则表示在内核层面禁用了SELinux。这通常是在GRUB引导配置中设置的。4. 调整SELinux模式从Permissive到关闭了解状态后我们进入实操环节。根据不同的需求我们有多种调整模式的方法。4.1 临时切换模式无需重启在调试时我们经常需要在Enforcing和Permissive之间临时切换。这可以通过setenforce命令实现它只改变当前运行状态重启后失效。# 从 Enforcing 切换到 Permissive最常用的调试操作 sudo setenforce 0 # 使用 getenforce 验证应输出 Permissive # 从 Permissive 切换回 Enforcing sudo setenforce 1 # 使用 getenforce 验证应输出 Enforcing注意setenforce命令只能用于在Enforcing和Permissive之间切换。它无法将状态从Disabled切换到Enforcing反之亦然。因为Disabled意味着SELinux内核模块未加载这需要修改配置文件并重启。4.2 永久修改模式需修改配置文件如果你确认需要在某个环境中长期改变SELinux模式例如一个内部测试环境你需要修改配置文件。编辑SELinux主配置文件sudo vi /etc/selinux/config # 或使用 sudo nano /etc/selinux/config找到SELINUX这一行将其值修改为你想要的目标永久启用强制模式SELINUXenforcing永久启用宽容模式SELINUXpermissive永久关闭SELinuxSELINUXdisabled保存并退出编辑器。重要警告将SELINUX从enforcing或permissive改为disabled或者从disabled改为enforcing/permissive修改不会立即生效必须重启系统。重启后使用sestatus命令确认更改已生效。4.3 关闭SELinux的完整流程与深层影响“关闭SELinux”通常指的是将其设置为disabled模式。以下是标准操作流程备份配置文件好习惯sudo cp /etc/selinux/config /etc/selinux/config.bak编辑配置文件sudo vi /etc/selinux/config将SELINUXenforcing改为SELINUXdisabled。重启系统sudo reboot验证 系统重启后执行sestatus你应该会看到SELinux status: disabled。关闭SELinux的深远影响 关闭SELinux不仅仅是关掉一个安全功能那么简单它还会带来一些连锁反应文件系统重新标记当从disabled状态重新启用SELinux设为enforcing或permissive并重启后系统需要对整个文件系统进行“重新标记”relabel即为所有文件重新打上正确的安全上下文。这个过程在首次启动时会非常耗时取决于你磁盘上的文件数量。潜在的兼容性问题一些专门为SELinux环境设计的软件或脚本在SELinux关闭后可能会行为异常。安全风险这是最显而易见的你移除了一个重要的纵深防御层。因此我的个人建议是在开发、测试或学习环境中如果你被SELinux问题困扰优先使用setenforce 0切换到Permissive模式进行调试和验证。只有在确认问题根源是SELinux且短期内无法解决策略配置时再考虑在非生产环境中将其disabled。对于生产环境目标永远是“在Enforcing模式下解决问题”。5. 问题排查实战当SELinux成为“拦路虎”知道怎么开关还不够真正的价值在于如何利用这些知识解决问题。下面是一个经典的排查流程。5.1 诊断问题是否由SELinux引起当你遇到权限错误时按以下步骤排查第一反应临时切换到Permissive模式sudo setenforce 0然后立即重现你的操作比如访问网页、启动服务。如果操作立刻成功了那么几乎可以断定是SELinux策略在作祟。这是一个黄金法则。查看SELinux拒绝日志即使是在Enforcing模式下SELinux的所有拒绝访问都会被记录。主要查看两个地方/var/log/audit/audit.log如果系统安装了auditd服务这里是主要日志。信息很原始需要工具解析。/var/log/messages或/var/log/syslog通常会有更易读的SELinux警告信息格式类似SELinux is preventing /usr/sbin/nginx from read access on the file index.html.最快捷的方式是使用sealert工具需要安装setroubleshoot包来生成人类可读的报告。# 安装工具以RHEL/CentOS为例 sudo yum install setroubleshoot -y # 分析最新的拒绝信息 sudo sealert -a /var/log/audit/audit.log报告会明确指出是哪个进程、想访问什么、违反了哪条策略并经常直接给出修复建议命令比如运行sudo chcon ...。5.2 常用修复命令而非直接关闭拿到sealert的建议后或者根据经验你可以使用以下命令修复而不是关闭SELinux修改文件安全上下文chcon临时更改文件或目录的SELinux类型。# 将 /my/custom/web 目录的类型改为Web内容标准类型 sudo chcon -R -t httpd_sys_content_t /my/custom/web/ # -R: 递归 # -t: 设置类型注意chcon做的修改不是永久的如果文件系统被重新标记restorecon或包管理器更新了文件更改可能会丢失。恢复默认安全上下文restorecon将文件的安全上下文恢复为系统策略中定义的默认值。# 当你把文件移动到一个已有默认上下文定义的目录时常用此命令修复 sudo restorecon -Rv /var/www/html/ # -R: 递归 # -v: 显示过程设置永久上下文semanage fcontext restorecon这是生产环境的标准做法。它修改策略使更改在relabel后依然有效。# 1. 添加一条文件上下文规则/my/custom/web(/.*)? 及其下所有文件默认上下文应为 httpd_sys_content_t sudo semanage fcontext -a -t httpd_sys_content_t /my/custom/web(/.*)? # 2. 立即应用这条规则到现有文件 sudo restorecon -Rv /my/custom/web/调整布尔值setseboolSELinux有很多开关式的布尔值用于快速调整策略。# 查看所有布尔值 getsebool -a # 查看与httpd相关的布尔值 getsebool -a | grep httpd # 永久开启允许HTTPD访问家目录例如用于开发环境 sudo setsebool -P httpd_enable_homedirs on # -P: 永久生效写入策略5.3 常见问题场景与速查表问题现象可能原因排查步骤临时解决永久解决推荐Web服务器Nginx/Apache无法访问自定义目录下的文件文件/目录的SELinux上下文不正确1.setenforce 0测试。2.ls -Z查看目录上下文。3.sealert分析日志。sudo chcon -R -t httpd_sys_content_t /path/to/dirsudo semanage fcontext -a -t httpd_sys_content_t /path/to/dir(/.*)?sudo restorecon -Rv /path/to/dir服务如MySQL无法写入数据目录进程类型无权访问目标目录类型1.setenforce 0测试。2.ps -Z看进程类型ls -Z看目录类型。3. 检查相关布尔值。同上使用mysqld_db_t等对应类型同上使用对应类型或调整布尔值mysql_connect_any无法从非标准端口启动服务如HTTP在8080端口端口未标记为允许该服务使用semanage port -lgrep http_port_t 查看允许的端口列表setenforce 0FTP服务无法上传文件布尔值限制或上下文问题getsebool -agrep ftpsetenforce 06. 高级技巧与避坑指南经过多年的实战我总结了一些不常被提及但能极大提升效率的技巧和必须避开的“坑”。6.1 利用audit2why和audit2allow进行深度分析当sealert给出的建议不够具体或者你想自己定制策略时这两个工具是利器。audit2why解释为什么访问会被拒绝。它读取audit.log告诉你触发了哪条策略规则。sudo grep AVC.*denied /var/log/audit/audit.log | tail -1 | audit2whyaudit2allow根据拒绝日志生成允许该访问的本地策略模块。这是一个高级功能慎用因为它可能降低安全性。# 1. 收集最近的拒绝日志 sudo grep AVC.*denied /var/log/audit/audit.log my_denials.log # 2. 生成一个策略模块.te文件 sudo audit2allow -i my_denials.log -M mypolicy # 这会生成 mypolicy.te 和 mypolicy.pp # 3. 安装这个自定义模块 sudo semodule -i mypolicy.pp警告使用audit2allow前务必仔细阅读生成的.te文件确保你理解并信任它要放行的规则。盲目添加策略模块会引入安全风险。6.2 容器Docker/Podman与SELinux的恩怨容器环境是SELinux问题的重灾区。默认情况下Docker容器进程运行在container_t域对主机文件系统的访问受到严格限制。问题使用-v挂载主机目录到容器后容器内应用无法读写。错误做法在宿主机上粗暴地chcon -Rt container_file_t整个目录。这会破坏宿主机的安全上下文体系。正确做法添加:z或:Z挂载选项最推荐# :z 表示共享内容会重新标记为 container_file_t docker run -v /host/dir:/container/dir:z ... # :Z 表示私有内容会重新标记为 container_file_t且仅本容器可用 docker run -v /host/dir:/container/dir:Z ...这两个选项会让Docker在挂载时自动应用合适的安全上下文。如果必须使用自定义上下文可以在宿主机上为特定目录设置svirt_sandbox_file_t类型适用于大多数容器。sudo semanage fcontext -a -t svirt_sandbox_file_t /host/dir(/.*)? sudo restorecon -Rv /host/dir6.3 编译与SELinux策略开发中的“neverallow”错误如果你正在从事系统底层开发或定制Linux发行版可能会在编译SELinux策略时遇到令人头疼的neverallow编译错误。这通常是因为你编写的策略规则试图允许一个在全局策略中明确被neverallow语句禁止的访问。排查思路仔细阅读错误信息编译器会明确指出是哪条neverallow规则被违反了。审查你的策略规则检查你的.te文件中是否定义了过于宽泛的权限比如允许一个域访问所有类型*。使用sepolicy工具分析# 查找与某个类型相关的 neverallow 规则 sepolicy neverallow -t my_domain_t解决方案通常是细化你的策略使用更具体的类型或者调整你的软件架构避免触发这些底层安全约束。这需要你对SELinux策略语言有一定了解。6.4 必须避免的致命操作不要在生产环境随意setenforce 0这会让系统在切换回Enforcing前失去SELinux保护。调试应在维护窗口或使用permissive模式收集日志。不要盲目执行chcon -Rt svirt_sandbox_file_t /之类的命令错误地递归修改根目录或系统关键目录的上下文可能导致系统完全无法启动。操作前一定要确认路径。谨慎使用audit2allow自动生成策略自动生成的策略可能过于宽松。务必人工审核生成的.te文件遵循最小权限原则。从disabled切换回enforcing前务必预留重标记时间在大容量文件系统的服务器上首次重标记可能耗时数小时。务必在业务低峰期或维护窗口操作并监控进度可通过/etc/selinux/.relabel文件是否存在来判断是否完成。

相关新闻

FitGirl游戏启动器:构建现代化游戏管理平台的完整解决方案

FitGirl游戏启动器:构建现代化游戏管理平台的完整解决方案

FitGirl游戏启动器:构建现代化游戏管理平台的完整解决方案 【免费下载链接】Fitgirl-Repack-Launcher An Electron launcher designed specifically for FitGirl Repacks, utilizing pure vanilla JavaScript, HTML, and CSS for optimal performance and customiza…

2026/10/12 3:54:20 阅读更多 →
Connected Papers与Semantic Scholar:科研文献调研高效工具组合实战指南

Connected Papers与Semantic Scholar:科研文献调研高效工具组合实战指南

1. 引言:当文献海洋淹没你时,你需要一张“藏宝图”不知道你有没有过这样的经历:导师丢给你一个研究方向,或者你自己对一个新领域产生了兴趣,打开学术搜索引擎,输入关键词,瞬间弹出成千上万篇论文…

2026/10/10 13:34:03 阅读更多 →
彻底解决SLF4J多重绑定警告:从原理到实战排查指南

彻底解决SLF4J多重绑定警告:从原理到实战排查指南

1. 项目概述:当你的日志系统开始“内讧”如果你在启动一个Java应用,特别是基于Spring Boot的项目时,在控制台看到了SLF4J: Class path contains multiple SLF4J bindings.这条警告,别慌,你绝对不是一个人。这几乎是每个…

2026/10/11 0:59:12 阅读更多 →

最新新闻

Docker 一键启动服务合集:Redis、MySQL、Kafka、MinIO、Prometheus 等(网盘转存防失效)

Docker 一键启动服务合集:Redis、MySQL、Kafka、MinIO、Prometheus 等(网盘转存防失效)

0. 网盘链接速览(请先转存)⚠️ 重要提示:网盘链接可能随时失效,请先点击下方链接转存到自己网盘,再下载,防止链接失效后无法获取。服务网盘链接提取码redis-dockerhttps://pan.baidu.com/s/1nP2CNyaxdRRKB…

2026/10/12 3:54:21 阅读更多 →
Vim编辑器从入门到精通:模式、快捷键、配置、插件

Vim编辑器从入门到精通:模式、快捷键、配置、插件

SSH 到一台服务器上改配置,手头没有 VS Code,能用的编辑器基本就 Nano 和 Vim。Nano 上手快,但改大型项目源码时效率差 Vim 一大截。这一篇把 Vim 的模式、常用快捷键、基础配置和插件入门讲清楚,目标是看完就能独立改文件&#x…

2026/10/12 3:54:21 阅读更多 →
【C++ 基于微服务的即时通讯系统】基建三件套:gflags + gtest + spdlog 源码编译安装与实战入门

【C++ 基于微服务的即时通讯系统】基建三件套:gflags + gtest + spdlog 源码编译安装与实战入门

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C知识分享》 《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 前言: 做 C 高性能后端开发这么多年…

2026/10/12 3:54:21 阅读更多 →
C语言预处理机制详解:宏定义、条件编译与头文件包含避坑指南

C语言预处理机制详解:宏定义、条件编译与头文件包含避坑指南

1. 预处理在编译流程中的位置很多刚开始学C语言的人,会把注意力全放在语法、指针、结构体这些“看得见”的部分上,但真正到了项目里,第一个让你摔跟头的往往不是语法,而是预处理指令。它不参与具体的逻辑计算,却在编译…

2026/10/12 3:54:21 阅读更多 →
AI工程师不加班成长指南:把工作变训练场的高效学习法

AI工程师不加班成长指南:把工作变训练场的高效学习法

晚上十一点,我刚把一个数据管线的 bug 处理完,打开收藏夹里积压了两个月的论文列表,脑子已经完全转不动了。这种情景在过去两年里反复出现:白天被会议、需求评审、调试代码塞满,晚上想学点新东西却连打开文档的力气都没…

2026/10/12 3:54:21 阅读更多 →
Z-Gly-Gly-Arg-ΒNA;17278-97-6

Z-Gly-Gly-Arg-ΒNA;17278-97-6

基本性质中文名称:苄氧羰基 - 甘氨酰 - 甘氨酰 - 精氨酸 -β- 萘胺,蛋白酶体胰蛋白酶样活性荧光底物CAS 号:17278-97-6单字母序列:Z-G-G-R-βNA三字母序列:Z-Gly-Gly-Arg-βNA分子式:C₂₈H₃₃N₇O₅分子量…

2026/10/12 3:53:20 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →