WSL2中配置CUDA开发环境:原理、步骤与深度学习框架适配
1. 项目概述为什么要在WSL2里折腾CUDA如果你是一个在Windows上搞深度学习、科学计算或者GPU加速开发的大概率听过WSL2Windows Subsystem for Linux 2。它本质上是一个运行在Windows里的轻量级Linux虚拟机让你能无缝地在Windows桌面环境下使用Linux命令行工具和生态。但长久以来想在WSL2里直接调用宿主机也就是你的Windows的NVIDIA GPU来跑CUDA程序是个挺麻烦的事儿。要么得装双系统要么得搞个完整的Linux虚拟机配置复杂性能还有损耗。现在情况不一样了。从Windows 11和特定版本的Windows 10开始加上NVIDIA驱动和WSL2内核的支持我们终于可以在WSL2的Ubuntu等发行版里直接、高效地使用宿主机的NVIDIA GPU了。这相当于把Windows的图形界面和日常办公的便利性与Linux下纯净的开发环境和强大的GPU计算能力结合在了一起。你不用重启电脑切换系统文件互通也极其方便调试代码时开个Windows下的IDE比如VS Code远程连接到WSL2体验非常流畅。所以这个“在WSL2中安装CUDA”的项目核心目标就是搭建一个**“Windows前台办公WSL2后台猛算”**的混合开发环境。它特别适合那些主力机是Windows游戏本或工作站的开发者、学生和研究人员让你在享受Windows生态的同时无缝切入Linux下的AI模型训练、数据计算等重负载任务。2. 环境准备与核心概念澄清在动手之前我们必须把几个关键概念和依赖关系理清楚这能避免后面绝大部分的坑。2.1 理解WSL2、GPU驱动与CUDA Toolkit的关系很多人一开始会混淆以为在WSL2里要装一个完整的、独立的NVIDIA驱动。其实不然这里的架构比较特殊宿主Windows系统这里需要安装标准的、完整的NVIDIA显卡驱动程序。这个驱动是“一仆二主”它既负责Windows本身的图形显示和DirectX加速也包含了用于WSL2的GPU计算驱动组件。你可以从NVIDIA官网下载Game Ready或Studio驱动版本越新越好建议用GeForce Experience保持更新。WSL2 Linux子系统在WSL2里面我们不需要、也不应该安装任何NVIDIA显卡驱动。WSL2通过一个特殊的“翻译层”GPU-PV直接映射和调用宿主机Windows里已经安装好的GPU硬件及其驱动。在WSL2中我们只需要安装CUDA Toolkit。CUDA Toolkit这是NVIDIA提供的一套软件开发工具包包含了CUDA编译器nvcc、GPU加速库如cuBLAS、cuFFT、调试工具和CUDA运行时库cudart。我们在WSL2里安装它是为了获得编译和运行CUDA程序所需的头文件、库和工具。简单比喻Windows是房东它买了台高性能洗衣机GPU并通了水电装了驱动。WSL2是租客房东允许租客使用洗衣机。租客不需要自己再拉水管电线装驱动他只需要拿到洗衣机的使用说明书和专用洗衣液CUDA Toolkit就能在房东提供的接口上开动洗衣机了。2.2 检查你的系统是否满足条件不是所有电脑都能这么玩。请按顺序检查以下四点任何一环不满足都可能导致失败。第一步检查Windows版本这是硬性门槛。你需要Windows 11任何正式发行版基本都支持。Windows 10版本号必须为Build 19044或更高。你可以按Win R输入winver查看。注意网上常说的“版本2004Build 19041及以上”是理论支持的最低版本但在实际安装中较老的版本可能会遇到各种奇怪问题。强烈建议通过Windows更新将系统升级到最新。第二步启用WSL2并安装Linux发行版以管理员身份打开PowerShell或Windows终端运行wsl --install这个命令会默认启用所需的Windows功能适用于Linux的Windows子系统、虚拟机平台并安装Ubuntu发行版。如果已经安装过WSL1需要升级wsl --set-default-version 2。安装完成后从开始菜单启动Ubuntu完成初始的用户名和密码设置。在PowerShell中运行wsl -l -v确认你的发行版后面显示的版本是2。第三步检查宿主机NVIDIA驱动在Windows下按Win R输入dxdiag在“显示”标签页查看你的显卡型号和驱动版本。访问 NVIDIA驱动下载页面 根据你的显卡型号下载并安装最新的标准版驱动非DCH版通常兼容性更好但现代驱动多为DCH也基本没问题。确保安装时勾选了“GPU加速”或相关组件。安装后在WSL2的终端里输入以下命令这是最关键的一步检查nvidia-smi如果配置正确你会看到一个表格显示了WSL2内识别到的GPU型号、驱动版本以及CUDA版本。这里显示的“CUDA Version”是驱动内建支持的最高CUDA运行时版本它决定了你可以在WSL2里安装的CUDA Toolkit的最高版本。第四步更新WSL2内核重要但常被忽略微软和NVIDIA会通过Windows更新来推送新的WSL2内核以提升GPU兼容性和性能。确保你的WSL2内核是最新的。在PowerShell中运行wsl --update然后重启WSLwsl --shutdown再重新打开Ubuntu终端。3. 在WSL2中安装CUDA Toolkit当nvidia-smi命令能正确输出信息后恭喜你最难的关卡已经过了。接下来的安装和在纯Linux系统中几乎一样。3.1 选择正确的CUDA Toolkit版本这里有个非常重要的原则WSL2中安装的CUDA Toolkit版本不能高于nvidia-smi命令输出中显示的“CUDA Version”。例如nvidia-smi显示“CUDA Version: 12.4”那么你可以在WSL2里安装CUDA 12.4、12.3、12.2等但绝不能安装12.5或13.0。否则会因驱动不兼容导致无法使用。如何选择具体版本这取决于你的开发需求为学习或全新项目建议安装与驱动支持版本一致的最新版如上例中的12.4以获得最新的特性和性能优化。为运行特定框架如PyTorch, TensorFlow你需要去这些框架的官方文档查看他们明确支持的CUDA版本。例如PyTorch 2.3可能推荐CUDA 12.1或11.8。这时你应该安装框架推荐的版本而不是最新的。3.2 使用官方网络安装包推荐方法这是NVIDIA官方为WSL2定制的安装方式最省心。我们以安装CUDA 12.4为例。访问CUDA Toolkit下载页面去NVIDIA官网选择对应的操作系统Linux、架构x86_64、发行版WSL-Ubuntu、版本如2.0和安装类型推荐deb (network)。这会得到一个很小的网络安装包。在WSL2的Ubuntu终端中执行安装命令# 首先下载并安装CUDA仓库的GPG密钥和包列表 wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt-get update # 安装CUDA Toolkit这里以12.4为例请替换为你需要的版本号 sudo apt-get install cuda-toolkit-12-4使用网络安装包cuda-keyring的好处是后续可以通过sudo apt-get update sudo apt-get upgrade来更新CUDA Toolkit管理起来和系统其他软件一样方便。配置环境变量安装程序通常不会自动帮你配置。你需要将CUDA的二进制文件和库文件路径加入系统的环境变量。 编辑你的shell配置文件如果是bash通常是~/.bashrcnano ~/.bashrc在文件末尾添加以下行export PATH/usr/local/cuda-12.4/bin${PATH::${PATH}} export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64${LD_LIBRARY_PATH::${LD_LIBRARY_PATH}}注意这里的cuda-12.4要替换成你实际安装的版本路径。你可以用ls /usr/local/查看确切的文件夹名。 保存退出后执行source ~/.bashrc使配置立即生效。3.3 验证安装是否成功完成上述步骤后进行三重验证验证编译器nvccnvcc --version此命令应输出你刚刚安装的CUDA Toolkit版本如12.4。这个版本应该小于等于之前nvidia-smi显示的驱动CUDA版本。验证CUDA运行时nvidia-smi再次运行确认GPU信息正常显示没有报错。编译并运行一个简单的CUDA样例 CUDA Toolkit自带了很多例子。我们找一个最简单的来测试# 切换到例子目录路径可能因版本略有不同 cd /usr/local/cuda-12.4/extras/demo_suite/ # 编译 deviceQuery 程序 sudo make # 运行 ./deviceQuery如果一切正常你会看到一大段输出最后一行是Result PASS。这证明从驱动、运行时到编译器的整个CUDA栈在WSL2中都已正确就绪。4. 深度学习框架的适配与虚拟环境管理安装好CUDA Toolkit只是搭好了舞台演员深度学习框架还没上场。这里以最流行的PyTorch为例演示如何无缝衔接。4.1 为PyTorch创建Conda虚拟环境强烈建议使用Conda或Miniconda来管理Python环境和包依赖它能完美解决不同项目需要不同版本CUDA/PyTorch的冲突问题。安装Minicondawget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh按照提示安装安装完成后重启终端或执行source ~/.bashrc。创建并激活一个虚拟环境conda create -n pytorch_env python3.10 # 创建一个名为pytorch_envPython版本为3.10的环境 conda activate pytorch_env激活后命令行提示符前会出现(pytorch_env)表示你已进入该环境。4.2 安装与CUDA版本匹配的PyTorch千万不要直接用conda install pytorch或pip install torch这可能会安装CPU版本或不匹配的CUDA版本。前往 PyTorch官方网站 。在安装选择器中根据你的情况选择PyTorch Build: Stable (稳定版)Your OS: LinuxPackage: 推荐Conda管理依赖更干净Language: PythonCompute Platform: 这里必须选择与你安装的CUDA Toolkit版本对应的选项例如你装了CUDA 12.4就选CUDA 12.4。网站会生成一行安装命令例如conda install pytorch torchvision torchaudio pytorch-cuda12.4 -c pytorch -c nvidia在你的WSL2终端中确保已激活conda虚拟环境运行这行命令。安装完成后在Python交互环境中验证import torch print(torch.__version__) # 输出PyTorch版本 print(torch.cuda.is_available()) # 应输出 True print(torch.cuda.get_device_name(0)) # 应输出你的GPU型号如 NVIDIA GeForce RTX 4060 Ti如果这三步都成功那么你的WSL2 CUDA PyTorch深度学习环境就完全配置成功了。4.3 安装cuDNN通常已包含cuDNN是NVIDIA深度神经网络加速库。对于通过Conda安装的PyTorch其CUDA版本对应的cuDNN通常已经作为依赖被自动安装了你一般不需要单独处理。如果你需要单独安装例如为了编译某些需要特定cuDNN版本的项目可以去NVIDIA开发者网站下载对应CUDA版本的cuDNN按照说明解压并复制文件到CUDA目录即可。5. 高级配置、优化与故障排除环境搭起来只是开始用得好、用得稳才是关键。下面分享一些进阶技巧和常见问题的解决方法。5.1 性能优化与内存管理WSL2的GPU性能已经非常接近原生Linux但内存管理需要留意。GPU内存限制WSL2默认不会限制GPU内存使用。但在进行大型模型训练时如果Windows前台也在运行占用GPU的应用程序如游戏、视频渲染可能会产生竞争。可以使用nvidia-smi监控WSL2内的GPU内存使用情况。WSL2虚拟机内存限制WSL2本身是一个虚拟机它有内存上限。默认是主机总内存的50%或8GB取较大值。如果你的训练任务需要大量系统内存而不仅仅是GPU显存可能需要调整。 在Windows用户目录C:\Users\你的用户名\下创建或编辑文件.wslconfig内容如下[wsl2] memory16GB # 设置WSL2最大可用内存为16GB请根据你的主机内存调整 processors8 # 设置WSL2可用的CPU核心数 localhostForwardingtrue修改后在PowerShell中运行wsl --shutdown关闭WSL2再重新打开Ubuntu终端生效。5.2 常见问题与解决方案实录以下是我在多次配置中踩过的坑和解决方案问题1在WSL2中运行nvidia-smi提示NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver...排查思路这是最经典的错误说明WSL2无法连接到宿主机的NVIDIA驱动。解决步骤首要检查在Windows中打开任务管理器查看“性能”选项卡下的GPU是否被正确识别以及驱动是否正常。如果Windows下驱动就不正常先解决Windows的问题。重启WSL2在PowerShell中运行wsl --shutdown然后重新打开Ubuntu终端。更新Windows和驱动确保Windows系统、WSL2内核wsl --update和NVIDIA显卡驱动都是最新版本。特别是Windows的累积更新有时会包含关键的WSL2组件更新。检查Windows功能在“启用或关闭Windows功能”中确认“虚拟机平台”和“适用于Linux的Windows子系统”已勾选。勾选后需要重启电脑。问题2nvcc --version和nvidia-smi显示的CUDA版本不一致现象nvidia-smi显示 CUDA 12.4但nvcc --version显示 11.8 或 “command not found”。原因与解决这是正常且正确的nvidia-smi显示的是驱动支持的CUDA运行时最高版本。nvcc --version显示的是你实际安装的CUDA Toolkit编译器版本。只要Toolkit版本不高于驱动版本即可。如果nvcc未找到说明环境变量PATH没配置对请回头检查3.2节的环境变量配置。问题3PyTorch安装后torch.cuda.is_available()返回 False排查思路这说明PyTorch没有找到可用的CUDA环境。解决步骤确认你的conda虚拟环境已激活。在终端输入python -c import torch; print(torch.version.cuda)看看PyTorch编译时所依赖的CUDA版本是什么。如果输出是None说明你安装的是CPU版本的PyTorch。彻底卸载重装conda uninstall pytorch torchvision torchaudio然后严格按照4.2节的步骤从PyTorch官网获取与你WSL2内CUDA Toolkit版本完全一致的安装命令。最常见的原因就是安装命令选错了CUDA版本。检查WSL2内的CUDA环境本身是否正常用第3.3节的deviceQuery测试。问题4训练时遇到CUDA error: out of memory排查首先在WSL2内运行nvidia-smi查看是GPU显存被占满还是WSL2系统内存被占满。解决显存不足减小模型批量大小batch size使用梯度累积或者尝试模型并行、更高效的优化器。系统内存不足按照5.1节的方法增加.wslconfig中的memory限制。同时检查代码中是否有在CPU上创建过大张量的情况。问题5文件读写速度慢现象在WSL2中访问/mnt/c/Windows C盘下的文件进行大量数据读取时速度慢。原因WSL2通过9P网络文件协议访问Windows文件系统性能有损耗。最佳实践将你的项目和数据放在WSL2自己的Linux文件系统内即Ubuntu的~家目录下路径如/home/yourname/project。这样能获得接近原生Linux的磁盘IO性能。可以用cp或rsync命令将数据从/mnt/c/拷贝到Linux分区。5.3 日常维护建议定期更新时不时在PowerShell里跑一下wsl --update在Ubuntu里跑一下sudo apt update sudo apt upgrade升级系统包时要留意是否会影响CUDA并在Windows下保持NVIDIA驱动更新。环境隔离坚持为每个项目使用独立的Conda虚拟环境用environment.yml文件记录依赖便于复现和迁移。善用VS Code远程开发在Windows上安装VS Code再安装“Remote - WSL”扩展。之后你可以直接在VS Code里打开WSL2中的文件夹获得代码提示、调试、终端集成等完整功能体验远超在WSL2内使用vim或nano。配置WSL2下的CUDA环境第一次可能会遇到一些障碍但一旦打通你会发现它极大地提升了在Windows下进行Linux开发的幸福感。这个混合环境兼顾了便利与性能对于个人开发者和小型团队来说是一个非常高效的选择。

