很多从桌面端或CentOS转过来的运维人员,上手Debian时会把旧习惯带过来,导致生产环境出现各种不易察觉的问题。最典型的就是滥用root账户。Debian默认不开启root的SSH登录,这本是出于安全考虑,但不少人安装完第一件事就是去修改sshd_config把PermitRootLogin设为yes。更稳妥的做法是始终保持root禁止远程登录,通过普通用户sudo提权,并在sudoers里精确配置命令白名单,而不是直接给ALL=(ALL:ALL) ALL。

软件源混用导致依赖地狱

Debian的稳定版(Stable)以保守著称,软件包版本偏旧。很多人为了用上新版软件,会把Ubuntu的PPA源或者其他第三方仓库直接加到sources.list里。短期内软件装上了,但后续系统升级时,glibc、openssl这类底层库版本冲突会直接导致系统更新失败,甚至关键服务无法启动。正确的做法是优先使用Debian官方backports源,它从Testing分支重新编译软件包以适配Stable,安全性远高于野仓库。如果确实需要最新版,应该用容器或虚拟化环境隔离运行,而不是污染宿主系统。

忽视非自由固件的处理

从Debian 12开始,安装镜像已经默认包含了非自由固件,但很多还在维护Debian 11或更早版本的服务器,网卡、RAID卡在安装时检测不到,管理员往往会卡在硬件识别这一步。这不是系统缺陷,而是Debian坚持自由软件理念,默认不加载闭源固件。解决方法是在安装前准备好对应硬件的固件包,或者在安装时提前插入包含固件的U盘。生产环境选购硬件时,建议优先考虑Intel或Broadcom等对开源驱动支持良好的网卡芯片,避开那些需要闭源驱动才能跑满速的消费级硬件。

systemd-resolved与传统resolv.conf的冲突

Debian默认使用systemd-resolved管理DNS解析,但很多运维习惯直接修改/etc/resolv.conf。重启后会发现修改被覆盖,因为该文件现在是/run/systemd/resolve/stub-resolv.conf的符号链接。正确的DNS配置方式是通过修改/etc/systemd/resolved.conf,或者在/etc/systemd/network/下的网络配置文件中指定DNS。如果必须使用静态resolv.conf,需要先移除符号链接再创建实体文件,但这样做会失去DNS缓存和分域解析等特性。生产环境中更推荐使用resolved的split-dns功能,针对不同域走不同DNS服务器。

APT包管理中的自动移除陷阱

执行apt autoremove时,Debian会删除那些当初作为依赖被自动安装、现在已不再需要的包。问题在于,某些关键的内核模块或数据库连接器可能恰好处于这个状态。经常有人在清理旧内核时顺手autoremove,结果把正在运行的内核头文件或正在使用的驱动模块一并删掉,导致下次重启时系统起不来。正确的操作流程是:先执行apt list --installed | grep auto查看自动安装的包,逐项确认后再手动指定要删除的包名,而不是无差别使用autoremove。生产服务器建议在/etc/apt/apt.conf.d/中设置APT::Get::AutomaticRemove "false"来禁用自动移除行为。

错误理解AppArmor而非直接关闭

Debian默认启用AppArmor强制访问控制,很多运维发现服务启动异常时,第一反应是systemctl disable apparmor然后直接关掉。这等于把一套成熟的防护体系直接废弃。实际上,大部分服务异常是因为AppArmor配置文件与自定义路径不匹配。比如把MySQL数据目录改到了/data/mysql,但AppArmor的usr.sbin.mysqld配置只允许/var/lib/mysql。正确做法是通过aa-complain命令先将对应配置设为投诉模式,观察日志中的拒绝记录,再用aa-logprof自动更新配置文件,最后切回强制模式。

systemd服务单元编写不规范

很多人写systemd service文件时只写ExecStart,忽略Restart、RestartSec、StandardOutput等关键指令。生产环境的服务单元必须明确指定重启策略,Restart=on-failure是基本要求,对于守护进程类服务建议加上RestartSec=5s防止失败后立即重试造成日志风暴。另外,日志输出默认进入journald,如果不设置StandardOutput=journal+console,某些需要标准输出做日志收集的场景会丢数据。还有一点容易被忽略:服务类型默认是simple,但很多传统脚本fork出子进程后父进程退出,此时必须设置Type=forking并配合PIDFile,否则systemd会误判服务状态。

忽视unattended-upgrades的精细化配置

Debian的无人值守升级功能很强大,但默认配置只安装安全更新。很多运维要么完全不开,要么开了之后不管。正确的做法是修改/etc/apt/apt.conf.d/50unattended-upgrades,配置只自动安装安全更新而不碰其他更新,同时设置邮件通知,让每次自动升级后发送变更列表到管理员邮箱。对于数据库、内核这类关键包,应该在配置中明确加入黑名单,防止自动升级导致服务中断。内核更新后不重启等于没更新,可以配合needrestart工具检测哪些服务需要重启,并设置定期维护窗口手动处理。

日志管理只依赖journald持久化

Debian默认的journald日志存储在/run/log/journal下,重启即丢失。生产环境必须开启持久化,创建/var/log/journal目录并设置Storage=persistent。但光持久化还不够,journald默认的日志保留策略是按文件大小的10%做上限,对于日志量大的服务器,几天前的日志可能就被轮转掉了。需要根据磁盘容量合理设置SystemMaxUse和SystemKeepFree参数。另外,journald的二进制日志格式不适合长期归档和集中分析,建议通过rsyslog或vector等工具将日志同时转发到集中式日志平台。

网络配置在多个地方互相覆盖

Debian的网络配置可以出现在/etc/network/interfaces、/etc/systemd/network/以及NetworkManager等多个位置。新手常遇到的问题是在interfaces里配了静态IP,重启后被DHCP覆盖,因为NetworkManager也在管理同一块网卡。生产服务器建议统一使用一种网络管理方式:云环境或桌面端用NetworkManager,物理服务器用systemd-networkd,传统环境用ifupdown。无论选哪种,都要确保其他网络管理服务处于禁用状态,避免互相抢网卡控制权。

时间同步只依赖systemd-timesyncd

Debian默认使用systemd-timesyncd做时间同步,它是一个SNTP客户端,只从单个时间源获取时间,且不具备平滑调整时钟的能力。对于数据库集群、分布式存储这类对时间敏感的生产系统,应该替换为chrony或ntpd。chrony特别适合网络不稳定或虚拟机环境,它调整时钟更平滑,能有效避免时间跳变导致数据库事务乱序。安装chrony后记得mask掉systemd-timesyncd,防止两个时间同步服务同时运行。

内核参数调优时直接修改/proc

用echo命令直接往/proc/sys/下写参数,重启就失效,这是最常见的临时操作变永久隐患。正确的持久化方式是将参数写入/etc/sysctl.d/下的配置文件,文件名建议以数字开头控制加载顺序。比如99-custom.conf会在最后加载,覆盖前面的默认值。执行sysctl -p后立即生效且重启保留。生产环境常见的内核调优包括:vm.swappiness对于数据库服务器建议设为1而非0,net.core.somaxconn和net.ipv4.tcp_max_syn_backlog需要根据并发量调大,fs.file-max在大量文件处理场景下需要显著提高。

备份策略忽略包列表和分区布局

很多人备份只关注数据目录和配置文件,却忽略了系统包列表和磁盘分区布局。灾难恢复时,即便数据完整,重新搭建一套完全相同的环境也耗时巨大。Debian下可以用dpkg --get-selections > package.list导出已安装包列表,用sfdisk -d或parted的脚本模式导出分区表。这两份文件加上/etc目录的备份,配合自动化部署脚本,能在全新硬件上快速重建生产环境。建议将这些元数据备份纳入日常备份流程,存放在数据备份之外的安全位置。

安全更新只看CVE编号不看Debian安全公告

Debian的安全团队会对上游漏洞进行评估,标记为DSA(Debian Security Advisory)的才是官方确认影响Stable版本的漏洞。有些CVE在Debian环境下实际不可利用,因为编译选项或默认配置已经缓解了攻击面。反过来,有些Debian特有的包配置问题不会出现在CVE数据库中。因此,订阅debian-security-announce邮件列表,关注DSA公告,比单纯扫描CVE编号更贴合实际风险。安全更新的优先级应该以DSA为准。

过度精简系统导致排查工具缺失

为了减小攻击面或镜像体积,有人在安装时选择极致精简,甚至把curl、lsof、strace、tcpdump这些基础排障工具都省掉了。生产环境出问题时,连下载诊断脚本、查看进程打开的文件、抓包分析都做不到,只能重装系统。建议至少保留一套最小排障工具集,或者准备好一个包含常用工具的静态编译二进制包,在需要时能快速部署到受损系统上。Debian的debootstrap构建环境时可以选择--include参数预装必要工具。