WSL2启用systemd服务管理:原理、方案对比与实战避坑指南
1. 为什么WSL2原生不支持systemctl从架构差异说起如果你在WSL2的Ubuntu里敲下sudo systemctl start nginx大概率会看到一个经典的错误提示“System has not been booted with systemd as init system (PID 1). Can‘t operate.” 这个报错让很多从物理机或虚拟机Linux环境迁移过来的开发者感到困惑和挫败。为什么一个看起来如此完整的Linux发行版却连最基本的服务管理命令都用不了这背后是WSL2与完整Linux系统在启动和初始化进程上的根本性差异。简单来说WSL2不是一个完整的、独立的虚拟机。它是一个由Windows内核直接支持的、高度优化的Linux兼容性子系统。当你启动一个WSL2发行版时Windows的wsl.exe或wslg.exe进程会启动一个轻量级的“虚拟机”实际是Hyper-V的一个轻量级实用虚拟机但这个虚拟机的初始化进程PID 1并不是我们熟知的systemd或sysvinit而是一个由微软专门为WSL设计的、极其精简的初始化进程通常被称为init。这个init进程的唯一核心职责就是启动一个shell比如bash并管理这个shell的生命周期。它不负责挂载文件系统、不管理硬件、不处理用户登录会话更不用说去管理像nginx、docker、mysql这样的后台守护进程daemon了。而systemctl命令是systemd系统和服务管理器的控制工具。systemd要正常工作一个绝对必要的前提就是它自己必须是系统的第一个进程PID 1。因为只有作为PID 1它才能拥有对整个系统进程树的完全控制权才能正确地派生、监控和管理所有的子进程也就是我们的各种服务。在WSL2的架构下PID 1的位置已经被微软的init占据了systemd自然就无法以完整模式运行。这就像一家公司已经有了一个CEO微软的init你再空降一个CEOsystemd进来两个CEO的指令系统必然冲突公司就无法正常运转。所以WSL2默认不支持systemctl不是一个“功能缺失”的bug而是一个基于其设计目标和性能权衡的必然结果。WSL2的首要目标是提供一个轻量级、快速启动、能与Windows文件系统高度互通的Linux开发环境而不是一个全功能的、可以替代虚拟机的服务器系统。去掉systemd这个庞然大物极大地减少了资源开销和启动时间。但这也带来了实际的开发痛点很多现代Linux软件如Docker CE新版、某些数据库、监控Agent都依赖systemd来管理服务很多部署脚本和教程也默认使用systemctl命令。这就让我们陷入了两难既想享受WSL2的便捷又离不开systemd生态。2. 主流解决方案深度对比从“曲线救国”到“原生支持”面对这个痛点社区和微软自身都给出了多种解决方案。这些方案各有优劣适用场景也不同。理解它们的原理和限制能帮你做出最合适的选择。2.1 方案一使用SysV init脚本或service命令最轻量这是最传统、对WSL2改动最小的方式。许多服务除了提供systemd的.service单元文件还保留了旧的SysV init脚本通常位于/etc/init.d/目录下。你可以直接调用这些脚本。# 启动服务 sudo /etc/init.d/nginx start # 或者使用service命令它是对init.d脚本的封装 sudo service nginx start优点无需任何额外安装和配置零开销最稳定。适合管理那些明确提供了SysV脚本的旧式服务。缺点功能有限缺乏systemd强大的依赖管理、日志集成journalctl、资源控制等功能。越来越多的新软件只提供systemd单元文件此方法失效。适用场景管理像nginx、apache2、mysql旧版等传统服务或者临时测试。2.2 方案二使用第三方替代品折中方案既然systemd太重一些开发者就寻找更轻量级的替代品来管理守护进程。最著名的就是supervisor和runit。Supervisor一个用Python编写的进程控制系统。它本身是一个客户端/服务器模型可以方便地启动、停止、监控进程还提供了一个Web管理界面。sudo apt install supervisor # 配置你的服务/etc/supervisor/conf.d/myapp.conf # 然后就可以用supervisorctl管理了 sudo supervisorctl start myapp优点配置简单功能强大有Web UI适合管理自定义应用进程。缺点它本身也是一个需要管理的服务在WSL2里启动它又成了问题且不兼容systemctl命令语法你需要为每个服务重写配置。Runit一个非常轻量、快速的init替代品遵循“做一件事并做好”的Unix哲学。优点极其轻量速度极快。缺点配置方式与systemd差异较大学习成本高社区资源和工具链远不如systemd丰富。方案评价这类工具解决了“进程守护”的问题但无法解决“生态兼容性”问题。你仍然无法直接运行那些依赖systemd特定环境变量或特性的脚本和软件。2.3 方案三启用WSL2的Systemd支持官方实验性功能这是目前最受关注、也最接近“原生支持”的方案。从WSL2的某个版本开始微软官方提供了启用systemd的实验性支持。其原理是在WSL2启动序列的早期通过一个特殊的钩子将systemd作为PID 1启动替代掉微软原有的init。启用方法 在Windows用户的%USERPROFILE%目录下通常是C:\Users\你的用户名\创建或编辑.wslconfig文件加入以下内容[boot] systemdtrue然后关闭所有WSL窗口在PowerShell或CMD中执行wsl --shutdown彻底关闭WSL再重新启动你的发行版。优点真正的systemd启用后systemctl、journalctl、hostnamectl等命令全部可用。最好的兼容性几乎所有依赖systemd的软件、脚本和教程都能无缝运行。官方支持由微软WSL团队直接维护未来稳定性可期。缺点与巨坑实验性功能意味着可能存在未知的bug且行为可能在未来的WSL更新中改变。启动速度变慢systemd的引入会显著增加WSL发行版的启动时间因为它要执行完整的系统初始化流程。资源占用增加systemd及其管理的服务会占用更多的内存和CPU。最关键的坑与Docker Desktop的冲突。这是网络上大量报错如job for docker.service failed...的根源。Docker Desktop在WSL2集成模式下会向WSL2内部注入自己的dockerd进程和相关环境。当WSL2内部运行了另一个systemd而systemd又试图去启动和管理docker.service时就会发生冲突导致Docker服务启动失败。错误信息通常指向权限问题或进程冲突。2.4 方案四使用第三方脚本如genie或subsystemd在微软官方支持systemd之前社区项目如genie或subsystemd就已经在尝试解决这个问题。它们的原理可以理解为在WSL2内部创建一个“容器”或“命名空间”在这个隔离的环境里启动一个完整的systemd实例作为“子PID 1”。以genie为例安装后你需要进入一个“systemd瓶”bottle# 进入systemd环境 genie -s # 此时在这个新shell中systemctl就可以用了优点在官方方案不成熟时提供了一个可用的workaround。缺点配置复杂需要额外的守护进程环境隔离有时会导致文件路径或网络访问的困惑并且项目活跃度已下降。在微软推出官方支持后这类方案已不再推荐。核心建议对于大多数开发者方案一service命令和方案三官方systemd支持是主流选择。如果你只需要管理少数几个服务且它们支持SysV脚本用方案一最省心。如果你需要完整的Linux服务生态例如要运行Kubernetes的kubelet、完整的数据库集群、或严格遵循systemd的部署脚本那么应该尝试方案三并准备好处理可能出现的兼容性问题尤其是与Docker的冲突。3. 实战在WSL2中启用并使用官方Systemd支持假设你已经决定启用官方的systemd支持下面是一个从配置到验证再到解决常见问题的完整流程。3.1 环境准备与配置启用首先确保你的WSL2是最新版本。在PowerShell中运行wsl --update然后确认你的WSL版本是2wsl -l -v输出中对应你的发行版VERSION列应该是2。接下来启用systemd。打开你的用户目录在文件资源管理器地址栏输入%USERPROFILE%回车查看是否存在.wslconfig文件。如果没有就新建一个文本文档命名为.wslconfig注意开头有个点。用记事本或VS Code打开输入以下配置# .wslconfig 文件 [boot] systemdtrue # 可选限制WSL2的资源使用避免systemd占用过多 [memory] memory4GB # 根据你的电脑配置调整建议至少4GB [processors] processors2 # 分配的核心数保存文件。关键步骤来了你必须完全关闭WSL2让配置生效。关闭所有Ubuntu终端窗口然后在PowerShell中执行wsl --shutdown这个命令会终止所有正在运行的WSL2发行版和底层虚拟机。等待几秒钟后重新打开你的Ubuntu发行版。3.2 验证Systemd是否成功运行进入Ubuntu后运行以下命令验证# 检查systemd是否为PID 1 ps -p 1 -o comm # 如果输出是 systemd则成功。如果是 init则失败。 # 检查systemctl是否可以正常工作 systemctl list-units --typeservice --staterunning # 应该能看到一长串正在运行的系统服务如dbus.service, systemd-journald.service等。 # 使用hostnamectl命令systemd套件之一 hostnamectl如果ps命令显示PID 1是systemd那么恭喜你配置成功了。你会立刻感觉到Shell的启动变慢了一两秒这是systemd初始化的正常开销。3.3 安装并管理一个典型服务Nginx现在你可以像在普通Linux服务器上一样安装和管理服务了。以Nginx为例# 1. 更新包列表并安装nginx sudo apt update sudo apt install nginx -y # 2. 安装后nginx服务并不会自动启动。使用systemctl启动它 sudo systemctl start nginx # 3. 设置开机自启注意WSL2的“开机”指该发行版启动时 sudo systemctl enable nginx # 4. 检查服务状态 sudo systemctl status nginx # 你应该看到状态为 active (running)并显示进程ID。 # 5. 测试访问。首先获取WSL2的IP地址通常是172.x.x.x hostname -I # 在Windows浏览器中访问 http://WSL2的IP地址应该能看到Nginx欢迎页。这个过程与在Ubuntu服务器上完全一致。你可以用同样的方式管理mysql、postgresql、redis等服务。4. 避坑指南解决启用Systemd后的典型问题启用systemd后你可能会遇到一些特有的问题。这里集中梳理并提供解决方案。4.1 Docker服务冲突问题这是最高频的问题。错误信息通常为Job for docker.service failed because the control process exited with error code. See systemctl status docker.service and journalctl -xe for details.问题根源Docker Desktop和WSL2内部的systemd都试图管理docker服务dockerd进程造成冲突。解决方案禁止WSL2内部的systemd管理Docker服务让Docker Desktop全权负责。首先确保Docker Desktop设置中已经启用了WSL2集成。在WSL2的Ubuntu中执行以下命令# 停止并禁用docker服务如果已经存在 sudo systemctl stop docker.service docker.socket sudo systemctl disable docker.service docker.socket # 屏蔽docker相关的systemd单元文件防止被意外启动 sudo systemctl mask docker.service docker.socketsystemctl mask命令比disable更彻底它会创建指向/dev/null的符号链接使得服务根本无法被启动。重启WSL2 (wsl --shutdown再重启)。之后Docker命令将由Docker Desktop注入的dockerd提供服务与systemd无关。你可以正常使用docker ps等命令。4.2 文件操作权限问题错误示例cp: cannot create regular file /etc/systemd/system/my.service: Operation not permitted或Failed to enable unit: File /etc/systemd/system/my.service: Permission denied。问题根源WSL2对/etc/systemd/system/等系统目录的权限管理可能与纯Linux环境有细微差别有时在systemd刚启用时文件系统挂载属性或SELinux/AppArmor如果启用可能导致问题。解决方案确保使用sudo操作/etc/systemd/system/目录下的文件必须使用sudo。检查文件所有权和权限# 确保你要复制的.service文件有正确的权限 sudo cp my.service /etc/systemd/system/ sudo chmod 644 /etc/systemd/system/my.service如果问题依旧尝试在Windows端以管理员身份重启WSL2在PowerShell(管理员)中执行wsl --shutdown然后重启。4.3 服务自动停止问题有用户反馈“systemd放启动脚本一会就服务关闭”。这通常不是WSL2特有的问题但在WSL2环境下更容易被注意到。可能原因及排查服务配置问题服务本身配置错误启动后立即退出。使用sudo journalctl -u your-service-name -f实时跟踪该服务的日志查看退出原因。Type配置不当在.service文件中Type字段设置不正确。对于简单的前台进程应该设为simple或forking。如果进程会自己daemonize后台化要设为forking。WSL2会话结束如果你关闭了所有WSL2的终端窗口并且没有其他进程在运行WSL2虚拟机可能会被Windows自动终止取决于wsl.conf中的[boot]设置。这会导致所有进程结束。如果你需要服务在关闭终端后依然运行需要确保至少有一个后台进程如tmux或screen会话在运行或者修改WSL2的终止行为但这比较复杂不推荐。4.4 网络与systemd-resolved冲突启用systemd后systemd-resolved服务会接管DNS解析。有时这可能会与WSL2默认的网络配置冲突导致ping外网出现network is unreachable或DNS解析失败。解决方案检查DNS配置cat /etc/resolv.conf。如果指向的是127.0.0.53说明systemd-resolved在工作。如果网络有问题可以尝试禁用systemd-resolved改回WSL2默认的DNS管理sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved # 手动设置resolv.confWSL2会自动生成但我们可以固定它 sudo rm /etc/resolv.conf echo nameserver 8.8.8.8 | sudo tee /etc/resolv.conf # 为了防止WSL2自动覆盖需要编辑 /etc/wsl.conf sudo nano /etc/wsl.conf # 加入以下内容 # [network] # generateResolvConf false然后重启WSL2。5. 进阶技巧与最佳实践当你解决了基本问题后下面这些技巧能让你的WSL2systemd环境更高效、更稳定。5.1 优化WSL2配置以平衡性能与功能.wslconfig文件是你的调优中心。除了启用systemd合理配置资源可以避免WSL2拖慢宿主机。# 推荐配置示例根据你的机器配置调整 [wsl2] # 限制内存使用防止WSL2占用过多导致Windows卡顿 memory6GB # 分配CPU核心通常分配一半物理核心数比较合理 processors4 # 启用本地主机转发方便从Windows访问WSL2中的服务 localhostForwardingtrue # 设置交换文件大小虚拟内存 swap2GB # 设置交换文件位置避免放在C盘 swapFileD:\\wsl-swap.vhdx [boot] systemdtrue # 可以在这里指定systemd启动时要运行的命令例如设置环境变量 # command export MY_ENVvalue5.2 管理自定义Systemd服务单元学会编写自己的.service文件是玩转systemd的关键。假设你有一个Python应用app.py需要守护。创建服务单元文件sudo nano /etc/systemd/system/myapp.service写入以下内容[Unit] DescriptionMy Python Application Afternetwork.target # 指定在网络就绪后启动 [Service] Typesimple # 应用在前台运行 Useryour_username # 以哪个用户身份运行避免用root WorkingDirectory/path/to/your/app ExecStart/usr/bin/python3 /path/to/your/app/app.py Restarton-failure # 失败时自动重启 RestartSec5s # 重启前等待5秒 [Install] WantedBymulti-user.target # 多用户模式下启用让systemd重新加载配置并启用服务sudo systemctl daemon-reload sudo systemctl start myapp sudo systemctl enable myapp5.3 利用Journalctl进行高效的日志排查systemd最大的优势之一就是集中化的日志管理journalctl。在WSL2里它同样强大。# 查看某个服务的所有日志 sudo journalctl -u nginx # 查看实时滚动的日志类似tail -f sudo journalctl -u nginx -f # 查看指定时间段的日志 sudo journalctl --since 2023-10-01 09:00:00 --until 2023-10-01 12:00:00 # 查看内核相关日志在WSL2里也适用 sudo journalctl -k # 以JSON格式输出便于用jq等工具解析 sudo journalctl -u docker --outputjson-pretty5.4 处理WSL2实例的“关机”与“开机”WSL2没有真正的“关机”概念。当你关闭所有终端它默认会在一段时间后终止。但启用systemd后你可能希望服务状态能持久化。“关机”在Ubuntu内部你可以sudo poweroff但这实际上会终止整个WSL2虚拟机。更常用的方式是在Windows端用wsl --shutdown。“开机”与自启WSL2发行版的启动不会触发Windows的“开机自启”。如果你希望某个WSL2发行版在Windows启动后自动运行并启动里面的服务需要借助Windows任务计划程序创建一个触发事件为“计算机启动时”的任务执行wsl -d Ubuntu -u root systemctl start your-service。但这比较复杂且破坏了WSL2的轻量特性。对于开发环境更推荐在需要时手动启动WSL2然后让systemd自动拉起服务通过systemctl enable。我个人在长期使用WSL2配合systemd进行开发后最大的体会是明确边界。WSL2终究是一个开发环境不是生产服务器。启用systemd是为了获得更好的软件兼容性和开发体验而不是为了搭建一个24小时运行的服务集群。因此我的最佳实践是仅在需要完整Linux服务栈的项目中启用.wslconfig中的systemdtrue并做好与Docker Desktop冲突的预案。对于日常简单的开发任务我宁愿使用更轻量、启动更快的默认WSL2模式。这种按需切换的思路能让我在享受便利的同时不被环境本身的复杂性所困扰。

相关新闻

Java POI设置Excel单元格格式:从基础原理到实战优化

Java POI设置Excel单元格格式:从基础原理到实战优化

1. 从“能跑”到“好看”:为什么单元格格式是POI进阶的必修课 如果你用Java的Apache POI库处理过Excel,大概率是从 HSSFWorkbook 或 XSSFWorkbook 开始,然后 createRow 、 createCell 、 setCellValue ,最后 write 输…

2026/10/17 5:36:59 阅读更多 →
Scratch 3.0 实战:手把手教你复刻《植物大战僵尸》核心交互界面

Scratch 3.0 实战:手把手教你复刻《植物大战僵尸》核心交互界面

你好,我是专注于技术实战分享的博主。很多编程初学者和Scratch爱好者都曾尝试复刻经典游戏,但往往在交互界面和游戏逻辑的衔接上遇到瓶颈,导致项目半途而废。本文将手把手带你使用Scratch 3.0,从零开始完整复刻《植物大战僵尸》的…

2026/10/17 5:37:02 阅读更多 →
MCM/ICM竞赛LaTeX模板全解析:从环境搭建到高效协作指南

MCM/ICM竞赛LaTeX模板全解析:从环境搭建到高效协作指南

1. 项目缘起:为什么MCM/ICM竞赛需要一个专属的LaTeX模板?如果你参加过或者正在准备参加美国大学生数学建模竞赛(MCM)或交叉学科建模竞赛(ICM),你肯定对提交论文的格式要求印象深刻。这不仅仅是把…

2026/10/17 5:37:04 阅读更多 →

最新新闻

算法习题答案背后的机制:递归、复杂度与工程避坑

算法习题答案背后的机制:递归、复杂度与工程避坑

简介:《数据结构与算法分析(Java语言描述)》第三版教材的配套习题答案文档,适合正在系统学习数据结构和算法、需要用习题检验自身理解的Java学习者与备考学生。文档覆盖文件处理与递归调用、递归算法设计(如求整数二进…

2026/10/17 21:39:43 阅读更多 →
MySQL学生成绩管理系统数据库设计与建表实战指南

MySQL学生成绩管理系统数据库设计与建表实战指南

简介:一套完整的基于Python Flask与MySQL数据库的学生成绩管理系统课程设计报告,适用于计算机科学与技术、软件工程等专业的学生,也适合自学Web开发并需要完成数据库课程设计任务的人。系统围绕学生成绩管理核心业务展开,覆盖在线…

2026/10/17 21:39:43 阅读更多 →
语音识别中的CTC与RNN-T:端到端对齐与工程选型详解

语音识别中的CTC与RNN-T:端到端对齐与工程选型详解

如果你正好在啃语音识别的经典教材或者课程,大概率会在前几章就碰到 CTC 和 RNN-T 这两个名字。我当年第一次看到这两个缩写,脑子里全是问号:CTC 不是通讯技术么,RNN-T 和 RNN 又差在哪?后来在几个语音项目里真正把这两…

2026/10/17 21:39:43 阅读更多 →
144页Transformer讲义精读指南:从注意力机制到工程实践

144页Transformer讲义精读指南:从注意力机制到工程实践

简介:这份144页PPT配套视频课程,面向希望系统掌握Transformer架构的NLP学习者、算法工程师与高校师生,从序列建模的经典方法讲起,逐步深入到注意力机制、大语言模型与高效Transformer等前沿内容。包内共1个PDF文件,约5…

2026/10/17 21:39:43 阅读更多 →
Kafka接入AI的三种路线:MCP提案、会话记忆与实时上下文

Kafka接入AI的三种路线:MCP提案、会话记忆与实时上下文

1. 从一条业务问题说起:Kafka 和 AI 之间到底缺了什么我大概从 2016 年开始重度使用 Kafka,最开始是帮一家电商公司搭日志管道,后来陆续做过金融风控事件流、IoT 设备数据上报、实时数仓同步,再到近两年开始给大模型应用做数据底座…

2026/10/17 21:39:43 阅读更多 →
Python Flask+MySQL学生成绩管理系统:数据库设计与触发器实践

Python Flask+MySQL学生成绩管理系统:数据库设计与触发器实践

简介:围绕 MySQL 学生成绩管理系统展开的数据库课程设计文档,完整覆盖系统总体设计、需求分析、概要设计、系统实现与测试总结全流程,适合计算机专业学生用于数据库课设、毕业设计或 FlaskMySQL 入门实践。文档以华东交通大学课程设计报告为原…

2026/10/17 21:38:42 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →