第 5 章 buster 中需要注意的问题

目录

5.1. 升级到 buster 时可能出现的问题
5.1.1. Procfs 不再支持 hidepid 挂载选项
5.1.2. ypbind 在使用 -no-dbus 时无法启动
5.1.3. NIS server does not answer NIS client requests by default
5.1.4. sshd 认证失败
5.1.5. 守护进程启动失败或系统表现为在启动时挂起
5.1.6. 从旧有网络接口名称进行迁移
5.1.7. Bonding 和 dummy 网络接口的模块配置
5.1.8. OpenSSL 默认版本和安全等级有所提高
5.1.9. 某些应用程序在 Wayland 下的 GNOME 中无法工作
5.1.10. WebKit2GTK(最初)需要 SSE2 支持
5.1.11. 值得注意的过时软件包
5.1.12. buster 的废弃组件
5.1.13. 升级后在重启前需要做的事
5.1.14. SysV init 相关的软件包不再标记为必须安装
5.2. 安全支持上的局限性
5.2.1. 网页浏览器及其渲染引擎的安全支持状态
5.2.2. 基于 Go 的软件包
5.3. 特定软件包的问题
5.3.1. Glibc 需要 Linux 内核 3.2 或更高版本
5.3.2. su 工具使用环境变量的语义发生改变
5.3.3. 已有的 PostgreSQL 数据库需要被重新索引
5.3.4. mutt 和 neomutt
5.3.5. 不使用鼠标来访问 GNOME 设置程序
5.3.6. gnome-disk-utility fails to change LUKS password causing permanent data loss (buster 10.0 only)
5.3.7. evolution-ews 已被废弃,使用 Exchange、Office 365 和 Outlook 服务器的收件箱将被删除
5.3.8. Calamares 安装程序使得磁盘加密密钥可读
5.3.9. S3QL URL changes for Amazon S3 buckets
5.3.10. Split in configuration for logrotate
5.3.11. The rescue boot option is unusable without a root password

有时,新发行版本引入的变化会产生一些我们无法有效避免的副作用,或者是会导致系统在其它地方暴露问题。我们在此记述了一些我们所知道的问题。请同时参阅勘误表,相关软件包之说明文件,错误报告及其它在第 6.1 节 “扩展阅读”中所提及的信息。

5.1. 升级到 buster 时可能出现的问题

本节介绍从 stretch 升级到 buster 的相关问题。

5.1.1. Procfs 不再支持 hidepid 挂载选项

用于 /prochidepid 挂载选项已知和当前版本的 systemd 共同使用时会出现问题,且 systemd 上游将其视为不支持的配置项。已经修改 /etc/fstab 而启用这些选项的用户应当在升级之前将其禁用,以确保能在 buster 上正确登录会话。(维基的加固页面上简要介绍了重新启用该选项的可能途径。)

5.1.2. ypbind 在使用 -no-dbus 时无法启动

ypbind 的默认选项已经改变。然而,如果您修改过旧有的默认配置文件,升级将不会自动更新配置信息;您需要确保 /etc/default/nis 中的 YPBINDARGS= 选项不包含 -no-dbus。如果使用了 -no-dbusypbind 将启动失败,您可能无法登录系统。如需了解详细信息,请参阅 bug #906436

5.1.3. NIS server does not answer NIS client requests by default

The default behavior of rpcbind has changed to no longer answer remote calls from NIS clients. On NIS servers you will need to add the (Debian-specific) -r flag to the command line options of rpcbind, otherwise users will not be able to log into your NIS client machines. For more info see bug #935492.

5.1.4. sshd 认证失败

sshd 软件包的 PubkeyAcceptedKeyTypes 和类似的 HostbasedAcceptedKeyTypes 选项的语义有所变化。它们现在用于指定相应的验证机制的可接受的签名算法,而以前则用于指定可接受的密钥类型。这个区别在使用 RSA/SHA2 签名算法,如 rsa-sha2-256rsa-sha2-512 和它们对应的证书时将体现出来。如果手工指定了这些选项但省略了算法名称则可能导致意料之外的验证失败。

如果使用默认选项,则无需特别调整配置。

5.1.5. 守护进程启动失败或系统表现为在启动时挂起

systemd 在系统启动时需要熵信息,且内核在可用熵较少时会阻塞相应的调用,所以系统启动时可能挂起数分钟至数小时,直至随机子系统充分得到初始化(random: crng init done)。对于支持 RDRAND 指令的 amd64 系统,Debian 的内核已可以避免这个问题,因为内核默认将尝试使用该指令(CONFIG_RANDOM_TRUST_CPU)。

amd64 架构的系统和某些虚拟机可能需要从其它来源获取熵以保证快速启动。Debian 安装程序内部选择了 haveged 作为替代方案,在硬件熵不可用时,这可能是个可以使用的解决方案。在虚拟机上,请考虑经由 virtio_rng 将主机的熵转发至虚拟机中。

如果您在阅读本篇文档之前已将远程的系统升级至 buster,请考虑经由网络持续 ping 远程系统,这样做可以向系统的随机池中添加熵,并最终使得系统可以重新通过 ssh 登录。

请参见维基以及 DLange 对此问题的简述以了解其它解决方法。

5.1.6. 从旧有网络接口名称进行迁移

如果您的系统是从先前版本升级来的,且仍然使用旧式的,已经在 stretch 中弃用的网络接口名称(比如 eth0wlan0),您应当了解到 buster 中的 udev 官方已不再支持通过 /etc/udev/rules.d/70-persistent-net.rules 定义它们的名称(虽然某些情况下仍可工作)。为了避免升级到 buster 后网络连接失效的风险,建议您事先迁移到新的命名方案(通常为类似 enp0s1wlp2s5 的名字,包含了 PCI 总线和插槽编号)。注意更新任何硬编码到防火墙或 ifupdown 等工具的配置文件中的接口名称。

The alternative is to switch to a supported mechanism for enforcing the old naming scheme, such as a systemd .link file (see systemd.link(5)). The net.ifnames=0 kernel commandline option might also work for systems with only one network interface (of a given type).

要得到将被使用的新式接口名称,首先要得到相关接口的当前名称:

$ echo /sys/class/net/[ew]*
    

对这些名称中的每一个,检查它是否在配置文件中被使用,以及它在 udev 中的名称:

$ sudo rgrep -w eth0 /etc
$ udevadm test-builtin net_id /sys/class/net/eth0 2>/dev/null
    

This should give enough information to devise a migration plan. (If the udevadm output includes an onboard or slot name, that takes priority; MAC-based names are normally treated as a fallback, but may be needed for USB network hardware.)

一旦您准备好开始迁移,请重命名 70-persistent-net.rules 或注释掉其中单独的行,以禁用该文件。在虚拟机上您还需要删除 /etc/systemd/network/99-default.link 以及(如果您使用 virtio 网络设备)/etc/systemd/network/50-virtio-kernel-names.link。然后重新构建 initrd

$ sudo update-initramfs -u
    

然后重启。您的系统此时应当已改为使用新格式的网络接口名称。请调整遗留的配置文件信息并测试您的系统。

See the wiki, upstream documentation, and the udev README.Debian for further information.

5.1.7. Bonding 和 dummy 网络接口的模块配置

使用 binding 和/或 dummy 接口的系统,例如作为路由器配置的机器,在升级到 buster 时可能遇到问题。新版 systemd 在系统中安装了 /lib/modprobe.d/systemd.conf 文件(目的是简化 systemd-networkd 的配置),其中包含了以下的配置行

 options bonding max_bonds=0
 options dummy numdummies=0
    

需要更改配置的系统管理员需要确保自定义的配置优先级高于系统默认配置。/etc/modprobe.d 目录下的文件会覆盖掉 /lib/modprobe.d 目录下相同名称的文件,但各个文件以字母顺序处理,所以 /lib/modprobe.d/systemd.conf 会在 /etc/modprobe.d/dummy.conf 之后被解析并覆盖掉后者。请确保本地配置文件名在字母排序上位于 systemd.conf 之后,例如 /etc/modprobe.d/zz-local.conf

5.1.8. OpenSSL 默认版本和安全等级有所提高

遵照多份不同的安全建议,默认的 TLS 最低版本要求从 TLSv1 提升到了 TLSv1.2。

默认的 TLS 连接安全级别也从 level 1 提高到了 level 2。这一改变将 80 位的安全级别提升到了 112 位,并将需要 2048 位或更长的 RSA 和 DHE 密钥,224 位或更长的 ECC 密钥,和 SHA-2。

这个系统级设定可以在 /etc/ssl/openssl.cnf 中修改。应用程序也可以用特定的方式覆盖默认值。

默认的 /etc/ssl/openssl.cnf 中包括 MinProtocolCipherString 行。通过 CipherString 也可以设定安全级别。关于安全级别的信息可以在 SSL_CTX_set_security_level(3ssl) 手册页中找到。最低协议版本的有效值的列表可以在 SSL_CONF_cmd(3ssl) 中找到。其他信息可以在 ciphers(1ssl)config(5ssl) 中找到。

要将 /etc/ssl/openssl.cnf 中的系统级默认值改回以前的值,可以设置:

        MinProtocol = None
        CipherString = DEFAULT
      

如果默认值引起了问题,建议您和远程网站联系。

5.1.9. 某些应用程序在 Wayland 下的 GNOME 中无法工作

Buster 中的 GNOME 已经将默认的显示服务器从 Xorg 改为了 Wayland(参见 第 2.2.11 节 “GNOME 默认使用 Wayland”)。有些应用程序,包括流行的软件包管理器 synaptic,默认的简体中文输入法 fcitx,以及大多数屏幕录制软件还不能在 Wayland 上正常工作。如需使用这些软件,用户需要使用 GNOME on Xorg 会话登录。

5.1.10. WebKit2GTK(最初)需要 SSE2 支持

因上游代码有所修改,webkit2gtk 在构建时启用了 SSE2 支持。Debian 中对这个问题的修复来不及整合进 buster 最初发布的版本。这意味着 CPU 不提供 SSE2 支持的系统(旧系统或嵌入式处理器,如奔腾 III 或 Geode)无法运行使用了 libwebkit2gtk-* 的软件(例如,lifereazenity)这些程序会崩溃,同时大多会给出类似非法指令的错误消息。

预期 Buster 中 webkit2gtk 软件包后续的更新会恢复对这些系统的支持,可能是经由稳定版小版本更新或是安全更新。使用现代桌面环境和受影响的 CPU 的用户应当在此之后升级系统。另外,buster-backports 仓库稍后也会开始提供更新的软件包,所以备选的另一方式是从该仓库安装新版的软件包。

5.1.11. 值得注意的过时软件包

以下是已知的和值得注意的过时软件包的列表(有关过时软件包的描述,请参阅第 4.8 节 “过时的软件包”)。

过时的软件包包括:

  • mcelog 软件包无法与大于 4.12 版本的内核共同工作。rasdaemon 可以作为其替代品。

  • revelation 软件包用于存储密码,它未包含于 buster。keepass2 可以导入之前从 revelation 导出的 XML 密码文件。请确保在升级前从 revelation 导出数据,以避免无法访问您的密码。

  • phpmyadmin 软件包未包含于 buster。

  • ipsec-toolsracoon 已在 buster 中被移除,因为它们的源码已经不能适应新的威胁。

    我们推荐用户迁移到 libreswan,它有更广泛的协议兼容性,且上游仍在积极维护。

    libreswan 应当在通讯协议上是完全兼容的,因为它支持的协议是 racoon 的超集。

  • 简单的邮件传输代理 ssmtp 在 buster 中被删除,因为它目前不验证 TLS 证书;参见 bug #662960

  • ecryptfs-utils 不包含于 buster,因为它存在一个未修复的严重 bug(#765854)。截至写这段文字时,除了不升级以外,还没有针对 eCryptfs 用户的明确建议。

5.1.12. buster 的废弃组件

随着下一个版本 Debian 11(代号为 Bullseye)的发布,某些功能将被弃用。用户需要迁移到其他替代方案,以防止在更新到 Debian 11 时出现问题。

这包括以下特性:

  • Python 2 上游会在2020年1月1日停止对其的支持。Debian 希望在 Debian 11 中移除 python-2.7。如果用户有依赖 python 工具的程序,用户为迁移至 python3 做出准备。

  • Icinga 1.x 自 2018-12-31 起已处于 EOL 状态;虽然 icinga 软件包仍然存在,用户应当在 buster 的支持周期中迁移到 Icinga 2(icinga2 软件包)以及 Icinga Web 2(icingaweb2 软件包)。icinga2-classicui 软件包仍然存在,以支持在 Icinga 2 中使用 Icinga 1.x 的 CGI web 接口,但该支持将在 Icinga 2.11 中被移除。应当转而使用 Icinga Web 2。

  • Mailman 邮件列表管理器套件的版本 3 在该发布版中可用。Mailman 已经被分割成了不同组件;核心组件在软件包 mailman3 中,完整的套装可以通过 mailman3-full 元软件包获得。

    旧版的 Mailman 2.1 在该发布版中仍然以软件包 mailman 的形式提供,所以您可以在现有安装中按您自己的计划迁移。Mailman 2.1 软件包在可预见的未来仍然可以正常工作,但不会有任何的重大更新或改进。它将在 Mailman 上游停止支持该分支后的第一个 Debian 发布版本中被移除。

    建议所有人尽快升级到 Mailman 3,这是更现代的一个发布版本,其开发也处于活跃状态。

  • 软件包 spf-milter-pythondkim-milter-python 上游的开发不再活跃,但它们的功能更丰富的替代品,pyspf-milterdkimpy-milter,在 buster 中可用。用户应当在旧的软件包从 bullseye 中被移除之前迁移到新的软件包。

5.1.13. 升级后在重启前需要做的事

apt full-upgrade 完成时,形式上的升级就完成了。对于向 buster 的升级而言,重启前没有什么特别的操作需要完成。

5.1.14. SysV init 相关的软件包不再标记为必须安装

[注意]注意

如果您决定继续使用 sysvinit-core,本节内容对您不适用。

在 Jessie 将默认初始化系统切换至 systemd,以及 Stretch 的进一步优化之后,系统应当已经不再需要安装 SysV 相关的软件包。您可以使用如下命令安全地进行卸载和清除

apt purge initscripts sysv-rc insserv startpar

5.2. 安全支持上的局限性

有一些软件包,Debian 不能保证针对安全漏洞提供最小的向后移植。这些将在以下小节中介绍。

[注意]注意

debian-security-support 软件包可帮助跟踪已安装软件包的安全支持状态。

5.2.1. 网页浏览器及其渲染引擎的安全支持状态

Debian 10 包含几个浏览器引擎,长期以来安全漏洞断续发生。高比例的漏洞,加上上游对长期分支支持不力,使得向后移植这些浏览器的安全补丁非常困难。此外,库的相互依赖性使得无法更新到较新的上游版本。因此,构建在(包括但不限于)webkit 和 khtml 引擎[6]上的浏览器在 buster 中有包含,但不提供安全支持。这些浏览器不应用于不受信任的网站。webkit2gtk 源软件包提供安全支持。

对于通用网页浏览器,我们推荐 Firefox 和 Chromium。这些软件将使用最新的 ESR 版本持续在 stable 中予以更新。这同样适用于 Thunderbird。

5.2.2. 基于 Go 的软件包

Debian 基础架构目前不能很好地支持大规模地重新编译静态链接到其他包的一部分的软件包。在 buster 之前,这在实践中不是一个问题,但随着 Go 生态系统的增长,这意味着直到基础架构改进到能够管理它们之前,基于 Go 的软件包将不提供常规安全支持。

如果更新被批准,它们只能通过常规的小版本升级提供,可能推送会比较慢。

5.3. 特定软件包的问题

在大多数情况下,软件包应会在 stretch 和 buster 之间平滑升级。在升级之前或期间,有少数包可能需要进行手动干预;下面会对每个包的情况进行阐述。

5.3.1. Glibc 需要 Linux 内核 3.2 或更高版本

glibc 2.26 开始,它依赖于 Linux 内核 3.2 或更新版本。为避免破坏您的系统,libc6 软件包的 preinst 脚本会进行安装时检查。如果检查失败,软件包安装将中止,升级也无法完成。如果系统正运行在小于 3.2 版本的内核之上,请在升级发行版之前升级内核。

5.3.2. su 工具使用环境变量的语义发生改变

su 在 buster 中修改了语义并不再保留用户环境变量 DISPLAYXAUTHORITY。如果您需要使用 su 运行图形应用程序,您需要显式对其进行设置以允许其访问显示器。请阅读 bug #905409 以了解详细的讨论内容。

5.3.3. 已有的 PostgreSQL 数据库需要被重新索引

在从 stretch 升级到 buster 时,glibc 的 locale 数据得到了更新。特别地,这些修改会导致 PostgreSQL 对文本索引排序时的行为发生改变。为避免数据库损坏,已有的索引需要在升级了 localeslocales-all 软件包之后、将已有数据库上线之前立刻进行重新索引(REINDEX)。

建议的命令:

sudo -u postgres reindexdb --all

一个替代方案是,使用 pg_upgradecluster 将数据库升级到 PostgreSQL 11。(该命令默认使用 pg_dump,这将重建所有的索引。使用 -m upgrade 或者 pg_upgrade安全的,因为这将保留索引顺序,而该顺序将变为错误的。)

如需了解更多信息,请参见 PostgreSQL 维基

5.3.4. mutt 和 neomutt

在 stretch 中,mutt 软件包使用了来自 https://neomutt.org 的补丁。从 buster 开始,提供 /usr/bin/mutt 的软件包将会基于原始的来自 http://www.mutt.org 的源代码,而由一个单独的 neomutt 软件包提供 /usr/bin/neomutt

这意味着原先由 mutt 所提供的某些功能将不再可用。如果这样的行为破坏了您的配置,您可以转而安装 neomutt 进行替代。

5.3.5. 不使用鼠标来访问 GNOME 设置程序

如果没有指针设备,用户不能直接改变 gnome-control-center 提供的 GNOME 设置的配置。备用方案是按下右方向键两次以从侧边栏导航至主内容。如需回到侧边栏,您可以使用 Ctrl+F 的键位组合启动搜索,随便输入一些内容,然后按下 Esc 键取消搜索。这时,您可以使用上方向键下方向键在侧边栏中导航。使用键盘无法选中搜索结果。

5.3.6.  gnome-disk-utility fails to change LUKS password causing permanent data loss (buster 10.0 only)

Users of the initial buster release images should not change the LUKS password of encrypted disks with the GNOME graphical interface for disk management. The gnome-disk-utility package in buster had a very nasty bug (#928893) when used to change the LUKS password: it deleted the old password but failed to correctly set the new one, making all data on the disk inaccessible. This has been fixed in the first point release.

5.3.7.  evolution-ews 已被废弃,使用 Exchange、Office 365 和 Outlook 服务器的收件箱将被删除

使用 evolution 邮件客户端,并使用 evolution-ews 连接到 Exchange、Office 365 或 Outlook 服务器的用户,不应当在没有提前备份数据并寻找替代解决方案的情况下升级到 Buster,因为 evolution-ews 由于 bug (#926712) 的缘故已经被废弃,使用这些服务器的收件箱、日历、联系人列表和任务将会被删除并无法通过 Evolution 访问。

The evolution-ews package has been reintroduced via buster-backports. Users upgrading from stretch to buster can enable buster-backports after the upgrade and then they will be able to reinstall evolution-ews.

5.3.8.  Calamares 安装程序使得磁盘加密密钥可读

当使用 Calamares 安装程序(第 2.2.13 节 “来自 Debian Live 团队的新闻”)从 Live 介质安装 Debian,并选择全盘加密功能时,磁盘的解密密钥会被保存在所有用户可读的 initramfs 中。这将允许具有本地文件系统访问权限的用户读取私钥,并在将来再次访问文件系统。

可以添加 UMASK=0077/etc/initramfs-tools/conf.d/initramfs-permissions 文件,并运行update-initramfs -u 以暂时解决该问题。这将重建一个普通用户没有读权限的 initramfs。

对安装程序的修复工作正在进行中(参见 bug #931373),并将被上传到 debian-security。这段时间内使用全盘加密的用户应当使用上述的临时解决方案。

5.3.9.  S3QL URL changes for Amazon S3 buckets

When using s3ql with Amazon S3 buckets, the configuration needs updating for a change in the URL. The new format is:

s3://<region>/<bucket>/<prefix>

5.3.10.  Split in configuration for logrotate

The shipped configurations for /var/log/btmp and /var/log/wtmp have been split from the main configuration file (/etc/logrotate.conf) into separate standalone files (/etc/logrotate.d/btmp and /etc/logrotate.d/wtmp).

If you have modified /etc/logrotate.conf in this regard, make sure to re-adjust the two new files to your needs and drop any references to (b|w)tmp from the main file, since duplicate definitions can cause errors.

5.3.11.  The rescue boot option is unusable without a root password

With the implementation of sulogin now used, booting with the rescue option always requires the root password. If one has not been set, this makes the rescue mode effectively unusable. However it is still possible to boot using the kernel parameter init=/sbin/sulogin --force

To configure systemd to do the equivalent of this whenever it boots into rescue mode (also known as single mode: see systemd(1)), run sudo systemctl edit rescue.service and create a file saying just:

[Service]
Environment=SYSTEMD_SULOGIN_FORCE=1
    

It might also (or instead) be useful to do this for the emergency.service unit, which is started automatically in the case of certain errors (see systemd.special(7)), or if emergency is added to the kernel command line (e.g. if the system can't be recovered by using the rescue mode).

For background and a discussion on the security implications see #802211.



[6] 这些引擎在多个不同的源软件包中提供,该问题适用于提供这些引擎的所有包。该问题也适用于此处未明确提及的网页渲染引擎,但 webkit2gtk 除外。