別のホストで Debian OS() を更新すると、apt-get dist-upgrade
同じ画面で多くの変更が少なくなります。構成ファイルが変更されると、新しいバージョンが利用可能であることを示すメッセージが表示され、問題を解決するように求められます。修正され、apt / dpkgは変更を新しいバージョンと確実に統合できませんでした。
このオプションメニューはファイルごとに異なります。時には同じパッケージ内でも発生します。
一部のファイルには「パッケージ構成」コンソールUIがあり、他のファイルには通常のコンソール出力が使用されます。パッケージ構成UIで利用可能なオプションは必ずしも同じではありません。
変更された/新しいバージョンファイルの名前は必ずしも同じではありません。新しいファイルが常に必要な場所に保存されることはありません(時々「tmp」に保存されます)。新しいファイルの命名スキームも一貫性がありません(一部のパッケージは任意の名前を使用し、一部のパッケージは-newを使用し、他のパッケージは-dpkg-newを使用するなど)。
一部のパッケージは、dpkgのデフォルト値がどこにあるかを通知することを拒否します。一部のパッケージは、dpkg-old、-old、-dist、-dpkg-dist、または-old-nameofpackage拡張子を含む以前のバージョンを提供していませんが、他のパッケージは提供します。 (したがって、場合によっては3方向マージを手動で行うことができますが、他の場合はできません)。一部のパッケージには、便利な「バージョン間の3方向マージ」機能が追加されています。これは通常問題を自動的に解決するので、常に最初に試してみてください。構成ファイルのほとんどの変更は、通常、コメントに誤字が修正されました。
プログラムや並列比較の表示方法もパッケージ/ファイルによって異なる場合があります。
だから私は全体が欲しい目的パッケージ管理システムの鍵は、プログラムをインストールおよびアンインストールする一貫した方法を作成することです。ユーザーが管理しやすいです。
ここで何が起こりますか?ひどいUI/UXでは?ユーザーがアパートを変更/変更するためにできることはありますか?
- 「3方向マージの作成」を使用できます。
- 新しいファイルは常に一貫して名前が変更または配置されますか?
同じ暗記プロセスで同じタスクを実行するには1,000の小さなバリエーションがあるため、手動で再読み込みして各プロファイルをどのように処理するかを正確に把握する必要があります。
私が意味するものを説明するために、ここに2つのアップグレードがあります。
Configuration file '/etc/ssh/ssh_config'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
A new version (/tmp/tmp.3RoEfdEm3M) of configuration file /etc/ssh/sshd_config is available, but the version installed currently has been locally modified.
What do you want to do about modified configuration file sshd_config?
install the package maintainer's version
keep the local version currently installed
show the differences between the versions
show a side-by-side difference between the versions
show a 3-way difference between available versions
do a 3-way merge between available versions
start a new shell to examine the situation
2番目の亜種のオプションは何ですか?必ずしもこの順序で表示されるわけではありません。
まるであなたを倒すように設計されているように感じます。
答え1
まず、質問の「ユーザーターゲット」の側面を扱います。
「3方向マージの作成」を使用できます。
これはユーザーが制御できず、パッケージが構成ファイルを管理する方法によって異なります(下記参照)。
新しいファイルは常に一貫して名前が変更または配置されますか?
いいえ、しかし実際には重要ではありません。特に、2番目の例(最初の例sshd_config
)に示されている一時ファイルは実際には一時ファイルです。これは、比較ツールなどが比較する必要があるデータを見つけるのに使用できる構成ファイルのバリエーションです。 (ここでは、次の方法でユーザーエクスペリエンスを向上させることができます。いいえ一時ファイル名は、デフォルトでユーザーが「状況を確認する」ためにシェルを起動した場合にのみ表示されます。 )
特にDebianでこれが起こるのは、設定ファイルをさまざまな方法で処理できるためです。
予想通り、パッケージマネージャはdpkg
独自の設定ファイル管理機能を提供します。これがあなたの例で最初のバリエーション(アップグレード)を作成するssh_config
ことです。作業できる情報は、現在ディスクに存在する構成ファイルとインストールするパッケージに付属する新しい構成ファイルの2つです。したがって、3方向マージを提供することはできません。パッケージマネージャの場合、使い方は非常に簡単です(実際にはほとんどの場合、まったく必要ありません)。dpkg
プロファイル処理は、ユーザーが既存のファイルを保持するか(この場合は後で参照できるように拡張子を使用して新しいファイルを保持する).dpkg-dist
で終わるファイルか新しいファイルをインストールするか(この場合、古いファイルは拡張子を保持します)。.dpkg-old
.dpkg-dist
.dpkg-old
このような状況を改善するため、ucf
ツール開発されました。構成ファイルの元のバージョンを保存するので、3方向の比較とマージが可能です。ただし、パッケージマネージャの作業が必要なため、多くのパッケージでそれを使用しません。また、3方向マージのサポートはオプションです。あなたは見ることができますopenssh-server
ucf
ここに統合。
最も重要なことは次のとおりです。debconf
、Debian 構成管理システム。インストールプロセス中に対話する必要があるソフトウェアパッケージ。はいしなければならない使用しかし、繰り返しますが、これはパッケージマネージャの作業を必要とするので、今は一般的ですが、まだいくつかの例外があります(使用するために更新されていない非常に古いパッケージを含むdebconf
)。
もちろん、一部の管理者は上記のものが好きではなかったか、上記の内容が利用可能になる前に独自のソリューションを開発したため、一部のパッケージは独自の作業を行いました。
Joey Hessは1999年以来、Debian VA Linuxスイートに参加したことについて書いています。debconf
は、パッケージ構成の作成と変更に関するいくつかの背景情報を提供します。
答え2
アップデートを実行する前にインストールしてください。distro-info
それ以外の場合は、Webブラウザにアクセスできない場合は、CLIで古いバージョン名を見つけるのが難しい場合があります。
注文する:
diff3 -m config.file config.file.dpkg-old config.file.dpkg-new > config.file.merged
diff config.file config.file.merged
その後、編集またはマージが機能する場合:
mv config.file.merged config.file
debconf/ucf と同じ操作を手動で行う方法です。
これにより、ユーザーに古い/新しい構成ファイルを残した場所を知らないパッケージのみが残ります。アップグレードプロセスの途中で以前のバージョンのパッケージから欠落している構成ファイルをダウンロードするには、別々のシステム全体をインストールし、その中にパッケージをインストールするだけです。または、ブラウザから手動でダウンロードし、LinuxコンピュータにFTPに転送することもできます。ただし、アップグレードされたシステムのコマンドラインで実行する必要がある場合、状況はもう少し複雑になります。
これが私が今まで得たものです。実装されていないもう一つのこと:
GETPACKAGERELEASEVER
--> "buster"の一部であるパッケージのバージョンは何ですか?これをどのように印刷しますか?また、「main」なのか「contrib」なのか、どうやって確認できますか?
(このセクションの関連質問。CLIで特定のディストリビューションのパッケージバージョンを確認するには?)
# Todo: Look this up in some way using apt. (main, non-free, or contrib).
pkgType=main
previousReleaseName = $(distro-info -o)
# If not possible to use distro-info:
# This is rather hacky, and will fail when debian updates this webpage.
# release=$(cat /etc/issue | sed -E 's/[^0-9]*([0-9]+).*/\1/')
# previousRelease=$(($release-1))
# wget -O- https://www.debian.org/releases/ > releases.html
# previousReleaseName = $(cat releases.html | grep "Debian $previousRelease" | sed -E 's/.*Debian [0-9]+ \(<q>([a-z]+).*/\1/'))
firstLetter="$(echo $packagename | head -c 1)"
packageVersion=GETPACKAGERELEASEVER($packagename,$previousReleaseName)
mkdir /tmp/$packagename/
cd /tmp/$packagename
rm -r /tmp/$packagename/*
wget -O package.deb "https://deb.debian.org/pool/$pkgType/${firstLetter}/${packageName}/${packagename}_${packageVersion}_amd64.deb"
ar x package.deb
tar -xvf data.tar.xz
diff3 -m /etc/$packagename/$configfile /tmp/$packagename/etc/$configfile /etc/$packagename/$newconfigfile > /etc/$packagename/$configfile.merged`