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 un message me demandant quel fichier de configuration je veux utiliser. Ce sont les lignes qui viennent avant l'invite:
Setting up grub-pc (1.99-21ubuntu3.1) ...
puis:
┌───────────────────────────────────────────────────────┤ 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 │
Le fichier /etc/default/grub
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 ucf
, un outil Debian plus sophistiqué pour gérer la configuration. Malheureusement, ceci ne comprend pas les options de dpkg, donc configurer Dpkg::Options::="--force-confdef"
ne vous aidera pas. Cependant, il a sa propre façon de faire des mises à niveau sans invite, via les variables d'environnement UCF_FORCE_CONFFNEW
et UCF_FORCE_CONFFOLD
.
ucf
utilise debconf
pour l'invite. Le fait de définir l'interface debconf sur noninteractive
mettra également le message au silence. 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 ajoutant DEBIAN_FRONTEND=noninteractive
à votre environnement ou vous pouvez la définir de manière permanente en exécutant dpkg-reconfigure debconf
et 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.
Pour 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.
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 l’ai imaginé grâce au fait que cet article ( https : //bugs.launchpad.net/ubuntu/+source/grub/+bug/239674/comments/1 ) indique que grub adhère à UCF et non à Dpkg Options lorsque vous souhaitez utiliser le menu Grub des responsables de package. lst au lieu de tout menu local.lst édité possible.
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
Les solutions précédentes ne fonctionneraient pas avec 16.04. Cela fonctionne à partir de cette réponse sur le débordement de pile :
Sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" install grub-pc
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 des données utilisateur fournie au moment de l'initialisation), dont l'une des premières étapes consiste à exécuter apt update/upgrade.
Le script est bloqué lorsque l'utilisateur est invité à indiquer les fichiers GRUB modifiés - d'abord/etc/default/grub, puis /boot/grub/menu.lst. Dans la mesure où il fonctionne 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 de longue date GRUB sous une forme ou une autre, les correctifs étant appliqués et ceux-ci 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!
#!/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 apportées à /etc/default/grub
ne sera probablement pas applicable aux versions plus récentes de l'AMI. Juste en mettant ça là-bas quand même.