Comment puis-je apt-get -y dist-upgrade sans une invite de configuration grub?

63

Est-ce que Per apt-get (ou aptitude) est exécuté avec -y mais ne demande pas le remplacement des fichiers de configuration?

J'ai fait ce qui suit:

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

Sur la machine:

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

Je reçois toujours une invite me demandant quel fichier de configuration je veux utiliser. Voici les lignes qui précèdent l’invite:

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

ensuite:

                         ┌───────────────────────────────────────────────────────┤ 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
la source
Solution de contournement insatisfaisante: echo grub-pc hold | sudo dpkg --set-selections avant la première commande apt-get
fratrik
J'ai le même problème et j'ai essayé de nombreuses permutations / orthographes différentes de Dpkg :: Options :: =, mais aucune d'entre elles n'a fonctionné. J'ai également essayé d'ajouter les lignes au fichier /etc/apt/apt.conf.d/local comme indiqué, et elles ne fonctionnaient pas non plus. Cela semble être une régression dans Precise.
Scott Ritchie
+1 - merci d'avoir posé la question - il était étonnamment facile de trouver ce fil pour résoudre cet ennuyeux problème
cwd

Réponses:

95

Le /etc/default/grubfichier est généré au moment de l'installation du paquet, ce qui est nécessaire car il s'intègre à debconf. Cela signifie qu'il ne peut pas être traité comme un fichier de configuration dpkg, et que le traitement du fichier de configuration de dpkg ne le sait pas.

Au lieu de cela, il utilise ucfun outil Debian plus sophistiqué pour gérer la configuration. Malheureusement, cela ne comprend pas les options de dpkg, donc le réglage Dpkg::Options::="--force-confdef"ne vous aidera pas. Il a sa propre façon de faire des mises à niveau sans invite, via les variables d'environnement UCF_FORCE_CONFFNEWet UCF_FORCE_CONFFOLD.

ucfutilise debconfpour les invites, aussi définir l'interface de debconf pour noninteractivefaire taire le message. Si vous voulez vraiment des mises à jour non interactives, vous devrez quand même le faire - des paquets arbitraires peuvent poser des questions à debconf (bien que ce ne soit généralement pas le cas lors des mises à niveau).

Vous pouvez définir l'interface debconf comme un élément unique en l'ajoutant DEBIAN_FRONTEND=noninteractiveà votre environnement ou vous pouvez la définir de manière permanente en exécutant dpkg-reconfigure debconfet en sélectionnant l'interface frontale non interactive. Si vous utilisez l'interface frontale non interactive, vous aurez la réponse par défaut à toutes les questions qu'un paquet peut poser.

Car ucf, la réponse par défaut est «Conserver le fichier existant».

Ainsi, la commande complète pour effectuer une mise à jour vraiment 100% garantie¹ ne nécessitant aucune invite serait.

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

¹: Il est techniquement possible que les paquets utilisent une autre méthode d’invite que debconf, mais cela est contraire à la politique Debian. Si vous rencontrez un tel paquet, créez un bogue.

RAOF
la source
8
Notez que si vous testez ceci sur un shell, la commande sudo semble supprimer la variable DEBIAN_FRONTEND, c’est-à-dire que vous avez besoin de sudo DEBIAN_FRONTEND = apt-get -y dist-upgrade non interactif, alors que DEBIAN_FRONTEND = noninteractif sudo apt-get -y dist-upgrade échouera.
Scott Ritchie
a bien fonctionné pour moi, merci
cwd
Notez également que ceci est considéré comme un bug et qu'ils publient de nouvelles images AMI qui ne devraient pas avoir ce problème: bugs.launchpad.net/ubuntu/+bug/1009294
Scott Ritchie
Et les nouveaux AMI sont maintenant publiés.
Scott Ritchie
@ScottRitchie - votre commentaire fonctionne également pour aider à automatiser l'installation du paquet ganglia-webfrontend. Il a une invite pour demander un redémarrage d’apache pour traiter le nouveau fichier de configuration, mais cela se brise lorsqu’on essaie d’automatiser l’installation de ganglia - a ajouté votre commentaire au début et a corrigé le problème
Jeremy Hajek
19

abandonnant la réponse de RAOF et après avoir passé d'innombrables heures à chercher sur le Web pour pouvoir effectuer une mise à jour et une mise à niveau complètement manuelles sur Ubuntu 12.04, je suis parvenu à cela grâce au fait que cet article ( https: // bugs .launchpad.net / ubuntu / + source / grub / + bug / 239674 / comments / 1 ) signale que grub adhère à UCF et non à Dpkg Options lorsque vous souhaitez utiliser les mainteneurs de paquet grub menu.lst au lieu de tout menu local possible .lst édite.

J'ai laissé les options Dpkg force-confnew pour d'autres paquets qui ne sont pas 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
metral
la source
1
C'était la seule chose qui a fonctionné pour moi. Merci!
mercredi
1
Supposons donc que vous utilisiez unattended-upgradeset ayez également modifié une configuration de grub: comment vous positionnez-vous UCF_FORCE_CONFFNEWdans ce contexte? Ou auriez-vous besoin de mettre la liste noire de grub après la mise à jour?
thom_nic
3

Les solutions précédentes ne fonctionneraient pas avec 16.04. Cela fonctionne à partir de cette réponse sur le dépassement de pile :

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

Je me suis déjà disputé avec le même problème sous Ubuntu 18.04 ces derniers jours. Lors du lancement d'une nouvelle instance EC2 (en particulier ami-00035f41c82244dab), j'exécute un script d'approvisionnement automatique (via la configuration de données utilisateur fournie au moment de l'initialisation), dont l'une des premières étapes consiste à exécuter une mise à jour / mise à niveau.

Le script est bloqué lorsque l'utilisateur est informé des fichiers GRUB modifiés - d'abord / etc / default / grub, puis /boot/grub/menu.lst. Dans la mesure où il s'exécute en mode sans assistance lorsqu'il est fourni en tant que données utilisateur, le processus est bloqué et ne récupère jamais.

D'après beaucoup de recherches sur Google, il semble que ce soit un problème récurrent de GRUB, sous une forme ou une autre, avec des corrections appliquées, puis régressant à nouveau, pour autant que je sache.

En fin de compte, la seule solution de contournement que j'ai pu appliquer avec succès est le piratage laid suivant dans mon script de provisionnement. Espérons que cela puisse sortir quelqu'un d'autre d'une situation difficile cependant!

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

Je ne peux que supposer que le problème rencontré est assez spécifique à la version Ubuntu 18.04 AMI actuellement disponible et que toute version mise à jour intégrant de nouveaux packages GRUB peut ne pas être soumise au même problème. En particulier, la nature des modifications à /etc/default/grubne sera probablement pas applicable aux nouvelles versions de l’AMI. Juste en mettant ça là-bas quand même.

John Rix
la source
Essayez de sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" -qq --force-yes upgrade
lancer
Aussi, voici le dernier bogue (régression) mentionné ci-dessus: bugs.launchpad.net/cloud-images/+bug/1747464
DarkNeuron