Я сделал следующее:
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 │
Предыдущие решения не работали с 16.04. Это работает из этот ответ о переполнении стека :
sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" install grub-pc
уклоняясь от ответа РАОФ и потратив бесчисленное количество часов на поиск в Интернете, чтобы иметь возможность выполнить полностью автоматическое обновление & amp; dist-upgrade на Ubuntu 12.04, я придумал это благодаря тому, что этот пост ( https://bugs.launchpad.net/ubuntu/+source/grub/+bug/239674/comments/1 ) указывает, что grub придерживается UCF, а не Dpkg Options, когда вы хотите использовать grub menu.lst для сопровождающих пакетов вместо любых возможных локальных правок menu.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
Файл /etc/default/grub
создается во время установки пакета, что необходимо, поскольку он интегрируется с debconf. Это означает, что он не может рассматриваться как файл конфигурации dpkg, и поэтому обработка файла конфигурации dpkg не знает об этом.
Вместо этого он использует ucf
, более сложный инструмент Debian для обработки конфигурации. Это, к сожалению, не понимает параметров dpkg, поэтому настройка Dpkg::Options::="--force-confdef"
не поможет. Тем не менее, у него есть свой собственный способ выполнять обновления без подсказок, используя переменные среды UCF_FORCE_CONFFNEW
и UCF_FORCE_CONFFOLD
.
ucf
использует debconf
для запроса, поэтому установка интерфейса debconf на noninteractive
также заставит сообщение замолчать. Если вы действительно хотите неинтерактивные обновления, вам все равно придется это делать - произвольные пакеты могут задавать вопросы debconf (хотя, как правило, этого не происходит во время обновлений).
Вы можете установить интерфейс debconf как одноразовый, добавив DEBIAN_FRONTEND=noninteractive
в свою среду, или можете установить его навсегда, запустив 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. Если вы столкнетесь с таким пакетом, сообщите об ошибке.
В последние несколько дней я обсуждаю ту же проблему с Ubuntu 18.04. Запустив новый экземпляр EC2 (в частности, ami-00035f41c82244dab), я запустил скрипт автоматической инициализации (через конфигурацию пользовательских данных, предоставленную во время инициализации), одним из первых шагов которой является запуск apt update / upgrade.
Сценарий блокируется, когда пользователю предлагается ввести измененные файлы 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. В любом случае, просто добавлю это.
После долгих испытаний единственное, что сработало, это:
dpkg-reconfigure debconf -f noninteractive -p critical
UCF_FORCE_CONFFOLD=YES apt -o Dpkg::Options::="--force-confdef" -o DPkg::Options::="--force-confold" -y dist-upgrade
Для того, что я делал (Ubuntu 16.04 в Vagrant с инициализацией), DEBIAN_FRONTEND=noninteractive
был недостаточно. Спасибо другим в этой теме, мне нужно было добавить UCF_FORCE_CONFFOLD=YES
для grub-pc