WSL2安装到D盘:释放C盘空间,打造可迁移的Linux开发环境
1. 项目概述为什么要在D盘安装WSL2如果你是一名在Windows上搞开发的程序员或者是一个需要Linux环境的数据分析师那么WSL2Windows Subsystem for Linux 2绝对是你绕不开的神器。它让你能在Windows里无缝运行一个完整的Linux内核告别了传统虚拟机那种笨重和资源隔离的体验。但官方默认的安装路径是C盘这对于很多C盘空间本就捉襟见肘的用户来说无疑是个头疼的问题。看着C盘那根红条每次安装新东西都心惊胆战。所以把WSL2安装到D盘、E盘或者其他非系统盘就成了一个非常实际且迫切的需求。这不仅仅是节省C盘空间那么简单它更关乎系统盘的性能、数据管理的便利性以及未来系统重装时你的开发环境能否得以保全。想象一下系统崩溃了你重装了Windows但D盘里那个完整的Ubuntu环境连同你配置好的所有开发工具和项目都完好无损这种感觉有多踏实。本文将手把手带你完成在Windows 10或Windows 11系统下将WSL2及其Linux发行版以Ubuntu为例安装到D盘的完整过程。我会详细拆解每一步的原理、可能遇到的坑并分享我多年使用WSL2积累下来的调优心得。无论你是刚接触WSL的新手还是想迁移已有环境的老用户都能在这里找到清晰、可操作的方案。2. 核心思路与前置准备理解WSL2的安装逻辑在动手之前我们必须先搞清楚WSL2的安装到底包含了哪几个部分以及我们究竟能把什么移到D盘。很多人一上来就找安装路径结果发现根本找不到设置选项原因就是没理解其架构。WSL2的安装主要分为两个核心组件WSL2平台功能与Linux内核这是由Windows系统提供的底层支持包括虚拟化平台、Linux内核镜像等。这部分是系统级的我们无法改变其安装位置它通常位于C:\Windows\System32\lxss等系统目录。Linux发行版实例这才是我们通常说的“安装Ubuntu”。它是一个独立的、可分发、可导出的“容器”或“虚拟机”镜像文件。我们的核心操作目标就是把这个发行版实例的虚拟硬盘文件通常是.vhdx格式创建或迁移到D盘。因此我们的核心思路是先确保系统启用了WSL2所需的全部功能然后通过特定的命令或技巧在初始化或迁移Linux发行版时将其根文件系统指向D盘的某个位置。2.1 环境检查与功能启用首先我们需要确保你的Windows版本支持WSL2。Windows 10需要版本 1903 或更高版本内部版本 18362 或更高。最好是2004内部版本19041及以上以获得最完整的支持。Windows 11原生支持无需担心版本问题。你可以按Win R输入winver来查看你的具体版本和内部版本号。接下来以管理员身份打开PowerShell或Windows Terminal。这是整个操作的核心工具所有关键命令都在这里执行。第一步启用“适用于Linux的Windows子系统”和“虚拟机平台”这两个可选功能。# 启用WSL功能 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 启用虚拟机平台功能这是WSL2的依赖 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完这两个命令后强烈建议立即重启电脑。很多后续步骤的失败都是因为没重启导致的功能未完全生效。重启后再次以管理员身份打开PowerShell将WSL的默认版本设置为2。wsl --set-default-version 2如果这是你第一次安装WSL系统可能会提示你下载“Linux内核更新包”。请根据提示前往微软官方页面下载并安装。这是一个很小的MSI安装包安装后再次执行上面的命令即可。2.2 发行版的选择与下载策略WSL支持多种Linux发行版如Ubuntu、Debian、Kali等。我们以最流行的Ubuntu为例。通常大家会直接从Microsoft Store微软商店安装。但商店安装的发行版其安装位置难以直接自定义它通常会被放在C:\Users\你的用户名\AppData\Local\Packages下的某个复杂目录里。因此为了实现安装到D盘的目标我们有两种主流策略离线安装包法直接下载发行版的.appx或.msixbundle离线安装包然后解压并手动指定安装路径。先安装后迁移法先通过商店或命令行正常安装到C盘然后再将其完整导出、删除、再导入到D盘。我个人更推荐方法二因为它更通用、更清晰并且能让你透彻理解WSL发行版作为一个“可迁移的容器”这一本质。方法一虽然直接但有时会遇到签名或依赖问题。接下来我将以方法二为主线详细展开。3. 实操步骤从安装到迁移至D盘3.1 步骤一初始安装Ubuntu到默认位置首先我们通过Windows命令行快速安装一个Ubuntu实例。打开PowerShell管理员或非管理员均可此处仅为安装输入wsl --install -d Ubuntu这个命令是Windows 10 2004及更高版本和Windows 11的快捷命令它会自动执行启用必要功能、设置WSL2为默认版本、下载并安装最新的Ubuntu LTS发行版。安装过程中会提示你创建Linux系统的用户名和密码。这个用户名和密码独立于你的Windows账户请务必记住。安装完成后你可以在开始菜单找到Ubuntu点击即可启动一个终端窗口。首次启动会完成最后的初始化。至此一个默认安装在C盘的Ubuntu就已经准备好了。3.2 步骤二定位与导出WSL发行版现在我们需要把这个“新鲜出炉”的Ubuntu实例打包出来。首先确定一下这个发行版的准确名称。在PowerShell中运行wsl -l -v你会看到一个类似下面的输出NAME STATE VERSION * Ubuntu Running 2这里的NAME就是发行版标识通常是Ubuntu。如果你的系统里有多个发行版这里会全部列出。接下来我们将这个发行版导出为一个压缩的tar文件。这个文件包含了整个Linux根文件系统的所有内容。# 语法wsl --export 发行版名称 导出的文件路径 wsl --export Ubuntu D:\wsl_backup\ubuntu_base.tar这条命令做了几件事它会让指定的WSL发行版Ubuntu停止运行如果正在运行然后将其整个文件系统打包并压缩保存到D:\wsl_backup\ubuntu_base.tar。你可以把D:\wsl_backup换成任何你D盘上喜欢的目录。重要提示导出操作可能需要几分钟时间长短取决于你的Ubuntu系统里已经安装了多少软件和文件。导出的tar文件大小通常小于实际虚拟硬盘占用因为压缩去除了空白空间。3.3 步骤三注销旧实例并准备新家导出完成后原来的Ubuntu实例就没用了我们可以注销卸载它以释放C盘空间。# 语法wsl --unregister 发行版名称 wsl --unregister Ubuntu执行这个命令会立即删除该发行版对应的虚拟硬盘文件默认在C盘和所有相关配置。这个操作不可逆请确保你已经成功导出了备份。现在在D盘为你新的WSL系统创建一个永久的家。我建议建立一个清晰的目录结构便于管理。D:\ ├── wsl\ │ ├── images\ # 存放导入的虚拟硬盘文件 │ ├── instances\ # 可以存放多个不同发行版或配置的实例 │ └── backup\ # 存放导出的tar备份我们将在D:\wsl\instances下为新的Ubuntu实例创建一个专属文件夹比如D:\wsl\instances\Ubuntu_D。3.4 步骤四导入并指定新的安装位置这是最关键的一步我们将导出的tar文件导入为一个全新的WSL发行版并直接指定其虚拟硬盘文件存放在D盘。# 语法wsl --import 自定义发行版名称 安装路径 tar文件路径 [选项] wsl --import Ubuntu_D D:\wsl\instances\Ubuntu_D D:\wsl_backup\ubuntu_base.tar --version 2让我们拆解这个命令Ubuntu_D这是你给新实例起的名字可以和原来一样叫Ubuntu但为了避免混淆我加了后缀_D。D:\wsl\instances\Ubuntu_D这是安装目录。WSL会在这里创建必要的配置文件最重要的是它会在这里生成一个名为ext4.vhdx的虚拟硬盘文件你的整个Linux系统就装在这个文件里。D:\wsl_backup\ubuntu_base.tar这就是我们上一步导出的备份文件路径。--version 2明确指定使用WSL2。虽然默认可能就是2但显式声明更稳妥。执行成功后你可以再次运行wsl -l -v查看会发现多了一个名为Ubuntu_D、状态为Stopped的发行版。3.5 步骤五配置默认用户与启动通过--import方式导入的发行版默认会以root用户身份启动。这不太安全也不方便。我们需要将其配置为使用我们最初创建的那个普通用户。首先启动这个新实例并以root身份进入wsl -d Ubuntu_D你现在应该处于Linux的命令行并且提示符是root...。我们需要修改WSL的配置文件指定默认登录用户。这个配置文件位于/etc/wsl.conf。如果文件不存在就创建它。# 使用nano或vim编辑器 nano /etc/wsl.conf在文件中输入以下内容[user] default你的用户名将“你的用户名”替换成你在步骤3.1中首次安装Ubuntu时创建的那个用户名比如kaka。然后保存并退出编辑器在nano中是CtrlX然后按Y确认再按回车。接下来退出这个WSL实例。exit回到PowerShell我们需要完全关闭并重启WSL服务让配置生效。因为WSL实例在后台可能处于某种休眠状态。# 关闭所有正在运行的WSL实例 wsl --shutdown等待几秒钟然后再次启动你的新发行版wsl -d Ubuntu_D这一次你应该会直接以你设定的普通用户身份登录了大功告成。你可以通过ls -la ~看看你的家目录文件是否都在验证迁移是否完整。4. 进阶配置与性能调优成功迁移到D盘只是第一步。要让这个WSL2环境用起来顺手尤其是获得接近原生Linux的性能还需要一些关键的配置。4.1 内存与CPU资源限制默认情况下WSL2会动态分配内存和CPU但有时它会占用过多主机资源。我们可以通过.wslconfig文件进行全局限制。在Windows用户目录C:\Users\你的用户名\下创建一个名为.wslconfig的文件注意前面有个点用记事本编辑加入以下内容[wsl2] # 限制最大内存使用为4GB根据你的主机内存调整如16G内存可设为8GB memory4GB # 限制使用一半的CPU核心数 processors4 # 将虚拟硬盘文件设置为“收缩”模式有助于减少不用的空间占用 autoMemoryReclaimgradual # 更激进的内存回收适合内存紧张的主机 dropIdleProcessestrue # 指定交换文件存放位置可选如果你也想把交换文件移出C盘 # swapfileD:\\wsl\\wsl-swap.vhdx # 交换文件大小默认为内存的25% swap1GB保存后在PowerShell中执行wsl --shutdown关闭WSL再重新启动配置即可生效。这个文件对所有WSL2发行版生效。4.2 优化磁盘性能与跨文件系统访问WSL2的虚拟硬盘VHDX性能在D盘上通常没问题。但需要注意的是从Windows访问WSL2内的Linux文件\\wsl$\以及从Linux访问Windows磁盘/mnt/c/,/mnt/d/其性能是有差异的。Linux访问Windows文件/mnt/d/这是通过9P网络文件系统协议实现的性能较差尤其是大量小文件读写。强烈建议将你的开发项目、代码仓库等直接放在WSL2的Linux原生文件系统内即~/projects。你可以通过VS Code的“Remote - WSL”扩展获得完美体验代码编辑在Windows编译运行在Linux文件无需跨系统。Windows访问Linux文件\\wsl$\Ubuntu_D\home\user性能尚可适合偶尔查看或复制文件但不建议在此路径下直接进行开发或运行构建工具。4.3 设置默认发行版与便捷启动如果你有多个WSL发行版可以将我们安装在D盘的Ubuntu_D设置为默认启动项。wsl --set-default Ubuntu_D这样以后在命令行直接输入wsl或bash就会启动这个实例。为了方便你还可以为这个特定的发行版在Windows Terminal中创建一个新的配置文件标签页一键启动。5. 常见问题与故障排查实录在实际操作中你可能会遇到一些“坑”。这里记录了我遇到过的一些典型问题及其解决方案。5.1 导入失败错误 0x80070057 或 0x80370102问题描述在执行wsl --import时提示参数错误或虚拟化未启用。排查思路检查路径和文件名确保--import命令中的路径没有中文或特殊字符最好使用纯英文路径。目标安装路径如D:\wsl\instances\Ubuntu_D的文件夹需要提前创建好。确认虚拟化已开启在任务管理器的“性能”标签页查看“虚拟化”是否已启用。如果未启用需要进入电脑BIOS/UEFI设置中开启Intel VT-x或AMD-V技术。确保WSL2内核已安装运行wsl --status查看“默认版本”和“内核版本”。如果内核版本缺失去微软官网下载并安装“WSL2 Linux内核更新包”。5.2 启动后仍是root用户配置不生效问题描述按照步骤修改了/etc/wsl.conf但重启后登录用户还是root。解决方案确保/etc/wsl.conf文件内容正确特别是用户名拼写无误。最关键的一步修改完wsl.conf后必须在Windows PowerShell中执行wsl --shutdown来彻底终止WSL后台进程然后再启动。简单的exit再重新打开终端是不够的因为WSL实例可能处于“休眠”状态并未重新读取配置。可以尝试在PowerShell中强制设置用户ubuntu_D config --default-user 你的用户名注意不是所有发行版都支持这个命令Ubuntu通常支持。5.3 磁盘空间占用异常增大问题描述D盘上的.vhdx文件越来越大即使删除了Linux里的文件.vhdx文件也不缩小。原因与解决WSL2的虚拟硬盘是稀疏文件但默认不会自动压缩。删除文件只是在内部标记空闲不会释放主机磁盘空间。手动压缩首先在Linux内部用sudo dd if/dev/zero of/zero.fill bs1M; sudo rm /zero.fill命令用零填充空闲空间。然后退出Linux在PowerShell中运行wsl --shutdown。最后以管理员身份打开PowerShell运行磁盘优化命令optimize-vhd -Path D:\wsl\instances\Ubuntu_D\ext4.vhdx -Mode Full使用.wslconfig自动回收如前文所述在.wslconfig中配置autoMemoryReclaimgradual和dropIdleProcessestrue可以在WSL2停止时更积极地回收内存和磁盘资源。5.4 网络代理或DNS问题问题描述在WSL2内无法apt update或访问某些网站但Windows主机可以。排查思路WSL2使用虚拟网络其IP与主机不同。如果主机使用了网络代理需要在WSL2内单独设置。找出主机IP在WSL2内运行cat /etc/resolv.conf其中的nameserver地址就是主机的虚拟IP通常是172.x.x.1。设置代理如果主机有代理在WSL2的~/.bashrc或~/.zshrc中添加export http_proxyhttp://主机IP:代理端口 export https_proxyhttp://主机IP:代理端口DNS解析失败有时/etc/resolv.conf会被覆盖。可以创建或编辑/etc/wsl.conf加入以下内容阻止其被覆盖[network] generateResolvConf false然后手动编辑/etc/resolv.conf将nameserver设置为8.8.8.8或114.114.114.114。6. 迁移已有WSL系统到D盘如果你已经有一个在C盘用了很久、配置非常完善的WSL系统不想重新配置那么完整的迁移流程如下列出当前发行版wsl -l -v记下名称如Ubuntu-20.04。导出备份wsl --export Ubuntu-20.04 D:\wsl_backup\my_ubuntu_full.tar注销旧系统wsl --unregister Ubuntu-20.04。务必确认备份成功后再操作导入到新位置wsl --import Ubuntu-20.04 D:\wsl\instances\MyUbuntu D:\wsl_backup\my_ubuntu_full.tar --version 2设置默认用户按照前面章节的方法修改新实例的/etc/wsl.conf然后执行wsl --shutdown重启生效。这个流程能100%保留你原有的所有文件、配置、已安装的软件和环境变量真正做到无缝迁移。经过以上步骤你不仅成功地将WSL2安装到了D盘还拥有了一个经过优化、易于管理的Linux开发环境。这套方法的核心在于理解WSL发行版的“可导出/导入”特性它给了我们自由部署的灵活性。以后再遇到C盘告急或者想为不同项目创建多个独立的WSL环境时你都可以游刃有余。

相关新闻

潮玩二级市场运行机制解析:从盲盒算法到价格发现的技术视角

潮玩二级市场运行机制解析:从盲盒算法到价格发现的技术视角

潮玩二级市场:是黄牛投机,还是玩家生态?—— 一个技术视角的深度剖析最近在关注消费领域的数据分析时,一个现象引起了我的注意:以泡泡玛特为代表的潮玩品牌,其限量款盲盒在二手交易平台上的价格波动&#x…

2026/10/12 7:11:17 阅读更多 →
Unity3D游戏集成CTC语音唤醒:从原理到工程实践

Unity3D游戏集成CTC语音唤醒:从原理到工程实践

1. 项目概述:当游戏能“听懂”你的呼唤“小云小云,释放大招!”——想象一下,在激战正酣的ARPG游戏中,你无需分心寻找复杂的技能快捷键,只需一声令下,角色便能瞬间响应。这并非科幻,而…

2026/10/12 7:10:36 阅读更多 →
软件工程决策:快速修复与系统设计,如何平衡技术债与代码质量

软件工程决策:快速修复与系统设计,如何平衡技术债与代码质量

1. 这篇文章真正要解决的问题 “直接点还是走程序?”——这可能是每个开发者在面对技术选型、问题排查,甚至是团队协作时,内心最真实的挣扎。直接点,意味着绕过繁琐的流程和复杂的框架,用最朴素、最直接的方式快速解决…

2026/10/5 14:56:00 阅读更多 →

最新新闻

Selenium Manager连接被重置?从网络排查到离线驱动配置全解

Selenium Manager连接被重置?从网络排查到离线驱动配置全解

1. 先搞清楚:Selenium Manager 报“远程主机强迫关闭了一个现有的连接”到底卡在哪一步自动化跑到一半,控制台突然甩出这么一行红色日志:selenium_manager | error trying to connect: 远程主机强迫关闭了一个现有的连接第一次遇到的人大概率…

2026/10/12 7:11:11 阅读更多 →
12天3城3展:工业品牌如何通过高密度参展实现区域渗透

12天3城3展:工业品牌如何通过高密度参展实现区域渗透

1. 一场高密度行程背后的参展逻辑12天,3座城市,3场展会。从天津到杭州,再到上海工博会。这个行程密度放在任何一家制造型企业身上,都算得上是一次高强度的"拉练"。拉孚(Larfe)这个名字&#xff0…

2026/10/12 7:11:10 阅读更多 →
AI Coding Agent实战指南:从自动补全到智能编程助手

AI Coding Agent实战指南:从自动补全到智能编程助手

我最早接触AI Coding,还是那种“按一下Tab补全一行”的老工具,说实话那时候充其量算个输入法。这几年再看,情况已经完全不一样了:主流的编程助手都配了“Agent模式”,你给它一句任务,它能自己翻项目文件、动…

2026/10/12 7:11:10 阅读更多 →
死区示例代码详解:从JS TDZ到摇杆、PID防抖的全场景实践

死区示例代码详解:从JS TDZ到摇杆、PID防抖的全场景实践

干软件这些年,我越来越觉得“死区”是两个被严重低估的字。调试摇杆的时候要处理死区,写定时控制逻辑的时候要处理死区,甚至在解答 JavaScript 报错的时候,也逃不开它。第一次听到“死区”的人会以为这又是某种玄学概念&#xff0…

2026/10/12 7:11:10 阅读更多 →
冷热电三联供Simulink仿真:从能量流建模到控制策略与调试

冷热电三联供Simulink仿真:从能量流建模到控制策略与调试

接到“综合能源系统仿真:冷热电三联供Simulink仿真”这个需求的时候,我第一反应不是找现成demo,而是先想明白一件事:这套仿真模型到底要回答什么问题。是用作教学演示,还是要做容量配置的可行性分析?是研究…

2026/10/12 7:11:10 阅读更多 →
AnyPS5项目解析:PS5手柄跨平台兼容性技术探析

AnyPS5项目解析:PS5手柄跨平台兼容性技术探析

我无法基于当前输入生成符合要求的博文。原因如下:输入中仅提供了项目标题"AnyPS5",但未提供任何实质性的【项目正文】、【关键词】或【摘要描述】;所附“相关热搜词”与“最新网络热词”字段为空,无可用语义线索&#…

2026/10/12 7:10:10 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器: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 阅读更多 →