相关新闻

Android分区架构深度解析:从基础概念到刷机救砖实战

Android分区架构深度解析:从基础概念到刷机救砖实战

1. 从“砖头”到“开机”:理解Android分区的必要性 如果你曾经尝试过给安卓手机刷机、救砖,或者只是好奇为什么手机存储空间总比标称的少,那么“分区”这个概念你一定绕不开。对于大多数普通用户来说,手机就是一个黑盒&#xff0c…

2026/10/9 9:55:09 阅读更多 →
C语言字符串处理:10个核心函数原理与安全实践指南

C语言字符串处理:10个核心函数原理与安全实践指南

1. 从“Hello, World!”到字符串处理:为什么这10个函数是C语言的基石 如果你刚开始学C语言,可能觉得 printf("Hello, World!") 就是字符串的全部了。但当你真正开始写程序,比如要处理用户输入的名字、读取文件中的一行文本&#…

2026/10/2 8:41:39 阅读更多 →
如何快速上手Hermes WebUI:5分钟开启你的个人AI助手

如何快速上手Hermes WebUI:5分钟开启你的个人AI助手

如何快速上手Hermes WebUI:5分钟开启你的个人AI助手 【免费下载链接】hermes-webui Hermes WebUI: The best way to use Hermes Agent from the web or from your phone! 项目地址: https://gitcode.com/GitHub_Trending/he/hermes-webui 想要通过浏览器随时…

2026/9/24 10:12:31 阅读更多 →

最新新闻

A2A 1.0协议:给多Agent系统画出协作边界

A2A 1.0协议:给多Agent系统画出协作边界

Agent会互相调用,这件事放在今天已经算不上新闻。翻翻开源社区,AutoGen、CrewAI、LangGraph哪个都能让几个Agent你一言我一语地跑完一个任务。但如果你真把一套多Agent系统放进生产环境,大概率会遇到比“调不通”麻烦得多的问题:A…

2026/10/15 19:26:20 阅读更多 →
darwin-universal安装包全攻略:macOS跨架构下载配置与排坑

darwin-universal安装包全攻略:macOS跨架构下载配置与排坑

简介:这款 VSCode-darwin-universal-1.zip 是微软面向 macOS 发布的 Visual Studio Code 通用版安装包,同时兼容 Intel 与 Apple Silicon 芯片的 Mac 设备,省去了用户自行辨别架构版本、寻找可用镜像的麻烦,适合日常编码、脚本调试…

2026/10/15 19:26:20 阅读更多 →
UITableViewCell内嵌WKWebView高度自适应与复用优化实战

UITableViewCell内嵌WKWebView高度自适应与复用优化实战

做iOS开发的朋友应该都遇到过一个特别“拧巴”的需求:要在UITableViewCell里塞一个WKWebView。第一反应是挺简单的,直接加约束、setHTML字符串就完事了。但真跑起来,你会发现高度不对、滚动冲突、Cell复用后内容串台、列表滑动狂掉帧&#xf…

