web-dev-qa-db-ja.com

grub configプロンプトなしでapt-get -y dist-upgradeを実行するにはどうすればよいですか?

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                                                        │                              
62
fratrik

/etc/default/grubファイルはパッケージのインストール時に生成されます。これはdebconfと統合されるため必要です。これは、dpkg confファイルとして扱うことができないため、dpkgの構成ファイルの処理では認識されないことを意味します。

代わりに、設定を処理するためのより洗練されたDebianツールであるucfを使用します。残念ながら、これはdpkgオプションを理解しないため、Dpkg::Options::="--force-confdef"を設定しても役に立ちません。ただし、UCF_FORCE_CONFFNEWおよびUCF_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のポリシーに反しています。そのようなパッケージに出くわした場合は、バグを報告してください。

93
RAOF

rAOFの答えを失い、Ubuntu 12.04で完全に無人の更新とdist-upgradeを実行できるようにWebで無数の時​​間を費やした後、この投稿( https ://bugs.launchpad.net/ubuntu/+source/grub/+bug/239674/comments/1 )パッケージメンテナーのgrubメニューを使用する場合、grubはDpkgオプションではなくUCFに準拠することを指摘しています。可能なローカルmenu.lst編集の代わりにlst。

私は、grubではない他のパッケージの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
19
metral

以前のソリューションは16.04では機能しませんでした。これは スタックオーバーフローに関するこの回答 から機能します。

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

私は過去数日、Ubuntu 18.04で同じ問題に取り組んできました。新しいEC2インスタンス(具体的にはAMI-00035f41c82244dab)を起動すると、自動化されたプロビジョニングスクリプトを実行します(初期化時に提供されたユーザーデータ構成を使用)。最初のステップの1つはapt更新/アップグレードです。

変更されたGRUBファイルについてユーザーにプロンプ​​トが表示されている間、スクリプトはブロックされます-最初に/ etc/default/grub、次に/boot/grub/menu.lst。これはユーザーデータとして提供された場合に無人モードで実行されているため、プロセスは停止し、回復することはありません。

多くのグーグルから、これは何らかの形で長期にわたるGRUB問題であり、修正が適用され、その後、私が知る限り、後者は再び後退しているようです。

最終的に、正常に適用できた唯一の回避策は、プロビジョニングスクリプトの次のfollowingいハックです。うまくいけば、誰かがバインドから抜け出すかもしれない!

#!/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の新しいバージョンには適用されない可能性があります。とにかくこれを外に出すだけです。

1
John Rix