APTがクロスアーキテクチャパッケージを手動でインストールしたと信じさせる方法は?

APTがクロスアーキテクチャパッケージを手動でインストールしたと信じさせる方法は?

amd64システムにqemu-armhf chroot環境があります(主にRaspberry Piコードのコンパイルに使用されます)。したがって、armhfとamd64のバイナリを実行できますが、後者はより高速です。

スピードを上げるために、chrootに特定のパッケージ(makeなど)のamd64バージョンをインストールしました。これは他のarmhfパッケージをapt-getする必要があるまでうまくいき、makeを依存関係としてリストして次のようになりました。

The following packages have unmet dependencies:
 build-essential : Depends: make but it is not going to be installed
 dpkg-dev : Depends: make but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

make:armhf提案されたコマンドを試すと、インストールとアンインストールを求めるメッセージが表示されますmake:amd64。私はそうしたくありません。 APTを実際にインストールせずにmake:armhf(依存関係を満たすために)すでにインストールされていることをどのように知ることができますか?make:amd64

試してみましたがインストールapt-mark manual makeされていないと出ますね。


私はこれがおそらく正しいアプローチではないことを知っていますが、パッケージ定義がどのように/var/lib/dpkg/status機能するのかを理解しようとするファイルを見て、make:とarmhfも満足するmake:amd64に同意するように欺いてみました。

具体的には、libbz2-1.0は、次のように2回インストールされたものとしてリストされているパッケージです。

Architecture: armhf
Multi-Arch: same
Pre-Depends: multiarch-support

そしてかつては次の​​ようになりました。

Architecture: amd64
Multi-Arch: foreign
Pre-Depends: multiarch-support

そこで、「make」の項目を同様にコピーして上記のすべての値を設定してみました。しかし今、APTは「make」と「make:amd64」が衝突すると言います。 makeを実行すると競合が発生しますが、libbz2-1.0を実行すると競合が発生しないのはなぜですか? (これが特別なケースライブラリではないことを願っています。バグのようです。)


すべてこの回答、ダミーパッケージを作成してインストールしようとしましたがequivs(上記の手動操作を削除した後)、インストールすると次のエラーが発生します。

# dpkg -i /var/cache/apt/archives/make_3.81-8.2_amd64.deb (real amd64 make)
# dpkg -i make_3.81-8.2_armhf.deb (fake armhf depends on the above)
Preparing to replace make 3.81-8.2 (using make_3.81-8.2_armhf.deb) ...
Unpacking replacement make ...
dpkg: dependency problems prevent configuration of make:
 make depends on make:amd64 (= 3.81-8.2).

だから問題は、再びmake:armhfが次のようになると思うようです。代替make:amd64の場合、両方のパッケージを共存させる方法がわかりません。 (例えば、2つのlibbz2パッケージが共存するという考えは大丈夫だと思います。)

答え1

私はアーキテクチャシステムをあまり使用していないので、ここで提案するよりも良い方法があるかもしれません。私の提案をテストしておらず、複数のアーキテクチャのいくつかの機能と競合しているかどうかはわかりません。

あなたはそれを使用することができます同等到着仮想パッケージの作成依存関係のみ。

  1. 制御ファイルの生成equivs-control make.control
  2. 制御ファイルの編集:設定Package: make、および。 amd64 makeのバージョンと一致するように設定することもできます。Architecture: armhfDepends: make:amd64Multi-Arch: foreignVersion
  3. 仮想パッケージを作成します。equivs-build make.control
  4. chrootへの仮想パッケージのインストール

これがdpkgを満たさない場合は、可能ですが、あまり便利ではないもう1つのアプローチは、chroot内にamd64 makeをインストールせずに代わりにchroot内でホストルートを使用できるようにすることです(バインドマウントの使用、参照)。chroot刑務所内で/binと/libを提供するはい)または少なくともmakeバイナリとその依存関係(makelibcのみ)。 PATHにバイナリがインストールされているディレクトリを追加します。上記のようにダミーパッケージを作成しますが、インストールされていると宣言したりヘッダーを入れたりしないでmakeください。DependsMulti-Arch

答え2

このメッセージの意味は、「同じ名前を持つ2つの異なるアーキテクチャパッケージがインストールされている場合は、まったく同じバージョンである必要があります」ということです。

これは、どちらも/usr/share/doc/.../changelog.Debian異なるファイルを提供し、両方とも同じファイルをインストールする場合、ここでファイルの競合が許可されるためです。

しかし、make両方のパッケージが異なる/usr/bin/make

私はdpkgを許可を使用して状態に基づいてパッケージを設定できると思います。--auto-deconfigureこれにより、そのパッケージが再度実行され、サポートのためにアンインストールが許可されます。makeunpackedinstalledpostinstmake:amd64make:armhf

関連情報