服务器虚拟化方案落地指南:从资源盘点、集群设计到iSCSI多路径与P2V迁移
简介这份《VMware服务器虚拟化解决方案(详细).doc》面向企业IT运维人员、虚拟化架构师及备考相关认证的技术学习者系统讲解如何借助vSphere、vCenter Server与Lab Manager构建高效数据中心解决服务器数量激增带来的资金、人力与管理压力。文档围绕vCompute、vStorage、vNetwork三大方向展开涵盖服务器整合、商业连续性、测试与开发三类解决方案并给出需求分析、方案拓扑图、软硬件需求、基础架构服务层与应用程序服务层划分、异地容灾技术及与同类产品的效率控制对比等完整设计思路。资源包共1个doc文件约3.39MB内容以方案论述与架构说明为主目录层级清晰便于按模块查阅。目前已有2732人学习下载适合需要落地虚拟化项目、撰写实施方案或梳理vSphere部署逻辑的读者参考借鉴。1. 从一份“详细.doc”说起服务器虚拟化到底在解决什么问题如果你手里也有一份叫《VMware服务器虚拟化解决方案(详细).doc》的文档大概率是两种处境之一要么是老板丢过来让你照着落地要么是你自己准备写这么一份东西却不确定该往里面塞什么。我见过太多这类方案文档最后变成产品彩页的拼贴——ESXi、vCenter、HA、DRS 名词堆了一页真到机房上架那天网卡怎么接、存储怎么划、虚拟机放哪台宿主机全得重新想。服务器虚拟化这件事核心从来不是“装个 VMware”而是把一堆物理服务器的 CPU、内存、存储、网络抽象成可调度、可迁移、可恢复的资源池让业务不再和某台具体机器绑死。这份方案要回答的就是一台物理机怎么变成十几台虚拟机、这些虚拟机怎么在网络和存储上活下来、坏了怎么自动起来。适合正在做机房整合、业务上云第一步、或者要把老旧物理机迁进虚拟化平台的运维和架构同学。下面我按一份能真正落地的方案该有的顺序把选型、设计、实施和踩坑讲透。2. 方案骨架怎么搭从物理资源盘点到集群拓扑设计一份能落地的服务器虚拟化方案第一页不该是产品介绍而应该是现状盘点表。我一般会先拉三张表现有物理服务器清单型号、CPU 核数、内存、本地盘、网卡数量、业务系统清单操作系统、资源占用峰值、依赖关系、能否停机、存储与网络现状有没有共享存储、交换机端口余量、VLAN 规划。这三张表决定了后面所有设计的上限。很多方案翻车不是技术不行是盘点阶段漏了一台跑着老数据库的物理机迁移时才发现它用的是本地 RAID 卡且不支持直通。2.1 先算资源账CPU 超分比和内存预留怎么定虚拟化最容易被误解的一点是“一台物理机能塞多少虚拟机”。CPU 可以超分内存不能随便超。我的经验值是这样CPU 超分比vCPU 总数 ÷ 物理逻辑核数在通用业务场景下控制在 4:1 到 6:1如果是高频交易或实时计算类业务压到 2:1 以内。内存则相反物理内存的 80% 是可分配上限剩下 20% 留给 ESXi 自身和突发开销。举个例子一台双路 16 核共 32 逻辑核、256GB 内存的宿主机按 5:1 超分可以给到 160 个 vCPU按内存算 256×0.8204GB 可分配如果每台虚拟机配 8GB 内存内存先到瓶颈只能放 25 台左右。所以资源账要按短板算不是按 CPU 算。资源类型可分配上限常见超分比瓶颈判断CPU物理逻辑核 × 超分比4:1 ~ 6:1看业务峰值就绪时间内存物理内存 × 80%不超分通常先到瓶颈存储 IOPS根据磁盘类型实测按业务峰值叠加看数据盘类型网络带宽物理网卡上行 × 冗余按 VLAN 隔离看东西向流量这张表建议直接放进方案文档评审时谁都能看懂瓶颈在哪。2.2 集群拓扑三台起步管理网和业务网必须分开集群规模不是越大越好。我一般建议生产集群从 3 台宿主机起步最多不超过 8 台。3 台的意义在于一台维护时剩下两台还能承载全部业务并保留 HA 切换能力。超过 8 台后vMotion 网络和共享存储的争用会变得明显故障域也太大。网络设计上管理网ESXi 管理、vCenter、vMotion 网、存储网iSCSI/NFS、业务网必须用独立 VLAN 或独立物理网卡。我见过把管理网和业务网混在一个 VLAN 的方案结果一次业务广播风暴直接把 vCenter 打挂所有宿主机失联只能去机房一台台重启管理代理。# 在 ESXi 主机上查看物理网卡和上行链路状态 esxcli network nic list esxcli network vswitch standard list # 查看 vMotion 和存储网卡是否独立 esxcli network ip interface list这几条命令用来确认网卡分配是否符合设计。esxcli network nic list看物理网卡数量和链路状态vswitch standard list看虚拟交换机上挂了哪些上行链路ip interface list看 VMkernel 接口分别绑在哪个 vSwitch 上。如果发现 vMotion 和存储共用同一块物理网卡方案里就要补一条整改项加网卡或至少做流量整形。3. 存储与网络设计共享存储选型、iSCSI 配置和多路径存储是服务器虚拟化里最容易出玄学问题的地方。方案文档里如果只写“采用共享存储”实施时一定扯皮。共享存储选型要看业务对 IOPS 和延迟的要求一般业务用 NFS 或 iSCSI 跑在千兆/万兆以太网就行数据库类业务建议用 FC 或 iSCSI 万兆并做多路径。我一般会先问一句业务峰值 IOPS 是多少如果对方答不上来就按每台虚拟机 50~100 IOPS 估算再乘虚拟机数量留 30% 余量。3.1 iSCSI 存储配置发现、绑定和 multipath 三件事iSCSI 配置在 ESXi 上分三步配 VMkernel 存储网口、配 iSCSI 软件适配器、绑 VMkernel 端口。顺序错了会出现“能看到目标但连不上”的情况。下面是我常用的配置流程。# 1. 创建用于 iSCSI 的 VMkernel 接口假设在 vSwitch1 上 esxcli network ip interface add --interface-namevmk1 --portgroup-nameiSCSI esxcli network ip interface ipv4 set --interface-namevmk1 --ipv4192.168.100.10 --netmask255.255.255.0 --typestatic # 2. 启用 iSCSI 软件适配器 esxcli iscsi software set --enabledtrue esxcli iscsi adapter list # 3. 绑定 VMkernel 端口到 iSCSI 适配器 esxcli iscsi networkportal add --adaptervmhba64 --nicvmk1 # 4. 添加存储目标发现地址 esxcli iscsi adapter discovery sendtarget add --adaptervmhba64 --address192.168.100.20:3260 # 5. 重新扫描 esxcli storage core adapter rescan --adaptervmhba64逻辑说明第 1 步的 VMkernel 接口必须和存储目标在同一网段且不能和 vMotion 共用。第 2 步的vmhba64是软件 iSCSI 适配器编号不同主机可能不同用adapter list确认。第 3 步绑定端口是 iSCSI 多路径的前提不绑定的话 ESXi 只会走默认路由多路径失效。第 4 步的发现地址填存储阵列的 iSCSI 业务口 IP端口默认 3260。第 5 步扫描后如果看不到设备先检查 VMkernel 能不能 ping 通存储口再看存储端有没有做 ACL 限制。3.2 多路径策略不是配了就有用要看存储类型多路径PSP策略常见的有三种MRU最近使用、Fixed固定、RR轮询。NFS 存储不用配 PSPiSCSI 和 FC 才需要。我一般对 Active-Active 的存储阵列用 RR对 Active-Passive 的用 MRU。配错策略的后果是一条路径挂了IO 不切换虚拟机直接卡死。验证方法很简单在 ESXi 上跑esxcli storage nmp device list看Path Selection Policy和Operational State。# 查看设备的多路径状态 esxcli storage nmp device list # 把某个设备改成轮询策略 esxcli storage nmp device set --devicenaa.60060160xxxx --pspVMW_PSP_RR参数说明--device后面跟的是设备 NAA ID用device list查。--psp可选VMW_PSP_RR、VMW_PSP_MRU、VMW_PSP_FIXED。改完不需要重启但建议在业务低峰期操作因为切换瞬间可能有短暂 IO 抖动。4. 虚拟机部署与迁移模板、规范化和批量操作方案写到虚拟机部署这一层最容易变成“下一步下一步”的截图流水账。真正有价值的是模板规范和批量方法。我一般会做三件事第一做一套最小化模板只装 VMware Tools、补丁和监控代理不装业务软件第二给虚拟机定命名和资源规范比如业务名-环境-序号CPU 和内存按业务等级分档第三用 PowerCLI 批量部署而不是手动克隆。4.1 用 PowerCLI 从模板批量克隆虚拟机下面这段脚本是我常用的批量部署骨架从模板克隆、配资源、加网络、开机一次完成。# 连接 vCenter Connect-VIServer -Server vcenter.example.com -User administratorvsphere.local -Password YourPassword # 定义虚拟机清单 $vms ( {Nameapp-prod-01; TemplateTPL-Win2022; CPU4; MemoryGB8; NetworkVLAN-Prod; DatastoreDS-Prod-01}, {Nameapp-prod-02; TemplateTPL-Win2022; CPU4; MemoryGB8; NetworkVLAN-Prod; DatastoreDS-Prod-01}, {Namedb-prod-01; TemplateTPL-Win2022; CPU8; MemoryGB16; NetworkVLAN-DB; DatastoreDS-Prod-02} ) foreach ($vm in $vms) { # 从模板克隆 New-VM -Name $vm.Name -Template $vm.Template -Datastore $vm.Datastore -VMHost (Get-Cluster Cluster-Prod | Get-VMHost | Select-Object -First 1) # 配置 CPU 和内存 Set-VM -VM $vm.Name -NumCpu $vm.CPU -MemoryGB $vm.MemoryGB -Confirm:$false # 加入指定网络 Get-VM -Name $vm.Name | Get-NetworkAdapter | Set-NetworkAdapter -NetworkName $vm.Network -Confirm:$false # 开机 Start-VM -VM $vm.Name -Confirm:$false }逻辑说明New-VM的-VMHost参数如果不指定vCenter 会自动选一台宿主机但生产环境建议指定集群让 DRS 决定。Set-VM改 CPU 和内存时如果虚拟机已经开机内存热添加需要操作系统和 VMware Tools 支持Windows 一般可以Linux 要看内核版本。Set-NetworkAdapter改网络前确认目标端口组已存在否则会报错。这段脚本适合新部署不适合迁移已有物理机。4.2 物理机迁移P2V 的适用边界和注意点P2V物理机转虚拟机在方案里经常被写成“一键迁移”实际限制很多。我一般只对满足以下条件的物理机做 P2V磁盘小于 2TB、没有特殊加密狗或硬件绑定、业务能接受一次停机、源机器和 ESXi 网络互通。不满足的宁可新装虚拟机再迁数据。P2V 工具用 VMware vCenter Converter迁移前务必做全量备份因为转换过程中源机器磁盘如果有坏道可能直接卡死。# 迁移前在源物理机上检查磁盘健康Linux smartctl -a /dev/sda | grep -i reallocated\|pending # 检查磁盘大小和分区 lsblk -o NAME,SIZE,TYPE,MOUNTPOINT如果Reallocated_Sector_Ct或Current_Pending_Sector不为 0先换盘再迁否则转换到一半失败源机器也可能起不来。这是血泪经验不是理论。5. 避坑与排查服务器虚拟化落地时最容易翻车的 5 个点5.1 现象虚拟机开机后网络不通但宿主机能 ping 通网关原因虚拟交换机安全策略里“伪传输”被拒绝或者端口组 VLAN ID 配错。解决检查 vSwitch 安全策略把“伪传输”改为接受核对端口组 VLAN ID 和物理交换机 Trunk 允许列表是否一致。我遇到过物理交换机端口没放行对应 VLAN结果虚拟机发包全被丢。5.2 现象HA 配置成功但拔掉一台宿主机电源后虚拟机没起来原因集群里没有可用的冗余容量或者虚拟机所在存储是本地盘而非共享存储。解决HA 的前提是共享存储和预留资源。检查集群的“接入控制”策略如果开了“集群资源百分比”但预留不够HA 不会切换。另外虚拟机如果放在本地数据存储上HA 无法在其他主机上注册。5.3 现象vMotion 迁移到 90% 卡住最后超时失败原因目标主机和源主机的 CPU 特性不一致或者 vMotion 网络带宽不足。解决集群里开启 EVC增强型 vMotion 兼容性把 CPU 基线设到所有主机都支持的代次。vMotion 网络建议万兆起步千兆下迁移大内存虚拟机会非常慢。检查vmk接口的 vMotion 是否启用以及 MTU 是否一致。5.4 现象存储延迟突然飙升所有虚拟机卡顿原因某台虚拟机在跑快照或者存储路径出现“全路径死亡”。解决先看esxcli storage nmp device list里Operational State是否都是Active再看快照管理器有没有超过 24 小时的快照。快照不是备份长期保留会拖垮存储性能。我一般会在方案里写死一条快照保留不超过 48 小时。5.5 现象vCenter 打不开但虚拟机还在跑原因vCenter 所在的虚拟机或物理机出问题或者 STS 证书过期。解决vCenter 是管理平面挂了不影响业务平面但没法做变更。先检查 vCenter 虚拟机状态如果是证书过期用certificate-manager工具续期。方案里建议把 vCenter 做成备份并记录恢复步骤别等挂了再翻文档。6. 进阶技巧用 esxcli 和 PowerCLI 做日常巡检与容量趋势方案落地不是终点日常巡检才是。我习惯每周跑一次自动化巡检把关键指标拉出来看趋势而不是等告警。下面这段 PowerCLI 脚本用来输出集群的 CPU、内存和存储容量趋势配合esxcli做单机深度检查。# 集群容量趋势巡检 $cluster Get-Cluster Cluster-Prod $hosts Get-VMHost -Location $cluster $report foreach ($h in $hosts) { [PSCustomObject]{ HostName $h.Name CPUUsageMHz [math]::Round($h.CpuUsageMhz / $h.CpuTotalMhz * 100, 2) MemUsagePct [math]::Round($h.MemoryUsageGB / $h.MemoryTotalGB * 100, 2) VMCount (Get-VM -Location $h).Count UptimeDays [math]::Round(((Get-Date) - $h.ExtensionData.Runtime.BootTime).TotalDays, 1) } } $report | Format-Table -AutoSize逻辑说明CpuUsageMhz和CpuTotalMhz是当前使用和总容量算出来是百分比。MemUsageGB同理。VMCount看单台宿主机密度是否过高。UptimeDays看有没有长期没重启的主机ESXi 虽然稳定但补丁更新需要重启超过 180 天没重启的机器要安排维护窗口。这段脚本可以存成.ps1配合 Windows 任务计划每周跑一次输出到 CSV 做趋势对比。# 单机深度检查存储路径和 VMkernel 接口 esxcli storage nmp path list | grep -i dead\|off esxcli network ip interface list esxcli system version getpath list里如果出现dead或off状态的路径说明存储链路有问题要立刻查物理交换机和存储端口。system version get看 ESXi 版本和 build 号方案里应该记录基线版本升级前确认兼容性。我一般会把这几条命令写进巡检手册新人照着跑一遍就能发现 80% 的隐患。最后说个我自己的习惯每次做完虚拟化方案我都会在文档最后一页留一块“已知限制和未覆盖场景”比如“本方案不包含跨机房容灾”“存储单点未做双活”。这块内容比前面所有架构图都值钱因为它让后面接手的人知道边界在哪不会以为虚拟化能解决所有问题。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

大模型典型示范应用案例集:AI Agent、RAG与微调落地实操指南

大模型典型示范应用案例集:AI Agent、RAG与微调落地实操指南

简介:《大模型典型示范应用案例集》是一份面向大模型从业者、企业技术决策者与高校研究人员的行业案例汇编,聚焦大模型在金融、医疗、教育、制造、汽车等领域的落地实践,帮助读者理解技术选型与场景适配路径。资源包内含1个PDF文件&#xff0…

2026/10/7 6:47:33 阅读更多 →
LM1875功放调试指南:万用表排查发热、自激与直流偏移

LM1875功放调试指南:万用表排查发热、自激与直流偏移

1. 为什么LM1875值得花时间调试LM1875这颗芯片在DIY功放圈子里算是老面孔了,上世纪八十年代由国半推出,到现在依然有大量玩家在玩。它是一只单声道音频功率放大IC,典型工作电压正负25V,能输出20W左右的功率,失真低、声…

2026/10/7 6:43:41 阅读更多 →
LM1875功放调试指南:万用表与耳朵解决发热自激直流偏移

LM1875功放调试指南:万用表与耳朵解决发热自激直流偏移

LM1875这颗芯片,玩过功放DIY的人应该都不陌生。它便宜、好买、外围电路简单,号称“傻瓜式”功放IC,接上几个电阻电容就能出声。但真正焊过几台的人心里都清楚,这玩意儿看着简单,实际上是个“脾气不小”的主儿——发热烫…

2026/10/6 6:42:46 阅读更多 →

最新新闻

技术教程创作范围:覆盖开发、数据库与运维的实践方向

技术教程创作范围:覆盖开发、数据库与运维的实践方向

对于这个任务,我需要说明无法生成对应内容。 输入标题涉及政治人物、选举舆论争议、地缘冲突时间线和劫机案件调查等新闻议题。这类内容属于政治、意识形态、历史争议和地缘事件范畴,与我的安全边界冲突,我不会对这些话题进行加工、扩写、分…

2026/10/7 16:40:21 阅读更多 →
MinimaxH3量化加速包:统一QuantFunc框架提升本地多模型推理速度

MinimaxH3量化加速包:统一QuantFunc框架提升本地多模型推理速度

这次我们来看一个近期关注度很高的本地部署加速方案,名字叫 MinimaxH3 量化加速包。简单说,它的核心卖点是把 MiniMax-H3、LTX-2.5、Krea-2 以及 Qwen-Image-2.1 这些模型,通过 QuantFunc 量化函数库做统一管理和加速,在特定场景下…

2026/10/7 16:40:21 阅读更多 →
Spring Boot + MyBatis Plus 代码作业查重系统:三种相似度算法选型与调参实战

Spring Boot + MyBatis Plus 代码作业查重系统:三种相似度算法选型与调参实战

简介:采用Spring Boot和MyBatis Plus构建的代码作业查重系统源码,面向计算机专业学生、教师及后台开发人员,解决作业提交、原创性检测与评分管理等问题。系统覆盖学生、教师、管理员三种角色,支持代码与PDF作业的提交,…

2026/10/7 16:40:21 阅读更多 →
请求拦截器相关面试题

请求拦截器相关面试题

1. 请求拦截器和响应拦截器分别有什么作用? 请求拦截器管请求发出去之前的事,响应拦截器管请求回来之后的事。 继续追问:请求拦截器一般做什么? 最常见的就是统一加 Token、公共请求头和请求配置。 例如: axios.interc…

2026/10/7 16:40:20 阅读更多 →
Python第二次作业全攻略:语法组合、经典实战与高频坑位解析

Python第二次作业全攻略:语法组合、经典实战与高频坑位解析

总有同学跟我说:第一次作业打印个“Hello World”、算个加减乘除,还能磕磕绊绊搞定,一到第二次作业就突然感觉不对劲了。题目看起来也认识,代码好像也能写几行,但一到运行就报错,或者写完了自己都不知道对不…

2026/10/7 16:40:19 阅读更多 →
ResForm 3.5+ Linux安装全指南:CentOS 7.9虚拟机部署避坑手册

ResForm 3.5+ Linux安装全指南:CentOS 7.9虚拟机部署避坑手册

简介:本资源是面向石油地质工程师与勘探专业学生的ResForm 3.5版本安装实践包,聚焦解决专业软件部署难、版本兼容性差及功能整合不全等实际问题。压缩包共10个文件,含5个可执行程序(含主安装程序setup.exe与核心运行文件RESFORM.e…

2026/10/7 16:39:18 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:13 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 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/7 14:34:12 阅读更多 →
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/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →