Debian安装避坑指南:从镜像选择到自动化部署全流程解析

简介:面向Linux初学者的Debian安装基础教程资源包,系统讲解从安装前准备、创建启动介质、配置网络与磁盘分区,到用户设置、时区语言配置及首次系统维护的完整流程,适合希望从零上手Debian系统或需要重温安装要点的用户。包内共98个文件,包括80张操作截图(png)和15个图文页面(html),配合css样式与站点图标,将安装步骤按多个lesson章节拆解,并以清晰目录结构组织,便于按需查阅与逐节对照操作。整体仅959KB,轻量易下载,已有1331人学习使用。对于服务器运维入门、桌面系统替换或离线参考学习等场景,这套教程能帮助用户快速建立对Debian部署流程的整体认知,图文并茂的内容也适合边看边练、排查安装中遇到的问题。

1. Debian 安装入门:从镜像到能跑生产任务

很多第一次接触 Debian 的朋友都会有这样一种体验:安装过程比想象中顺畅,真正折腾人的是装完之后那一小时。某开发者拿到一台老机器想跑个稳定服务,装完 Debian 12 发现三件事——开机没网、sudo 命令报错、终端里中文全部乱码。问题不在安装步骤,而在几个极易忽略的默认值:区域设置没选对、用户没进 sudo 组、apt 源指向海外。这篇笔记把这些坑一次性讲透。如果你是刚把 Debian 当作主力系统或服务端系统的人,适合先花十分钟把本文过一遍,再动手装。

Debian 是大量云镜像和嵌入式系统的事实基底,它不追求花哨的界面,胜在包管理机制严谨、版本生命周期长。安装本身不复杂,但前期准备直接决定后续运维省不省心。下面从镜像选择开始,一条一条说。

2. Debian 安装前夜:镜像、校验与启动盘制作的三个细节

2.1 选镜像:stable、testing 与不自由固件版本

进入官网下载页面会看到一堆版本目录,最常被问到的是 stable、testing 和 unstable 选哪个。作为普通用户或服务器用途,直接选 stable,当前对应 Debian 12。它经过长时间冻结和测试,软件版本不是最新的,但行为可预期,升级出问题的概率小得多。testing 适用于想尝鲜但不想天天滚动的场景,unstable 则是给打包贡献者准备的,日常使用不建议碰。

下载时还有一个分支需要留意:不同网站会提供带 non-free 固件的镜像文件。如果你的网卡、显卡、无线模块依赖闭源固件,直接下载默认版本装到一半会发现驱动缺失,尤其常见于笔记本平台。Debian 官方镜像站一般会提供类似firmware-11.0.0-amd64-DVD-1.iso这样的命名,这类镜像内置了常见闭源固件,安装阶段就能直接驱动无线网卡,省去后续手动放固件的麻烦。我的习惯是无脑选带 firmware 的版本,即便当前机器用不上,留着做装机 U 盘通用性也更强。

2.2 校验下载文件:sha256sum 与公钥签名

这一步很多人直接跳过,但下载过程中被劫持或文件损坏的概率并不为零,尤其是通过镜像站而非官网下载时。拿到.iso文件后先看官方发布的 SHA256SUMS 文件,然后在终端里执行校验。以 Linux 环境为例:

sha256sum debian-12.2.0-amd64-DVD-1.iso # 输出类似: a5c1e8c9... debian-12.2.0-amd64-DVD-1.iso

把输出的哈希和官方发布的 SHA256SUMS 对比,一致才能继续。这一步能拦截绝大多数传输损坏和中间人篡改。更严格的验法是用 GPG 验证 SHA256SUMS 文件本身的签名,因为哈希文件也有被替换的可能。做法是:

gpg --verify SHA256SUMS.sign SHA256SUMS

首次验证会提示公钥缺失,需要先从 Debian 官网的公钥服务器拉取。嫌麻烦的话可以只做 sha256 比对,但要清楚这不防主动攻击,只防传输损坏。至少做一次完整校验,是你安装前最便宜的后悔药。

2.3 制作启动盘:dd 的正确姿势与常见失败

Linux 下做启动盘不需要额外工具,一条 dd 命令搞定:

sudo dd if=debian-12.2.0-amd64-DVD-1.iso of=/dev/sdb bs=4M status=progress oflag=sync conv=fsync

注意of指向盘符本身而不是某个分区,/dev/sdb和/dev/sdb1一字之差,结果完全不同。用lsblk先确认 U 盘设备号,别把硬盘写进去。bs=4M决定一次读写块大小,对 U 盘吞吐影响不大,但对老设备可以降到 1M 提高兼容性。

Windows 用户可以用 Rufus,选 DD 模式写入而非 ISO 模式,UEFI 启动兼容性更好。制作完成后别急着拔,先确认一下分区表:

sudo fdisk -l /dev/sdb

如果能看到一个类型为Linux的分区,说明写入成功。这里有个常见玄学:某些廉价 U 盘写入时没有报错,但实际字节没落盘,所以校验完再动手安装比较稳妥。

3. 图形化安装全流程:分区、引导与软件源选择方案

3.1 分区策略:BIOS/MBR 与 UEFI/GPT 的选择

进入安装界面后,联网与否会显著影响后续体验,建议跳过网络配置先做分区。分区是新手最容易犹豫的环节,先把大方向定下来:

老机器和某些虚拟机默认走 BIOS 启动,分区表用 MBR 即可,方案很简单:一个/分区,一个 swap 分区。这种模式下 GPT 也能用,但没必要给自己增加复杂度。

近几年的机器基本都是 UEFI 启动,分区表必须用 GPT。此时至少要有三个分区:一个 EFI 系统分区、一个/分区、一个 swap 分区。如果磁盘大,再加一个/home独立分区和/var独立分区,便于重装时保住用户数据。下面给出一个常用的分区方案表:

分区大小类型挂载点
/dev/sda1512MEFI System/boot/efi
/dev/sda220Gext4/
/dev/sda38Gswapswap

这里/给 20G 只适合轻量用途,装桌面和常用开发工具的话建议给到 50G 以上,因为/opt、/usr都会持续膨胀。内存小于等于 8G 的机器,swap 给到内存的 1.5 倍是安全做法;内存 16G 以上的机器反而不用太大,8G 足够,因为现代内核支持 zswap,大 swap 在 SSD 上未必是好事。

3.2 引导安装的关键选项

分区完成后,安装器会问是否安装 GRUB 引导程序到主引导记录或 EFI 分区。这里务必确认你选的是当前要用的磁盘,而不是 U 盘。搞混的后果是拔掉 U 盘后系统无法启动,症状是开机直接进固件设置界面或者显示找不到引导设备。

另一个容易忽略的选项是“安装引导程序的方式”。部分主板在同时存在多个 EFI 分区时会出现识别混乱,如果后续启动不了,不要急着重装,先进固件设置手动指定从debian或EFI项启动。引导问题九成是 NVRAM 里的启动项顺序被其他系统覆盖了,重装解决不了。

3.3 软件包选择:最小化还是整套桌面

安装器走到“软件选择”步骤时会列出桌面环境、打印服务器、SSH Server 等选项。这个选择直接决定装完后的系统大小和可维护性。我的建议:先只勾选 “SSH server” 和 “standard system utilities”,桌面环境后面想用时再用tasksel补装。这样做的理由是基础系统体积小,后续出问题排查面窄,而且桌面环境依赖树庞杂,安装时一鼓作气全装上,出错了很难定位是哪个包引起的。

如果你确实需要桌面,建议只选 XFCE 这类的轻量桌面,而不是默认的 GNOME。GNOME 对硬件要求高,在旧机器上表现不佳,而且很多用户装上后发现登录界面无法选择会话才意识到问题所在。

软件源设置这一步,如果安装时没有联网,会提示无法配置软件源,安装完需要手动改源。如果联网了,默认源在海外,国内下载速度很不稳定,建议安装界面里选用镜像源并选择国内镜像,选择后安装器会重新索引软件包列表。这里先不急着手动改源,装完系统后集中处理。

4. 安装后的系统收敛:源、sudo、SSH 与本地化

4.1 更换 apt 源并处理签名问题

安装完成后第一件事是把/etc/apt/sources.list指到国内镜像。Debian 12 的源文件格式和旧版略有差异,新增了.sources后缀的 deb822 格式文件,位于/etc/apt/sources.list.d/目录下。打开文件:

sudo nano /etc/apt/sources.list

把http://deb.debian.org/debian整体替换成镜像站地址,例如:

deb http://mirrors.example.org/debian bookworm main contrib non-free non-free-firmware deb http://mirrors.example.org/debian-security bookworm-security main contrib non-free non-free-firmware deb http://mirrors.example.org/debian-updates bookworm-updates main contrib non-free non-free-firmware

实际地址替换为你所在地区可达的镜像即可。更换完执行:

sudo apt update

如果报错提示缺少公钥或签名失效,说明旧源和其他源仓库混在一起导致 keyring 冲突。解决方式是把 sources.list 里所有条目清掉只留一个源,再执行:

sudo apt-get install debian-keyring debian-archive-keyring --reinstall

然后重新 update。签名问题在混合使用第三方源时极其常见,Debian 对签名校验比很多发行版都严格,所以不要跳过签名直接加--allow-unauthenticated,那等于放弃了安全边界。

4.2 把用户加进 sudo 并开启 SSH

安装时创建的用户默认不在 sudo 组里,所以很多人第一次执行sudo命令会看到user is not in the sudoers file的提示。解决方式是切换到 root,然后把用户加入 sudo 组:

su - usermod -aG sudo yourusername

如果系统提示 sudo 命令不存在,说明安装时没选基础工具包,要先用 root 装 sudo:

apt install sudo

SSH 方面,安装时如果没有勾选 SSH server,就需要联网安装 openssh-server。这里有一个细节:Debian 默认不允许 root 通过密码直接登录 SSH,安装后我一般会显式修改/etc/ssh/sshd_config里的PermitRootLogin为no,保持默认即可。配置完成后务必执行:

sudo systemctl enable --now ssh sudo systemctl status ssh

status显示active (running)才算成功。如果服务起不来,多半是 22 端口被占用或配置文件语法错误,用ss -tlnp | grep :22查端口占用情况。

4.3 locales 与中文乱码修复

终端里中文显示成方块或乱码,通常是 locales 没生成。Debian 安装时选语言如果选了中文但没指定 UTF-8 编码,就会出现这个现象。重新生成 locale 的方法是:

sudo dpkg-reconfigure locales

在弹出的界面里勾选zh_CN.UTF-8和en_US.UTF-8,默认 locale 建议选英文,避免终端工具在中文环境下出现各种显示问题。如果改了 locale 后某些服务启动报错,检查/etc/default/locale里是否只保留了一个LANG变量,重复定义了会影响一些脚本的运行。

字体问题也会造成乱码外观,但大多数情况先处理 locale 就能解决。判断到底是 locale 问题还是字体问题有一个经验标准:在终端里输入locale,如果LANG显示为zh_CN.UTF-8且没报错,终端依然乱码,那才是字体缺失,安装中文字体包即可。

5. Debian 安装避坑指南:五个常见翻车现场

5.1 现象:安装时提示缺少固件,网卡不工作

安装界面显示找不到网络设备,或者装完进系统后ip link只有lo一个回环接口。原因大概率是非自由固件未包含在默认镜像中,特别是笔记本的无线网卡和部分 USB 有线网卡。解决方法是下载带firmware字样的镜像重装,或者准备一个单独固件 U 盘,安装器检测到时会自动读取。装完系统后发现网卡不识别也能事后补救,把固件文件放到/lib/firmware下再重启网络服务,但要在无网环境下找到对应文件很折腾。

5.2 现象:开机直接进固件设置界面,找不到 Debian 启动项

UEFI 模式下装完系统重启后,主板直接跳过硬盘进入 BIOS 设置。原因是引导程序装到了 U 盘,或者主板启动顺序仍优先 U 盘。先拔掉 U 盘再重启,如果依旧不行,进固件设置找到启动项手动选择debian。若列表里根本没有,用 live 盘启动进入紧急模式,挂载根分区后执行grub-install /dev/sda重新安装引导程序,再update-grub。遇到过多次类似问题,最靠谱的做法是安装时在“GRUB 安装位置”界面多看一眼,确认目标设备是/dev/sda而不是/dev/sdb。

5.3 现象:虚拟机里装好系统重启黑屏

VMware 或 VirtualBox 里装完 Debian,重启后黑屏或花屏,常见原因是显卡驱动不匹配。安装时勾选了桌面环境,虚拟机默认虚拟显卡无法被正确驱动。虚拟机场景下我一般不做桌面安装,只装 base system,然后通过 SSH 管理,界面不是必需。如果确实要桌面,在安装器的引导参数里加nomodeset再试,装完系统后更新驱动往往能解决。

5.4 现象:重启后进不了系统,卡在grub>提示符

出现grub>说明 GRUB 引导程序启动了但找不到内核文件。原因可能是/boot分区独立创建且未被正确识别。进入 GRUB 命令行,手动指定内核路径是临时恢复手段:

grub> set root=(hd0,msdos2) grub> linux /vmlinuz-... root=/dev/sda2 grub> initrd /initrd.img-... grub> boot

能进系统后立即执行update-grub重建配置。要避免这个问题,最直接的办法是安装时不要单独分/boot分区,让内核文件躺在/分区里,降低引导路径的复杂度。对新手而言这几乎是最稳妥的方案。

5.5 现象:装完系统后时间不准,Windows 和 Debian 互相改时间

安装时区域设置选错时区,系统会把硬件时钟按 UTC 解释,和 Windows 共存时就会出现时间对不上。解决方式是timedatectl set-local-rtc 1,让系统把硬件时钟当作本地时间处理。如果只装 Debian,直接在安装时选对时区就行,不需要调整硬件时钟策略。这个问题不致命但很烦,属于典型的“装完第三天才发现”的坑。

6. 另一条路:用 preseed 把 Debian 安装变成自动化

如果你需要经常装机,或者要在多台机器上批量部署,图形化点选安装的效率太低。Debian 提供的 preseed 机制可以在启动时自动应答安装过程中的所有问题,实现无人值守安装。下面是 preseed 文件里最核心的一段:

d-i debian-installer/locale string en_US.UTF-8 d-i time-zone/choose_timezone select Asia/Shanghai d-i netcfg/choose_interface select auto d-i netcfg/get_hostname string debian-node d-i netcfg/get_domain string local d-i partman-auto/method string regular d-i partman-auto/disk string /dev/sda d-i partman-auto/expert_recipe string \ boot-root :: \ 500 1000 1000 ext4 \ $primary{ } $bootable{ } \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext4 } \ mountpoint{ / } \ . \ 100% 100% 1000 linux-swap \ method{ swap } format{ } \ . d-i passwd/user-fullname string admin d-i passwd/username string admin d-i passwd/user-password password yourpassword d-i passwd/user-password-again password yourpassword d-i tasksel/tasksel select standard d-i pkgsel/include string openssh-server sudo d-i grub-installer/only_debian boolean true d-i finish-install/reboot_instead bool true

这段配置的原理是:安装器启动时会读取 preseed 文件,跳过交互界面直接按配置执行。上面几行分别指定了语言、时区、自动分区、创建用户、安装哪些软件包。要使用 preseed,修改 GRUB 启动参数,在linux行末尾加上:

auto=true priority=critical preseed/file=/cdrom/preseed.cfg

如果你只是单纯想尝试,最快的方式是在虚拟机里挂载一个包含 preseed 文件的 ISO,用这个 ISO 引导安装。跑通一次后你会发现整个安装过程十分钟内搞定,完全无人干预。从那以后我每次需要部署新 Debian 环境都会先写一份对应的 preseed 片段,装完系统几乎没有手动的步骤,希望这篇笔记里的准备、安装和避坑细节能帮你在 Debian 上少走几段弯路。

本文还有配套的精品资源,点击获取

相关新闻

顶级AI研究者创业背后:世界模型、自监督学习与十亿美元融资的底层逻辑

顶级AI研究者创业背后:世界模型、自监督学习与十亿美元融资的底层逻辑

最近AI圈被一条消息刷屏:某位在神经网络研究上有几十年积累的学术大佬,自己下场创办了一家新公司,中间特意飞到另一位青年学者的所在地,三次长谈,终于把这位在视觉、多模态方向很有名的研究者拉进团队。公司刚公开亮相…