2026/10/15 19:26:20 阅读更多 →
弹幕互动直播实战:从弹幕监听到键鼠模拟的完整配置指南

弹幕互动直播实战:从弹幕监听到键鼠模拟的完整配置指南

简介:面向抖音、快手平台主播与直播运营者的弹幕互动直播整套方案,以植物大战僵尸为核心玩法,观众通过弹幕或礼物实时触发游戏内互动,增强直播参与感和停留时长,适合希望用休闲游戏引流、提升直播间热度、变现音浪的个…

2026/10/15 19:26:20 阅读更多 →
激光打标机Winform开发全解析:从架构到避坑实战

激光打标机Winform开发全解析:从架构到避坑实战

简介:这是一份基于C#的Winform激光打标机二次开发实例工程,面向需要对接金橙子控制卡、定制打标软件或研究打标流程的.NET开发者。工程以NET Framework 4.0为运行环境,源码内容包括完整解决方案与核心交互模块,其中底层动态库封装…

2026/10/15 19:26:20 阅读更多 →
图是一篇论文的门面,科迅捷AI帮你画到审稿人挑不出毛病

图是一篇论文的门面,科迅捷AI帮你画到审稿人挑不出毛病

博士论文里,图不只是插图,它是论证的一部分,是论文的门面。审稿人翻开论文,第一眼扫过的往往是图表。图做得好,读者对整篇论文的第一印象就好。这篇聊聊怎么把图画到挑不出毛病。 第一,图必须自洽。一张合…

2026/10/15 19:25:19 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →