从VMware到KVM:手把手教你制作纯净Windows 7 QCOW2镜像
1. 项目概述与核心价值最近在折腾一些私有云环境经常需要用到Windows 7的虚拟机镜像。虽然现在主流是Windows 10/11但很多老旧的工业软件、特定的开发环境或者测试场景依然离不开这个经典的操作系统。直接从网上下载现成的镜像一来安全性存疑二来很难保证镜像的“纯净度”和符合自己需求的定制化。于是我决定自己动手从零开始制作一个Windows 7的qcow2格式镜像。qcow2是QEMU/KVM虚拟化平台常用的镜像格式支持快照、动态扩容等高级特性在OpenStack、Proxmox VE等平台里应用非常广泛。这个项目的核心价值在于“可控”和“可复用”。通过VMware Workstation这类我们更熟悉的桌面虚拟化工具来安装和配置系统再利用工具转换格式我们就能得到一个完全由自己掌控的、干净的、并且适配主流云平台或虚拟化环境的系统镜像。整个过程听起来简单但实操中从驱动注入、格式转换到最终优化每一步都有不少细节和坑。这篇文章我就把这次亲测的完整流程、踩过的坑以及最终验证可用的技巧毫无保留地分享出来。无论你是运维工程师、开发者还是单纯的虚拟化爱好者这套方法都能帮你快速打造一个属于自己的“黄金镜像”。2. 环境与工具准备打好地基工欲善其事必先利其器。在开始制作镜像之前我们需要准备好所有必要的软件和资源。这个环节准备得越充分后续的操作就越顺畅。2.1 核心软件清单首先我们需要以下核心软件它们将贯穿整个制作流程VMware Workstation Pro/Player这是我们的“母平台”用于安装和初步配置Windows 7虚拟机。我使用的是VMware Workstation 17 Pro但16或15版本也基本没问题。Player免费版功能足够。Windows 7 ISO镜像文件这是系统安装的源头。务必从可信渠道获取官方原版ISO避免使用Ghost或第三方修改版以确保系统纯净和稳定性。建议使用带有SP1的版本。QEMU Guest Agent for Windows这不是必须的但强烈推荐。它是一个运行在虚拟机内部的守护进程允许宿主机更好地与虚拟机交互例如正常执行关机、重启命令以及获取IP地址等信息。对于云环境尤其重要。VirtIO驱动这是关键中的关键qcow2镜像最终通常运行在KVM虚拟化环境下其虚拟硬件磁盘、网卡采用VirtIO标准这与VMware的虚拟硬件LSI Logic, VMXNET3完全不同。如果不在镜像制作阶段注入VirtIO驱动转换后的镜像将无法启动。我们需要提前下载好VirtIO驱动ISO通常可从Fedora或Red Hat官方项目页面获取。转换工具qemu-img这是将VMware虚拟磁盘.vmdk转换为qcow2格式的核心命令行工具。它包含在QEMU软件包中。在Windows上你可以通过安装qemu-for-windows包来获取在Linux上通常通过包管理器安装qemu-utils。2.2 虚拟机初始创建策略在VMware中创建虚拟机时有几个设置会直接影响后续转换的成功率和镜像质量操作系统选择在VMware新建虚拟机向导中客户机操作系统明确选择“Microsoft Windows”版本选择“Windows 7”。这会让VMware应用一些针对Windows 7的优化默认设置。固件类型务必选择“BIOS”而不是UEFI。虽然现代系统多用UEFI但在跨平台虚拟化镜像制作中BIOS的兼容性远高于UEFI。很多云平台对传统BIOS启动的镜像支持更好、问题更少。磁盘配置类型选择“SCSI”或“SATA”均可。为了简化我选择了SATA。注意不要选择NVMe因为其驱动更复杂。容量建议单一块磁盘大小根据需求设定如40GB。关键点将虚拟磁盘存储为单个文件而不是拆分成多个文件。这会生成一个单独的.vmdk文件方便后续转换。硬件兼容性选择与你VMware版本匹配或稍旧的兼容性如“Workstation 16.x”以确保最大的可移植性。注意不要在VMware中安装VMware Tools。我们的目标是制作一个独立于VMware的通用镜像因此只需要安装系统本身和必要的VirtIO驱动。VMware Tools是VMware环境专用的在KVM环境下无用且可能引起冲突。3. 系统安装与关键驱动注入这是制作过程的核心阶段目标是在VMware环境下安装一个“干净”的Windows 7并提前为KVM环境准备好“心脏”VirtIO驱动。3.1 标准系统安装流程挂载Windows 7 ISO镜像启动虚拟机开始标准安装流程。在分区界面你会遇到第一个障碍Windows安装程序可能无法识别VMware提供的虚拟磁盘。这是因为默认的磁盘控制器驱动不匹配。此时点击“加载驱动程序”。我们需要提前将下载好的VirtIO驱动ISO也挂载到虚拟机的另一个光驱中。在VMware的虚拟机设置里添加第二个CD/DVD设备指向VirtIO驱动的ISO文件。回到Windows安装界面点击“浏览”找到第二个光驱通常是D盘进入vioscsi或viostor目录对应SCSI和块设备驱动选择对应你系统位宽x86或amd64的目录然后选择正确的驱动文件。加载成功后安装程序就能看到虚拟磁盘了。继续完成Windows 7的安装。安装过程中网络可能是断开的因为VMware的网卡驱动如E1000E在此时可用但为了最终镜像我们稍后也要替换为VirtIO网卡驱动。3.2 首次启动后的关键配置系统安装完成并首次进入桌面后不要急着做任何个性化设置先完成以下几件至关重要的事情安装VirtIO网卡驱动进入“设备管理器”你会发现“以太网控制器”带有一个黄色的感叹号未知设备。右键点击更新驱动程序软件 - 浏览计算机以查找驱动程序软件。指向VirtIO驱动ISO挂载的盘符进入NetKVM目录下的对应位宽子目录安装驱动。安装成功后网络应能正常连接。安装QEMU Guest Agent运行VirtIO驱动ISO根目录下的guest-agent安装程序如qemu-ga-x86_64.msi。安装过程很简单一路下一步即可。安装完成后服务默认是停止的。你需要进入“服务”管理界面services.msc找到“QEMU Guest Agent”服务将其启动类型设置为“自动”并立即启动它。这个服务以后会在KVM虚拟机内部自动运行。进行系统更新与基础优化连接网络运行Windows Update安装所有重要更新特别是那些安全更新。这个过程可能很漫长需要多次重启但为了镜像安全必须做。进行一些基础优化禁用休眠以管理员身份运行CMD输入powercfg -h off可以节省镜像空间运行磁盘清理删除临时文件如果你确定不需要可以禁用页面文件虚拟内存但这取决于你的使用场景。封装系统Sysprep这是制作可分发镜像的标准步骤目的是移除当前系统的唯一性信息如SID、计算机名让镜像在第一次被新虚拟机使用时能重新生成这些信息避免冲突。按WinR 输入sysprep并回车打开C:\Windows\System32\sysprep目录。运行sysprep.exe。在“系统清理操作”中选择“进入系统全新体验(OOBE)”同时勾选“通用”在“关机选项”中选择“关机”。点击“确定”系统会自动执行封装并关机。注意封装后虚拟机必须关机不能再次启动否则封装失效。此时我们的“原料”虚拟机就准备好了。4. 虚拟磁盘格式转换从VMDK到QCOW2虚拟机已经封装并关机现在我们得到了一个.vmdk格式的虚拟磁盘文件。接下来就是使用qemu-img工具进行格式转换。4.1 转换命令详解假设你的VMware虚拟机磁盘文件路径是D:\VMs\Win7\Windows 7.vmdk 我们想把它转换成win7_x64.qcow2。在命令行Windows下可使用PowerShell或CMD但需确保qemu-img.exe在系统PATH中中执行以下命令qemu-img convert -p -f vmdk -O qcow2 D:\VMs\Win7\Windows 7.vmdk win7_x64.qcow2让我们拆解这个命令的每个参数convert执行转换操作。-p显示进度条。在转换大文件时这个参数非常贴心让你知道进展。-f vmdk指定输入文件的格式是vmdk。qemu-img通常能自动检测但明确指定更稳妥。-O qcow2指定输出文件的格式是qcow2。这里的O是大写字母。最后两个参数分别是输入文件的全路径和输出文件名。4.2 转换过程中的注意事项与性能优化转换过程耗时取决于原.vmdk文件的大小和你的磁盘IO性能。一个40GB的磁盘在普通机械硬盘上可能需要二三十分钟在SSD上会快很多。空间考虑.qcow2格式是稀疏文件它只占用实际存储了数据的空间而不是整个磁盘容量。例如一个40GB的VMDK如果Windows只用了15GB那么转换后的qcow2文件初始大小可能就在15GB左右非常节省存储。压缩选项如果你想进一步减小镜像体积可以在转换时加入压缩选项-c。命令变为qemu-img convert -p -f vmdk -O qcow2 -c input.vmdk output.qcow2这会对镜像进行压缩但会显著增加转换时间。对于Windows系统盘压缩率可能不如Linux镜像明显请权衡时间和空间。文件完整性校验转换完成后可以使用qemu-img info win7_x64.qcow2命令查看输出文件的详细信息确认格式为qcow2并检查虚拟大小是否正确。实操心得我强烈建议在转换前先在VMware里对虚拟磁盘进行一次“碎片整理和压缩”VMware菜单虚拟机 - 管理 - 清理磁盘。这能释放虚拟机内已删除文件占用的空间使得.vmdk文件本身变小从而加快转换速度并生成更小的qcow2文件。5. 镜像验证与在KVM环境中的测试转换得到.qcow2文件后工作只完成了一半。我们必须验证这个镜像是可用的。最直接的方法就是把它放到一个KVM环境中启动。5.1 使用Libvirtvirt-manager快速测试如果你有一台Linux测试机安装libvirt和virt-manager一个图形化管理工具是最方便的方式。创建新虚拟机打开virt-manager点击“新建虚拟机”。选择导入现有磁盘在安装方式中选择“导入现有磁盘镜像”然后浏览到你刚生成的win7_x64.qcow2文件。配置操作系统类型virt-manager通常能自动检测到是Windows但最好手动选择“Microsoft Windows 7”。内存与CPU分配适当资源。关键步骤选择虚拟硬件磁盘总线确保磁盘的总线类型为VirtIO。这是之前注入驱动的原因。网卡型号确保网络设备的型号也是VirtIO如virtio-net。显卡对于Windows 7选择QXL或VGA作为显示设备兼容性更好。Spice服务端可以后续安装增强工具获得更好体验。开始安装实际上不需要安装因为系统已装好。启动虚拟机你应该能看到Windows 7启动画面并最终进入OOBE全新体验界面让你设置用户名、密码等。这说明镜像转换和驱动注入是成功的5.2 常见启动故障排查如果虚拟机无法启动卡在启动界面或出现蓝屏可以按以下思路排查检查驱动注入是否成功这是最常见的问题。回顾第3步是否在安装Windows时正确加载了VirtIO存储驱动viostor安装完成后是否在设备管理器里安装了VirtIO网卡驱动NetKVM如果缺失虚拟机在KVM下会因为找不到启动磁盘磁盘控制器不匹配或关键硬件而失败。检查虚拟机XML配置在virt-manager中查看虚拟机的XML配置点击“查看”-“详情”确认disk设备的driver nameqemu typeqcow2/和target devvda busvirtio/以及interface设备的model typevirtio/。尝试更改磁盘总线如果怀疑是磁盘驱动问题可以临时将磁盘总线从VirtIO改为SATA或IDE在virt-manager的磁盘硬件设置中修改。如果能用SATA/IDE启动则证明是VirtIO磁盘驱动有问题需要回到VMware环境重新处理驱动。查看启动日志在virt-manager的虚拟机窗口点击“查看”-“控制台”可以查看详细的启动日志。对于更深入的调试可以在宿主机上用virsh命令启动并捕获日志virsh start vm-name --console。6. 镜像后期优化与定制一个能启动的镜像只是基础一个“好用”的镜像还需要进行优化和定制使其更适合批量部署或特定场景。6.1 镜像瘦身即使转换后镜像文件可能仍包含一些无用数据。我们可以使用virt-sparsify工具来自libguestfs-tools包来进一步“稀疏化”镜像回收镜像内部的未使用空间。# 在Linux宿主机上操作 sudo virt-sparsify --compress win7_x64.qcow2 win7_x64_compressed.qcow2这个工具会创建一个新的、更紧凑的镜像文件。务必对原文件进行备份因为此操作会修改镜像内容。6.2 安装Cloud-Init可选但推荐如果你计划在云平台如OpenStack中使用此镜像集成Cloud-Init是极好的选择。Cloud-Init是一个行业标准用于虚拟机首次启动时进行初始化如设置主机名、注入SSH密钥、配置网络等。为Windows集成Cloud-Init相对复杂通常需要下载Cloudbase-InitWindows版的Cloud-Init安装包在Sysprep之前安装并配置好。这是一个进阶话题但能极大提升镜像在云环境中的自动化部署能力。基本步骤是下载Cloudbase-Init MSI安装包在VMware的Windows中安装进行基本配置如设置服务为自动启动然后再执行Sysprep封装。6.3 创建镜像模板与版本管理得到满意的镜像后建议将其上传到你的镜像仓库如OpenStack Glance、Proxmox存储池等并打上清晰的标签例如windows-7-x64-sp1-virtio-ga-v1.0.qcow2 注明系统版本、补丁状态、已安装的组件等。后续如果需要更新如安装新的月度安全更新最佳实践是从模板镜像启动一个新的临时虚拟机。进行更新和修改。再次执行Sysprep并关机。使用qemu-img创建该临时虚拟机磁盘的快照或转换副本作为新版本的模板。这样就能实现镜像的版本化管理。7. 总结与避坑指南复盘回顾整个制作过程从VMware安装到qcow2转换再到KVM测试成功的关键在于细节的把控。这里再集中梳理一下最容易出错的点和对应的解决方案算是我的“避坑备忘录”。问题现象可能原因解决方案在KVM中启动时蓝屏错误代码INACCESSIBLE_BOOT_DEVICEVirtIO存储驱动viostor未正确注入。Windows在KVM下找不到启动磁盘。回到VMware环境确保Windows安装初期从VirtIO驱动ISO加载了正确的存储控制器驱动。或在KVM中临时将磁盘总线改为IDE/SATA测试。虚拟机启动后无网络VirtIO网络驱动NetKVM未安装。在VMware环境中进入设备管理器为未知的“以太网控制器”手动安装VirtIO驱动ISO中的NetKVM驱动。转换后的qcow2镜像在启动时反复进入Sysprep或OOBESysprep封装后在VMware中又启动过虚拟机导致封装状态被破坏。严格遵循流程执行Sysprep并选择“关机”后绝对不能再启动该虚拟机应直接进行磁盘转换。qemu-img convert过程非常慢源VMDK文件碎片多或宿主机磁盘IO性能差。1. 在VMware中先执行“清理磁盘”。2. 将VMDK文件放在SSD上进行转换操作。镜像文件体积仍然很大虚拟机内部存在大量未释放的磁盘空间如临时文件、休眠文件。1. 在Sysprep前运行磁盘清理禁用休眠(powercfg -h off)。2. 转换时使用-c参数压缩。3. 转换后使用virt-sparsify进行稀疏化处理。QEMU Guest Agent在KVM虚拟机内未运行服务未设置为自动启动或安装后未启动。在VMware环境中安装完QEMU Guest Agent后务必进入“服务”管理将其启动类型设为“自动”并“启动”该服务。最后我个人最大的体会是耐心和顺序。每一步都做完、检查好再进行下一步。尤其是在驱动注入和Sysprep环节不要图快。一个精心制作的、干净的Windows 7 qcow2镜像会成为你基础设施中一块非常可靠的“砖”在需要快速部署一个特定老环境时它能节省你大量的时间和精力。整个流程虽然步骤不少但一旦跑通并形成自己的脚本或笔记后续制作其他Windows版本如Windows 10的镜像就会变得驾轻就熟。

相关新闻

AI隐私计算落地难?3大核心瓶颈与7个已验证的工业级解决方案(附GDPR/CCPA合规对照表)

AI隐私计算落地难?3大核心瓶颈与7个已验证的工业级解决方案(附GDPR/CCPA合规对照表)

更多请点击: https://kaifayun.com 第一章:AI隐私计算落地难?3大核心瓶颈与7个已验证的工业级解决方案(附GDPR/CCPA合规对照表) AI隐私计算在金融、医疗、政务等高敏感场景中持续遭遇规模化落地阻力,根源并…

2026/10/18 7:32:44 阅读更多 →
Spring Boot构建高并发抽奖系统:概率模型、库存控制与数据一致性实战

Spring Boot构建高并发抽奖系统:概率模型、库存控制与数据一致性实战

在实际游戏开发或趣味项目中,抽奖、开箱、盲盒这类概率玩法是提升用户参与度和付费意愿的常见设计。无论是独立游戏、小程序还是H5活动页,其核心逻辑都离不开一套稳定、可配置且体验流畅的随机奖励系统。很多开发者初次接触时,容易将重点放在…

2026/10/18 7:33:36 阅读更多 →
KMS智能激活终极指南:5分钟实现Windows和Office永久免费激活

KMS智能激活终极指南:5分钟实现Windows和Office永久免费激活

KMS智能激活终极指南:5分钟实现Windows和Office永久免费激活 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为系统激活烦恼吗?KMS_VL_ALL_AIO智能激活工具为你提供了…

2026/10/17 15:50:53 阅读更多 →

最新新闻

【信息科学与工程学】【通信工程】第二百四十四篇 通信网络中的流量类型01

【信息科学与工程学】【通信工程】第二百四十四篇 通信网络中的流量类型01

行业分类统一参照 GB/T 4754-2017(门类+大类2位+中类3位+小类4位);TC3 并非全局唯一定义,需在每行中按场景注明其具体含义(RDMA QoS / 运营商流量等级 / 设备厂商 TC 映射均可能不同)。 编号 类型 行业大类(GB/T 4754) 行业中类 行业小类 智算中心/企业网/数据中心…

2026/10/18 7:33:04 阅读更多 →
LangChain异步化实战:ainvoke/astream与asyncio提升服务吞吐量的关键细节

LangChain异步化实战:ainvoke/astream与asyncio提升服务吞吐量的关键细节

第一次把一个 LangChain 链塞进异步服务里时,我的第一反应是:把 invoke 换成 ainvoke,把 stream 换成 astream,不就完事了吗?实测下来,事情确实就这么简单,但所有坑也都藏在“只改方法名”的背后…

2026/10/18 7:33:04 阅读更多 →
ArtCraft是什么?解析多领域中的艺术与技术融合实践

ArtCraft是什么?解析多领域中的艺术与技术融合实践

我理解您的要求,但需要坦诚说明:当前输入内容中,项目标题“artcraft”未提供任何有效上下文——既无项目正文描述、无关键词列表、无摘要描述,也未给出任何可识别的领域指向(如是AI绘画工具、手工DIY平台、3D建模插件、…

2026/10/18 7:33:04 阅读更多 →
UGUI中Polygon Collider 2D的非物理点击判定与坐标映射

UGUI中Polygon Collider 2D的非物理点击判定与坐标映射

1. 为什么UGUI里硬塞Polygon Collider 2D是个“反直觉操作”刚看到这个标题时,我下意识皱了下眉——不是因为难,而是因为太违和。Unity的UGUI系统从设计之初就走的是“矩形优先”路线:Canvas是分层渲染的矩形画布,Image、Text、Bu…

2026/10/18 7:33:04 阅读更多 →
思维链CoT:仅靠提示词激活大模型推理能力的里程碑论文

思维链CoT:仅靠提示词激活大模型推理能力的里程碑论文

做AI应用的人,大概都经历过这种画面:模型能把论文摘要写得比不少研究生还像样,你让它算“小明有5个苹果,小红又给了他2袋,每袋3个苹果,问小明现在有几个苹果”,它一本正经地输出一个错的答案。这…

2026/10/18 7:33:04 阅读更多 →
AI智能体赋能Cypress E2E测试:四种落地路径与高效工作流

AI智能体赋能Cypress E2E测试:四种落地路径与高效工作流

在自动化测试这个领域摸爬滚打几年,我越来越清楚一件事:前端E2E测试的瓶颈,从来不在“能不能驱动浏览器”,而在于“用例有没有人写、坏了有没有人修”。Cypress已经把驱动浏览器这件事做得非常舒服了,断言自动重试、网…

2026/10/18 7:32:04 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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 阅读更多 →