Wie kann ich apt-get -y dist-upgrade ohne eine grub config-Eingabeaufforderung ausführen?

63

Per Make apt-get (oder aptitude) mit -y ausführen, aber nicht zum Ersetzen von Konfigurationsdateien auffordern?

Ich habe folgendes gemacht:

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

Auf der Maschine:

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

Ich werde immer noch gefragt, welche Konfigurationsdatei ich verwenden möchte. Dies sind die Zeilen, die vor der Eingabeaufforderung stehen:

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

dann:

                         ┌───────────────────────────────────────────────────────┤ 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                                                        │                              
fratrik
quelle
Unbefriedigende Problemumgehung: echo grub-pc hold | sudo dpkg --set-Auswahl vor dem ersten Befehl apt-get
fratrik
Ich bekomme das gleiche Problem und habe viele verschiedene Permutationen / Schreibweisen von Dpkg :: Options :: = ausprobiert, von denen keine funktioniert hat. Ich habe auch versucht, die Zeilen wie angegeben in die Datei /etc/apt/apt.conf.d/local einzufügen, und sie funktionierten auch nicht. Dies scheint eine präzise Regression zu sein.
Scott Ritchie
+1 - danke für die Nachfrage - es war überraschend einfach, diesen Thread zu diesem ärgerlichen Problem zu finden
CWD

Antworten:

95

Die /etc/default/grubDatei wird bei der Installation des Pakets generiert. Dies ist erforderlich, da sie in debconf integriert ist. Dies bedeutet, dass es nicht als dpkg conf-Datei behandelt werden kann und daher die Konfigurationsdatei von dpkg nichts davon weiß.

Stattdessen wird ucfein ausgefeilteres Debian-Tool zur Verwaltung der Konfiguration verwendet. Dies versteht leider die dpkg-Optionen nicht, so dass die Einstellung Dpkg::Options::="--force-confdef"nicht hilft. Es gibt jedoch eine eigene Möglichkeit, Upgrades ohne Aufforderung über die Umgebungsvariablen UCF_FORCE_CONFFNEWund UCF_FORCE_CONFFOLDdurchzuführen.

ucfWird debconffür die Eingabeaufforderung verwendet. Wenn Sie also die debconf-Schnittstelle auf noninteractiveeinstellen , wird die Nachricht ebenfalls stummgeschaltet. Wenn Sie nicht interaktive Updates wirklich wollen, müssen Sie dies trotzdem tun - beliebige Pakete können debconf-Fragen stellen (obwohl dies bei Upgrades im Allgemeinen nicht der Fall ist).

Sie können die debconf-Schnittstelle als einmalig festlegen, indem Sie sie DEBIAN_FRONTEND=noninteractivezu Ihrer Umgebung hinzufügen , oder sie dauerhaft festlegen, indem dpkg-reconfigure debconfSie das nicht interaktive Frontend ausführen und auswählen. Wenn Sie das nicht interaktive Frontend verwenden, erhalten Sie die Standardantwort auf alle Fragen, die ein Paket möglicherweise stellt.

Für ucflautet die Standardantwort "Behalte die vorhandene Datei".

Der vollständige Befehl für ein wirklich 100% iges Update ohne Eingabeaufforderung wäre also.

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

¹: Es ist technisch möglich, dass Pakete eine andere Eingabeaufforderungsmethode als debconf verwenden, dies verstößt jedoch gegen die Debian-Richtlinie. Wenn Sie auf ein solches Paket stoßen, melden Sie einen Fehler.

RAOF
quelle
8
Beachten Sie, dass wenn Sie dies auf einer Shell testen, der Befehl sudo die Variable DEBIAN_FRONTEND zu entfernen scheint, dh Sie benötigen sudo DEBIAN_FRONTEND = nicht interaktives Apt-Get -y-Dist-Upgrade, wohingegen DEBIAN_FRONTEND = nicht interaktives Sudo Apt-Get -y-Dist-Upgrade fehlschlägt
Scott Ritchie
hat gut funktioniert, danke
cwd
Beachten Sie auch, dass dies ein Fehler ist und neue AMI-Images veröffentlicht werden, bei denen dieses Problem nicht auftreten sollte: bugs.launchpad.net/ubuntu/+bug/1009294
Scott Ritchie
Und die neuen AMIs sind jetzt freigegeben.
Scott Ritchie
@ScottRitchie - Ihr Kommentar hilft auch dabei, die Installation des Pakets ganglia-webfrontend zu automatisieren. Es hat eine Aufforderung für einen Neustart von Apache zu bitten , die neue conf - Datei zu verarbeiten , aber das bricht , wenn die Installation von Ganglien zu automatisieren versucht - hinzugefügt , um Ihre Kommentare an der Front und das Problem behoben
Jeremy Hajek
19

Nachdem ich die Antwort von RAOF verworfen hatte und unzählige Stunden im Internet nach einem Update und einem Dist-Upgrade für Ubuntu 12.04 gesucht hatte, kam ich auf diese Idee, da dieser Beitrag ( https: // bugs .launchpad.net / ubuntu / + source / grub / + bug / 239674 / comments / 1 ) weist darauf hin, dass grub sich an UCF und nicht an Dpkg Options hält, wenn Sie das Paketverwalter-Menü grub menu.lst anstelle eines möglichen lokalen Menüs verwenden möchten .lst bearbeitet.

Ich habe die Dpkg Force-Confnew-Optionen für andere Pakete, die nicht Grub sind.

#!/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
metral
quelle
1
Dies war das einzige, was für mich funktioniert hat. Vielen Dank!
Wes
1
Nehmen wir also an, Sie verwenden auch unattended-upgradeseine Grub-Konfiguration und haben sie bearbeitet: Wie stellen Sie sie UCF_FORCE_CONFFNEWin diesem Kontext ein? Oder müssten Sie grub von der Aktualisierung ausschließen?
thom_nic
3

Die vorherigen Lösungen würden mit 16.04 nicht funktionieren. Dies funktioniert nach dieser Antwort beim Stapelüberlauf :

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

Ich habe in den letzten Tagen mit dem gleichen Problem unter Ubuntu 18.04 gerungen. Beim Starten einer neuen EC2-Instanz (insbesondere ami-00035f41c82244dab) führe ich ein automatisiertes Bereitstellungsskript aus (über die zum Zeitpunkt der Initialisierung bereitgestellte Benutzerdatenkonfiguration). Einer der ersten Schritte besteht darin, apt update / upgrade auszuführen.

Das Skript wird blockiert, während der Benutzer aufgefordert wird, geänderte GRUB-Dateien anzugeben - zuerst / etc / default / grub und dann /boot/grub/menu.lst. Da dies im unbeaufsichtigten Modus ausgeführt wird, wenn es als Benutzerdaten bereitgestellt wird, wird der Prozess angehalten und nie wiederhergestellt.

Vielem Googeln zufolge scheint es sich um ein seit langem bestehendes GRUB-Problem in der einen oder anderen Form zu handeln, bei dem Korrekturen vorgenommen wurden und sich letztere, soweit ich das beurteilen kann, wieder zurückbilden.

Letztendlich ist die einzige Problemumgehung, die ich erfolgreich anwenden konnte, der folgende hässliche Hack in meinem Bereitstellungsskript. Ich hoffe, es könnte jemand anderen aus der Klemme bringen!

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

Ich kann nur vermuten, dass das Problem, auf das ich gestoßen bin, sehr spezifisch für die derzeit verfügbare Ubuntu 18.04 AMI-Version ist und dass bei jeder aktualisierten Version, die neuere GRUB-Pakete enthält, möglicherweise nicht dasselbe Problem auftritt. Insbesondere ist /etc/default/grubes unwahrscheinlich, dass die Art der Änderungen für neuere AMI-Versionen gilt. Stell das einfach da raus.

John Rix
quelle
Versuchen Sie, den folgenden sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" -qq --force-yes upgrade
Einzeiler zu verwenden
Hier ist auch der letzte Fehler (Regression), der oben erwähnt wurde: bugs.launchpad.net/cloud-images/+bug/1747464
DarkNeuron