换用 FIPS 内核后 Wi-Fi 与 VPN 模块一起消失
开启 fips-updates 会启动一个从未编译进无线或隧道模块的认证内核。在重装任何东西之前,先检查内核。
开启 fips-updates 并重启后,机器回来时没有无线接口,VPN 客户端也因为缺少内核模块而拒绝启动。按通常的软件包含义,什么都没有被卸载,所以重装客户端毫无作用。机器运行的内核,从来不是为它的驱动编译的。两个症状,一个原因,而这个原因用一条命令就能看到。
重启究竟切换了什么
Ubuntu Pro 的 FIPS 更新会安装一个认证内核变体,并把它设为默认启动项。那个变体是真正的内核:它能启动、能运行,也会拉起你原有的服务。它不包含的,是为通用内核编译的每一个模块,包括在源码树外编译的无线驱动,以及通过 DKMS 交付的隧道模块。驱动集合跟着内核走,而不是跟着包管理器走。所以硬件还在,与它对话的软件却不在。
在打开任何网络设置之前,先把正在运行的内核与已安装的软件包做对比。版本字符串里带着通用内核没有的标记,仅这一处细节就解释了两块缺失。
也要读一下启动项,因为机器可能装了认证内核却没有在跑它。那种情况下模块的来龙去脉完全不同,你准备重装的端口和驱动都没问题。
先看模块状态,再看客户端配置
找不到的模块,和存在却拒绝加载的模块,是两种不同的故障,修法也不同。modinfo 会告诉你属于哪一种,lsmod 会告诉你此刻加载了什么。在碰 VPN 客户端配置之前,两件事都要做,因为客户端自己的报错很少能把它们分开。
无线这边也需要同样的区分。从不出现的接口指向驱动,而存在却被阻止的接口指向 rfkill 或网络管理器。两者在桌面小程序里看起来一模一样,底下却没有任何共同之处。
趁故障还能复现,就在机器本身上做检查。从另一台主机粘贴来的输出不能替代它。
uname -r
pro status --all | grep -E 'fips|kernel'
modinfo wireguard 2>&1 | head -3
rfkill list当 modinfo 完全找不到模块时,重装用户空间软件包没有用,因为用户空间从来不是缺失的那部分。这个观察能省下一小时的折腾,并直接指向内核。
按能留下内核的顺序回退
如果是误开的 FIPS,文档给出的恢复路径会先禁用服务、清除它的软件包,然后恢复通用内核。这个顺序不是为了好看。当找不到另一个 Ubuntu 内核时,清除会拒绝继续,因为删掉唯一的一个会留下无法启动的机器。这道检查就是回退与重装系统的分界线。通用内核已经被删掉时这套流程会失败,原因也在这里。
趁通用内核还在,执行它,接受关于删除内核的警告,然后重启。之后确认已安装状态里没有残留任何 FIPS 软件包,并且正在运行的就是你预期的内核。
在远程主机上,先安排好控制台或带外访问。通过 SSH 删内核没问题,直到那次不再回来的重启。
dpkg -l | grep -E 'linux-image|fips'
sudo pro disable fips-updates --purge
sudo apt install --reinstall linux-generic
sudo reboot当认证本身是硬要求
认证是合同性质的时候,回退就是错误的一步,因为机器会离开审计所描述的配置。这种情况下,驱动缺口是硬件选型问题:挑一个驱动随认证内核提供的无线网卡,接受只能有线的机器,或者把隧道挪到认证内核已经支持的组件上。
把树外模块编进认证内核并不是中立的绕法。它改变了内核执行的内容,而这正是认证所描述的性质。
把决定连同负责人姓名一起记下来,因为只求 Wi-Fi 能用的那个请求过几个月还会回来,而且上下文更少。现在写一笔,之后就不用再吵一遍。
改动之后按层检查协议栈
回退或换硬件之后,从下往上查,而不是从 VPN 客户端往下查。接口要在,链路要通,解析器要能用,然后隧道才有意义。每一层都有自己的报错,按顺序读下来,诊断才诚实。
上次启动残留的 DNS 状态是常见的假阳性,所以在断定隧道坏了之前,先读解析器。
nmcli device status
ip -brief link
resolvectl status | head -12
systemctl --failed内核回来之后隧道还是不通,就去读失败的那个阶段,别读客户端的总结行。没加载的模块、对端拒绝的证书、服务器拒绝的凭据,是三件不同的事,重启不会替你分辨。把阶段名字写进工单,下一位工程师就从你停下的地方开始。