如何在没有 grub 配置提示的情况下 apt-get -y dist-upgrade?

fra*_*rik 68 apt grub2 amazon-ec2

Per Make apt-get (or aptitude) run with -y 但不提示替换配置文件?

我做了以下事情:

ec2run ami-3c994355 --region us-east-1 -n 1 -t m1.large -z us-east-1d
Run Code Online (Sandbox Code Playgroud)

在机器上:

sudo apt-get update
sudo apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
Run Code Online (Sandbox Code Playgroud)

我仍然收到提示,询问我想使用哪个配置文件。这些是出现在提示之前的行:

Setting up grub-pc (1.99-21ubuntu3.1) ...
Run Code Online (Sandbox Code Playgroud)

然后:

                         ????????????????????????????????????????????????????????? Configuring grub-pc ?????????????????????????????????????????????????????????                              
                         ? A new version of configuration file /etc/default/grub is available, but the version installed currently has been locally modified.  ?                              
                         ?                                                                                                                                     ?                              
                         ? What do you want to do about modified configuration file grub?                                                                      ?                              
                         ?                                                                                                                                     ?                              
                         ?                                     install the package maintainer's version                                                        ?                              
Run Code Online (Sandbox Code Playgroud)

RAO*_*AOF 104

/etc/default/grub文件在软件包安装时生成,这是必需的,因为它与 debconf 集成。这意味着它不能被视为 dpkg conf 文件,因此 dpkg 的配置文件处理不知道它。

相反,它使用ucf,一种更复杂的 Debian 工具来处理配置。不幸的是,这不理解 dpkg 选项,因此设置Dpkg::Options::="--force-confdef"无济于事。不过,它确实有自己的方式进行无提示升级,通过UCF_FORCE_CONFFNEWUCF_FORCE_CONFFOLD环境变量。

ucf用途debconf用于提示,所以设置debconf界面noninteractive也会沉默消息。如果你真的想要非交互式更新,你无论如何都需要这样做 - 任意包可能会询问 debconf 问题(尽管它们通常不会在升级期间)。

您可以通过添加DEBIAN_FRONTEND=noninteractive到您的环境中将 debconf 界面设置为一次性界面,或者可以通过运行dpkg-reconfigure debconf和选择非交互式前端来永久设置它。如果您使用的是非交互式前端,您将获得软件包可能提出的任何问题的默认答案。

对于ucf,默认答案是“保留现有文件”。

因此,执行真正的 100% 保证¹ 无提示更新的完整命令是。

sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
Run Code Online (Sandbox Code Playgroud)

¹:从技术上讲,软件包可以使用除 debconf 之外的其他提示方法,但这违反 Debian 政策。如果您遇到这样的包,请提交错误。

  • 请注意,如果您在 shell 上进行测试,则 sudo 命令似乎删除了 DEBIAN_FRONTEND 变量,即您需要 sudo DEBIAN_FRONTEND=noninteractive apt-get -y dist-upgrade 而 DEBIAN_FRONTEND=noninteractive sudo apt-get -y dist-upgrade 将失败 (9认同)

met*_*ral 21

离开 RAOF 的答案,在花了无数个小时在网上搜索以便能够在 Ubuntu 12.04 上执行完全不干涉的更新和 dist-upgrade 之后,我想出了这个,这要归功于这篇文章(https://bugs) .launchpad.net/ubuntu/+source/grub/+bug/239674/comments/1 ) 指出当您想使用包维护者 grub menu.lst 而不是任何可能的本地菜单时,grub 遵循 UCF 而不是 Dpkg 选项.lst 编辑。

我将 Dpkg force-confnew 选项留在了其他不是 grub 的软件包中。

#!/bin/bash

unset UCF_FORCE_CONFFOLD
export UCF_FORCE_CONFFNEW=YES
ucf --purge /boot/grub/menu.lst

export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get -o Dpkg::Options::="--force-confnew" --force-yes -fuy dist-upgrade
Run Code Online (Sandbox Code Playgroud)

  • 假设您也在使用“无人值守升级”并编辑了一些 grub 配置:如何在该上下文中设置“UCF_FORCE_CONFFNEW”?或者您需要将 grub 列入黑名单以防止更新吗? (2认同)