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


63

Per Make apt-get(或aptitude)与-y一起运行,但不提示替换配置文件吗?

我做了以下工作:

ec2run ami-3c994355 --region us-east-1 -n 1 -t m1.large -z us-east-1d

在机器上:

sudo apt-get update
sudo apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade

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

Setting up grub-pc (1.99-21ubuntu3.1) ...

然后:

                         ┌───────────────────────────────────────────────────────┤ 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                                                        │                              

无法令人满意的解决方法:echo grub-pc hold | sudo dpkg --set-selections在第一个apt-get命令之前
fratrik 2012年

我遇到了同样的问题,并尝试了Dpkg :: Options :: =的许多不同排列/拼写,但没有一个起作用。我还尝试按照指示将这些行添加到/etc/apt/apt.conf.d/local文件中,但它们也不起作用。这似乎是Precise中的回归。
Scott Ritchie 2012年

+1-感谢您的提问-很容易找到此线程来解决这个烦人的问题
cwd 2012年

Answers:


94

/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

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


8
请注意,如果在外壳上进行测试,则sudo命令似乎删除了DEBIAN_FRONTEND变量,即,您需要sudo DEBIAN_FRONTEND = noninteractive apt-get -y dist-upgrade而DEBIAN_FRONTEND = noninteractive sudo apt-get -y dist-upgrade将失败
Scott Ritchie

谢谢您为我工作得很好
cwd

还要注意,这被认为是一个错误,他们正在发布不存在此问题的新AMI图像:bugs.launchpad.net/ubuntu/+bug/1009294
Scott Ritchie

现在,新的AMI也已发布。
Scott Ritchie 2012年

@ScottRitchie-您的评论也有助于自动安装ganglia-webfrontend软件包。它会提示您要求重新启动apache以处理新的conf文件,但是在尝试自动安装神经节时会中断-将您的注释添加到前面并修复了问题
Jeremy Hajek 2015年

19

摆脱了RAOF的回答,并花了无数小时在网上搜索以能够在Ubuntu 12.04上执行完全不动手的更新和dist-upgrade,这要归功于这篇文章(https:// bugs .launchpad.net / ubuntu / + source / grub / + bug / 239674 / comments / 1)指出,当您要使用软件包维护者grub menu.lst而不是任何可能的本地菜单时,grub遵循UCF而不是Dpkg Options .lst编辑。

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

#!/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

1
这是唯一对我有用的东西。谢谢!
2014年

1
假设您还使用unattended-upgrades并编辑了一些grub配置:如何UCF_FORCE_CONFFNEW在该上下文中进行设置?还是需要从更新中将grub列入黑名单?
thom_nic 17-10-20

3

先前的解决方案不适用于16.04。这从堆栈溢出的答案开始工作:

sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold"  install grub-pc

1

过去几天,我一直在Ubuntu 18.04上处理相同的问题。在启动新的EC2实例(特别是ami-00035f41c82244dab)时,我运行了一个自动配置脚本(通过初始化时提供的User Data config),其第一步之一是运行apt更新/升级。

当提示用户输入有关修改的GRUB文件时,脚本将被阻止-首先是/ etc / default / grub,然后是/boot/grub/menu.lst。由于当作为用户数据提供时,它正在无人参与模式下运行,因此该进程将停止并且永远不会恢复。

从许多Google搜索中看来,这似乎是一种长期存在的GRUB问题,一种形式还是另一种形式,据我所知,已应用了一些修复程序,然后又进行了回归。

最终,我唯一能够成功应用的解决方法是在我的配置脚本中出现以下丑陋的骇客。希望它可以使其他人摆脱困境!

#!/bin/bash 

apt update

### Workaround: Pre-update /etc/default/grub and remove /boot/grub/menu.lst to avoid 'file changed' prompts from blocking completion of unattended update process
patch /etc/default/grub <<'EOF'
10c10
< GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0"
---
> GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 nvme.io_timeout=4294967295"
19c19
< GRUB_TERMINAL=console
---
> #GRUB_TERMINAL=console
EOF
rm /boot/grub/menu.lst

apt upgrade -y

### Workaround part 2: re-generate /boot/grub/menu.lst
/usr/sbin/update-grub-legacy-ec2 -y

我只能假设遇到的问题是当前可用的Ubuntu 18.04 AMI版本所特有的,并且任何包含较新GRUB软件包的更新版本都可能不会遇到同一问题。特别是,更改的性质/etc/default/grub不太可能适用于AMI的较新版本。只是把它放在那里。


尝试运行以下sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" -qq --force-yes upgrade
单线

另外,这是上述最新的错误(回归):bugs.launchpad.net/cloud-images/+bug/1747464
DarkNeuron
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.