Ubuntu安装NVIDIA驱动:从PPA到CUDA的完整避坑指南
1. 项目概述为什么在Ubuntu上装NVIDIA驱动是个“技术活”如果你刚接触Linux尤其是Ubuntu第一次尝试安装NVIDIA驱动大概率会经历一个从信心满满到怀疑人生的过程。这不像在Windows上下载一个.exe文件一路“下一步”就能搞定。在Ubuntu的世界里你可能会遇到黑屏、循环登录、图形界面消失或者那个令人头疼的“NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver”错误。我经历过太多次了从Ubuntu 18.04一路踩坑到现在的24.04 LTS几乎每个大版本更新驱动安装都会有一些新的“惊喜”。简单来说这个“项目”的核心就是要在Ubuntu这个开源操作系统上成功安装并正确配置专有的NVIDIA显卡驱动让你的显卡无论是用于游戏、深度学习训练、还是视频渲染能发挥出全部性能。它解决的不仅仅是“让屏幕亮起来”的问题更是关乎计算性能、软件兼容性比如CUDA和系统稳定性的基石。这个过程涉及到开源驱动与闭源驱动的冲突、系统内核模块的编译、以及图形服务器通常是X11或Wayland的配置任何一个环节出错都可能让你进不了桌面环境。这篇文章适合所有需要在Ubuntu上使用NVIDIA显卡的朋友无论是刚入门的新手还是被某个新版本坑了的老鸟。我会把近十年在不同机器、不同显卡、不同Ubuntu版本上积累的经验和教训掰开揉碎了讲清楚。我们的目标很明确一次成功避免踩坑并且让你明白每一步背后的“为什么”。毕竟知其然更要知其所以然下次出了问题你才知道该往哪儿找。2. 核心思路与方案选型三条路哪条适合你在Ubuntu上安装NVIDIA驱动主流有三种方法。选对方法成功就了一半。每种方法背后都有不同的设计逻辑和适用场景不能一概而论。2.1 官方PPA仓库平衡稳定与时效的首选这是我最推荐给大多数用户的方法尤其是桌面用户。Ubuntu自带的“软件和更新”附加驱动列表其源就是graphics-driversPPA。但直接添加PPA可以获得更及时、更全的驱动版本。为什么选它PPAPersonal Package Archive是Ubuntu社区维护的非官方软件仓库。graphics-drivers这个PPA由CanonicalUbuntu母公司和NVIDIA共同维护它提供的驱动包是经过一定适配和测试的.deb格式能与Ubuntu的包管理系统apt完美集成。这意味着驱动安装、更新、卸载都可以通过熟悉的apt命令完成系统会帮你处理依赖关系和内核模块的编译DKMS。对于追求稳定且需要较新驱动的用户这是最省心的方案。需要注意什么PPA的驱动版本更新会紧跟NVIDIA官方但并非“最新即最好”。特别是对于生产服务器盲目追求最新驱动可能引入未知的稳定性问题。通常选择比当前系统内核版本稍晚一些的、经过社区一段时间验证的驱动版本更为稳妥。2.2 直接使用NVIDIA官方.run文件极致控制与兼容性这就是从NVIDIA官网直接下载的那个后缀为.run的文件。这是最“原始”也最“强大”的方法。为什么选它版本最全最新官网总是最先发布新驱动包括Beta版。完全控制安装过程中可以交互式选择是否安装OpenGL库、32位兼容库、DKMS支持等定制性极强。解决复杂依赖当你的系统环境非常特殊比如自定义内核、旧版本系统PPA或仓库的包可能无法满足依赖时.run文件往往是最后的救命稻草。它的巨大风险是什么.run文件安装器会直接编译内核模块并修改系统的图形配置。这个过程与Ubuntu默认的图形服务器由ubuntu-desktop包提供极易产生冲突。最大的风险是安装完成后系统无法启动到图形界面只能看到一个黑屏或闪烁的光标。这是因为安装器可能覆盖或错误配置了X11或Wayland的配置文件。因此除非你明确知道自己在做什么或者前两种方法都失败了否则不建议新手首选此方案。2.3 使用Ubuntu默认仓库极致的稳定极致的“旧”通过apt install nvidia-driver-XXX不添加PPA安装的驱动来源于Ubuntu官方主仓库。为什么不选它它的唯一优势是极度稳定因为这些驱动版本会与Ubuntu LTS版本的生命周期深度绑定经过最严格的测试。但缺点同样致命版本极其老旧。例如在Ubuntu 22.04 LTS发布后很长一段时间主仓库可能还停留在一年多前的驱动版本。对于需要CUDA新特性进行深度学习或需要修复新版游戏性能问题的用户来说这个版本几乎不可用。结论对于桌面用户和绝大多数开发者方法一PPA是黄金选择。它在新旧、稳定、易用性之间取得了最佳平衡。下文也将主要围绕这种方法展开。3. 安装前关键准备扫清道路上的所有地雷很多安装失败的问题其实在第一步就埋下了祸根。花10分钟做好准备工作能节省你后面数小时的排错时间。3.1 彻底卸载旧驱动或开源驱动这是一个必须执行的步骤无论你之前是否装过。残留的配置或冲突的模块是万恶之源。# 这是一个组合拳请依次执行 sudo apt purge *nvidia* *cuda* *cudnn* # 清除所有NVIDIA和CUDA相关包 sudo apt autoremove # 自动移除不再需要的依赖包 sudo apt autoclean # 清理已下载的旧软件包 # 如果之前用过.run文件安装还需要运行其卸载程序如果存在的话 # 假设卸载程序在当前位置通常命名带‘-uninstall’ sudo ./NVIDIA-Linux-x86_64-xxx.xx.run --uninstall注意purge和remove的区别在于purge会同时删除软件包及其配置文件而remove只删除软件包。这里必须用purge来确保配置文件的清理。3.2 禁用系统自带的Nouveau开源驱动Nouveau是Linux内核自带的NVIDIA显卡开源驱动。在安装闭源驱动前必须禁用它否则两者会产生内核冲突。创建禁用配置文件sudo nano /etc/modprobe.d/blacklist-nouveau.conf在文件中写入以下内容blacklist nouveau options nouveau modeset0blacklist命令阻止内核加载nouveau模块modeset0是双重保险。更新内核initramfs这一步至关重要它让禁用生效于系统启动的早期阶段。sudo update-initramfs -u立即重启sudo reboot。如何验证是否禁用成功重启后在终端执行lsmod | grep nouveau。如果没有任何输出说明禁用成功。如果还有输出请检查上述步骤尤其是update-initramfs命令是否执行。3.3 进入纯命令行模式运行级别3这是避免图形界面干扰安装过程的关键一步能极大提高安装成功率。有两种常用方法方法A在GRUB引导时临时进入重启电脑在GRUB菜单出现时如果没看到开机时按住Shift键。选择“Ubuntu”那一行按e键进入编辑模式。找到以linux开头的一行在行尾quiet splash后面先加一个空格然后输入3。按CtrlX或F10启动。系统将进入纯文本登录界面。方法B在已登录的图形界面中切换按CtrlAltF3F1到F6通常对应不同的tty终端。这会切换到另一个纯命令行终端你需要用用户名和密码登录。此时你的图形界面在tty2或tty1仍然在运行但安装操作在这个纯命令行终端进行同样安全。我通常推荐方法B因为它更简单且如果安装后需要调试图形配置你还可以切回原来的图形终端按CtrlAltF2或F1试试。4. 实操安装通过PPA安装NVIDIA驱动假设我们已经做好了所有准备工作并且现在处于一个纯净的命令行终端中。4.1 添加Graphics Drivers PPA并安装# 1. 添加PPA仓库 sudo add-apt-repository ppa:graphics-drivers/ppa -y # 输入用户密码后-y参数表示自动确认 # 2. 更新本地软件包列表获取PPA中的驱动信息 sudo apt update # 3. 查看可用的驱动版本 ubuntu-drivers devices执行ubuntu-drivers devices后你会看到类似下面的输出vendor : NVIDIA Corporation model : GA106 [GeForce RTX 3060 Lite Hash Rate] driver : nvidia-driver-535-server - distro non-free driver : nvidia-driver-535 - distro non-free recommended driver : nvidia-driver-545 - third-party non-free driver : nvidia-driver-470 - third-party non-free driver : nvidia-driver-550 - third-party non-free driver : nvidia-driver-470-server - distro non-free driver : nvidia-driver-545-server - third-party non-free这里会列出所有可用的驱动版本并标记出当前系统推荐的版本recommended。通常安装推荐版本即可。# 4. 安装推荐驱动以535版本为例 sudo apt install nvidia-driver-535apt会自动处理所有依赖包括nvidia-dkms-535负责内核模块动态编译、nvidia-utils-535等。安装过程可能会比较长因为它需要编译当前内核对应的模块。4.2 安装完成后的必须操作驱动安装完成后不要急着重启。先做两件事初始化NVIDIA内核模块sudo modprobe nvidia这条命令会尝试加载刚安装的nvidia内核模块。如果执行后没有报错通常意味着模块编译加载成功。验证驱动通信nvidia-smi这是最激动人心的时刻。如果安装成功你会看到一个表格显示你的GPU型号、驱动版本、CUDA版本如果有、GPU温度、显存和使用情况等信息。看到这个基本就成功了99%。4.3 重启并进入图形界面现在可以安全重启了sudo reboot。 系统重启后应该能正常进入图形登录界面。登录后你可以再次打开终端运行nvidia-smi确认驱动正常工作。额外检查在“软件和更新” - “附加驱动”选项卡里你现在应该能看到你安装的驱动被选中了。5. 进阶配置与问题深度排查即使安装成功为了最佳体验可能还需要一些额外配置。而安装失败时更需要知道如何排查。5.1 解决“NVIDIA-SMI has failed”错误这是最高频的错误意思是NVIDIA系统管理接口无法与驱动通信。根本原因是nvidia内核模块没有正确加载。按以下顺序排查检查模块是否加载lsmod | grep nvidia如果无输出说明模块未加载。执行sudo modprobe nvidia试试。如果报错进入下一步。查看模块加载时的详细错误sudo dmesg | grep -i nvidia关注输出中红色的Error或Failed信息。常见原因有Nouveau未禁用dmesg里可能会有nouveau相关的冲突信息。回头检查3.2节确保已彻底禁用并更新了initramfs。内核头文件缺失DKMS编译模块需要当前运行内核对应的头文件。安装它们sudo apt install linux-headers-$(uname -r)然后重新配置DKMS并重启sudo dpkg-reconfigure nvidia-dkms-535 # 替换为你的版本号 sudo rebootSecure Boot启用某些主板UEFI安全启动会阻止未签名的内核模块加载。要么在BIOS中关闭Secure Boot要么为NVIDIA模块签名较复杂。临时方案是进入BIOS关闭它。5.2 在Wayland与X11之间选择Ubuntu从22.04开始默认使用Wayland作为图形会话。Wayland是现代显示协议但在NVIDIA驱动支持上历史上一直不如X11完善。如何检查当前会话执行echo $XDG_SESSION_TYPE。如果你遇到桌面卡顿、屏幕撕裂、或者某些应用如屏幕共享异常可以尝试切换到X11。切换到X11在登录界面点击用户名下方的齿轮图标选择“Ubuntu on Xorg”然后输入密码登录。个人心得对于NVIDIA用户特别是使用多显示器或遇到合成器问题的X11目前通常更稳定、兼容性更好。Wayland是未来但现阶段如果你追求稳定工作环境X11仍是更安全的选择。5.3 安装CUDA Toolkit如果你做深度学习或GPU计算光有驱动还不够需要安装CUDA Toolkit。这里有一个关键顺序先装驱动再装CUDA。通过PPA安装的驱动通常已包含一个较旧的基础CUDA运行时库nvidia-smi中显示的CUDA Version。但完整的开发环境需要单独安装。推荐方法使用NVIDIA官方提供的apt仓库安装CUDA Toolkit这样便于管理。在NVIDIA官网找到对应你Ubuntu版本和架构的CUDA Toolkit网络安装指南。通常是一系列命令包括添加NVIDIA CUDA仓库、安装cuda-toolkit元包。安装后需要将CUDA路径加入环境变量通常安装指南会说明。重要提示尽量不要用.run文件安装CUDA因为它可能会捆绑安装一个旧版本的驱动覆盖你辛苦装好的新驱动导致系统混乱。始终使用apt仓库来分离驱动和CUDA Toolkit的安装。6. 不同应用场景下的驱动选择与优化安装驱动不是终点根据你的用途调整配置才能物尽其用。6.1 游戏玩家Steam/Proton驱动版本选择最新的稳定版非“server”后缀如545、550。新驱动对最新游戏优化更好。关键组件确保安装了32位兼容库通过PPA安装的驱动通常已包含。性能工具可以安装mangohud或gamemode来监控帧率和优化系统资源。配置工具安装nvidia-settings来调整各向异性过滤、垂直同步等图形设置。sudo apt install nvidia-settings6.2 深度学习开发者PyTorch/TensorFlow驱动版本稳定性优先。选择一个与你的CUDA Toolkit版本要求匹配的、经过社区验证的驱动版本如535。不必盲目追新。CUDA版本这是关键首先确定你需要的PyTorch或TensorFlow版本支持哪个CUDA版本然后根据CUDA版本的要求去选择对应的驱动版本。NVIDIA官网有CUDA Toolkit的版本要求文档。持久化模式对于服务器设置GPU为持久化模式避免GPU在空闲时重置影响容器或长时间任务。sudo nvidia-smi -pm 16.3 多显卡比如挖矿或并行计算用户驱动统一确保所有显卡使用同一型号的驱动。PCIe总线问题如果显卡无法被识别检查BIOS中的Above 4G Decoding和Resizable BAR设置是否开启如果主板支持。禁用集成显卡如果主板有集成显卡并在BIOS中设置为主要显示输出确保你的显示器接在独立显卡上否则NVIDIA驱动可能不会正常初始化所有独显。7. 版本升级与回滚指南系统更新或主动升级驱动时也可能出问题。7.1 安全升级驱动查看可用升级sudo apt update后apt list --upgradable。单独升级驱动如果想只升级驱动可以sudo apt install nvidia-driver-550假设550是新版本。apt会自动处理旧版本的移除和新版本的安装。重启驱动升级后必须重启。7.2 驱动损坏或升级失败后的回滚如果新驱动导致问题回滚到旧版本是救急良方。进入恢复模式或命令行重启在GRUB菜单选择“Advanced options for Ubuntu”然后选择一个带(recovery mode)的内核启动。进入root shell在恢复模式菜单中选择root。重新安装旧版本驱动# 首先确保网络可用恢复模式下可能默认禁用 sudo dhclient -v # 清除可能损坏的配置 sudo apt purge nvidia-driver-550 # 卸载新版本 # 安装旧版本 sudo apt install nvidia-driver-535 # 更新initramfs sudo update-initramfs -u # 重启 reboot7.3 应对内核升级后的驱动问题Ubuntu会自动更新内核。新内核启动时DKMS会自动为NVIDIA驱动重新编译内核模块。但偶尔会失败。症状系统更新重启后无法进入图形界面。解决方案在GRUB中选择上一个能正常工作的旧内核启动。进入系统后检查新内核的头文件是否已安装并手动触发DKMS编译sudo apt install linux-headers-$(uname -r) # 安装当前新内核的头文件 sudo dpkg-reconfigure nvidia-dkms-535 # 重新配置DKMS sudo update-initramfs -u -k all # 为所有内核更新initramfs sudo reboot重启后在GRUB中再尝试选择新内核启动。折腾Ubuntu下的NVIDIA驱动确实需要一些耐心和解决问题的思路。但一旦配置妥当它就能提供极其稳定和强大的图形与计算性能。我的经验是做好快照如果使用虚拟机或记好笔记记录每个成功步骤遇到问题按部就班地排查模块、日志和配置大部分问题都能在网上找到线索或在这里找到答案。最后保持系统更新但对于驱动升级除非有新功能或安全需求否则不必频繁更新“稳定压倒一切”在Linux桌面环境里很多时候是真理。

相关新闻

3步完成专业级视频背景替换:OBS背景移除插件完全指南

3步完成专业级视频背景替换:OBS背景移除插件完全指南

3步完成专业级视频背景替换:OBS背景移除插件完全指南 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https://g…

2026/10/13 16:18:57 阅读更多 →
技术布道实战:如何让传统开发团队接受DevOps与云原生新理念

技术布道实战:如何让传统开发团队接受DevOps与云原生新理念

最近在参与一个社区项目时,我遇到了一个有趣的挑战:如何将一套现代化的产品理念,在一个相对传统、技术栈保守的社区中落地并产生积极影响。这让我联想到一个经典的场景——如何让一个像阿米什社区这样重视传统、自给自足的群体,接…

2026/9/25 12:15:13 阅读更多 →
爬虫转大模型:Demo 跑通不敢上线,权限与日志才是第一道坎

爬虫转大模型:Demo 跑通不敢上线,权限与日志才是第一道坎

聊《爬虫转大模型实战,第一道门槛可能不是算法》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要很多人问我,做了好多年爬虫和自动化采集,现在大模型这么火,转行是…

2026/10/13 11:18:18 阅读更多 →

最新新闻

LiteLLM实践:统一大模型接入、路由降级与预算控制的网关方案

LiteLLM实践:统一大模型接入、路由降级与预算控制的网关方案

1. 先从“换模型像搬家”说起:为什么我围着一层网关转前阵子接了一个内部AI小项目,需求本身不复杂:让业务方用一个接口同时能用上几款不同的大模型,还要能自动容灾、记录花费。一开始想着很简单,各家模型商不都提供了P…

2026/10/14 8:16:52 阅读更多 →
VirtualLab虚拟仿真在菲涅尔波带法教学中的应用

VirtualLab虚拟仿真在菲涅尔波带法教学中的应用

1. 项目背景与核心价值菲涅尔波带法作为物理光学教学中的重要内容,长期以来面临着理论抽象、实验条件受限的教学困境。传统课堂中,学生往往难以直观理解半波带分割原理及其衍射效应,而实体光学实验又受限于设备精度、环境干扰等因素。Virtual…

2026/10/14 8:16:52 阅读更多 →
Agent Skills 技能包实战:SKILL.md 编写与智能体集成指南

Agent Skills 技能包实战:SKILL.md 编写与智能体集成指南

Agent Skills 最近在智能体开发圈子里讨论度非常高。你要是做过一段时间的 Agent 应用,应该已经察觉到:单纯靠一堆工具函数去扩展模型能力,越来越不够用了。函数定义写得再细,模型也未必会在正确的时机调用正确的函数;…

2026/10/14 8:16:52 阅读更多 →
导盲犬与白手杖双目标检测数据集:VOC/YOLO双格式校验与小目标优化指南

导盲犬与白手杖双目标检测数据集:VOC/YOLO双格式校验与小目标优化指南

简介:本资源是面向计算机视觉初学者与智能辅助设备研发者的导盲犬及盲杖目标检测专用数据集,适用于YOLO、Faster R-CNN等两阶段/单阶段模型的训练与评估,助力无障碍AI应用落地。数据集共4635张高质量JPG图像,配套4635份Pascal VOC…

2026/10/14 8:16:52 阅读更多 →
AnyPS5解析:PS5协议逆向与跨平台能力迁移实战指南

AnyPS5解析:PS5协议逆向与跨平台能力迁移实战指南

项目标题“AnyPS5”目前在公开网络中无明确指向的、已落地的技术产品、开源项目、商业服务或主流社区共识定义。经多平台关键词检索(含技术论坛、应用商店、GitHub、知乎、B站及主流搜索引擎),未发现与该名称强关联的成熟软硬件系统、官方发布…

2026/10/14 8:16:52 阅读更多 →
Loop:macOS 窗口管理工具功能全解

Loop:macOS 窗口管理工具功能全解

Loop:macOS 窗口管理工具功能全解 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 屏幕里同时堆着编辑器、终端和浏览器,想把其中一个窗口拖进左半屏,还得对准缝隙&am…

2026/10/14 8:15:52 阅读更多 →

日新闻

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/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/14 7:53:34 阅读更多 →