2026/10/20 9:57:39 阅读更多 →
Debian 12 手动安装避坑指南:磁盘分区、引导与软件源配置

Debian 12 手动安装避坑指南:磁盘分区、引导与软件源配置

简介:「Debian 安装基础教程」是一套面向 Linux 入门者和需要从零搭建 Debian 系统的用户的图文课件。教程按十步流程组织,覆盖安装前准备、启动介质制作、网络设置、磁盘分区、用户与 root 配置、软件包选择、时区语言调整以及安装后的首次系统维护&…

2026/10/20 9:57:39 阅读更多 →
车联网大数据分析平台:Kafka到ClickHouse与ECharts大屏全链路实战

车联网大数据分析平台:Kafka到ClickHouse与ECharts大屏全链路实战

简介:《车联网大数据分析平台概览》是一份面向车联网与大数据可视化方向学习者及前端开发者的可直接运行的HTML展示项目,用于呈现车辆实时状态、轨迹分布与运行指标的综合看板。压缩包共包含19个文件,体积仅1.3MB,以1个HTML入口页…

2026/10/20 9:56:38 阅读更多 →

最新新闻

Ubuntu 24.04用Docker Compose部署Whisper语音识别服务全指南

Ubuntu 24.04用Docker Compose部署Whisper语音识别服务全指南

如果你需要在Ubuntu 24.04上搭一个完全本地的语音识别服务,把录音、播客、会议音频批量转成文本,同时又不想被一堆Python依赖折腾到怀疑人生,那Whisper配合Docker Compose几乎是我目前试过最省心的组合。我最近把整套流程从零跑通&#xff0c…

2026/10/20 14:45:32 阅读更多 →
NLP数据增强实战:EDA、回译与生成式模型解决小样本过拟合

NLP数据增强实战:EDA、回译与生成式模型解决小样本过拟合

一个训练集只有两三千条标注文本的分类项目,模型在验证集上跑出来的准确率始终提不上去,训练loss快到底了验证loss却在往上走——如果你撞上过这种过拟合的墙,大概率已经意识到,真正短板的不是模型结构,而是数据。NLP数…

2026/10/20 14:45:32 阅读更多 →
PatchPae2内核补丁:破解32位Windows 8.1内存4GB限制

PatchPae2内核补丁:破解32位Windows 8.1内存4GB限制

简介:面向32位Windows 8.1用户的物理内存扩展补丁PatchPae2,用于解锁系统默认无法识别的4GB以上内存。其核心是修改系统内核,启用物理地址扩展(PAE)机制,突破原版32位系统约4GB的寻址上限,适合老…

2026/10/20 14:45:32 阅读更多 →
Keras大数据训练:突破内存限制的3种流式数据供给方案

Keras大数据训练:突破内存限制的3种流式数据供给方案

1. 项目概述:当数据大到内存喊“救命”,Keras不是靠堆内存硬扛的你有没有试过加载一个30GB的CSV,或者读取上万张4K分辨率的医学影像切片,刚调用pd.read_csv()或tf.keras.preprocessing.image.load_img(),Python就直接抛…

2026/10/20 14:45:32 阅读更多 →
OctaFuse Gateway 2.13.0 实测:供应商折扣计价、路由快速测试与用量分析升级

OctaFuse Gateway 2.13.0 实测:供应商折扣计价、路由快速测试与用量分析升级

1. 从版本号背后看这次升级的真实分量做供应链系统集成这行的朋友大概都有个共识:网关类中间件的版本迭代,最怕的就是"为了更新而更新"——加一堆花哨的仪表盘,核心计价逻辑却还是老样子。OctaFuse Gateway 2.13.0 这个版本我拿到手…

2026/10/20 14:45:32 阅读更多 →
免部署AI绘画实战指南:从零生成第一张图的完整路径与避坑要点

免部署AI绘画实战指南:从零生成第一张图的完整路径与避坑要点

很多人第一次听说AI绘画,第一个念头可能就是“这东西是不是得配一台特别牛的电脑?”实际上这两年“免部署、即开即用”的AI绘画方案已经非常成熟了,你不用装Python、不用配CUDA、甚至不用下载动辄几个G的模型文件,打开浏览器就能画…

2026/10/20 14:43:57 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →