Debian / Ubuntuで競合するパッケージをインストールして実行する方法は?

Debian / Ubuntuで競合するパッケージをインストールして実行する方法は?

私のDebianコンピュータにインストールしたいのですが、python3.7最新バージョンで提供され、最新バージョンが必要なので、コアパッケージを不安定バージョンにアップグレードする必要があります。idle-python3.7stablesidlibc私がいつものようにすれば。また、何らかの理由で以下を指定する多数のパッケージをアップグレードまたは削除する必要があります。正確に python3.5依存関係の一つとして。私はそうしたくありません。

python3.7何らかの理由でコンパイルできません。試行するとテストが失敗します。しかし、Debian管理者が私のアーキテクチャに合わせてコンパイルしたので、私は彼らのバージョンを使いたいと思います。

競合するパッケージをどのようにインストールしますか?

答え1

どちらもBusterで作業します(テスト済み)https://packages.debian.org/search?keywords=python3.7

テストリリースから信頼できるリリースにバックポートできる必要があります。https://backports.debian.org/Instructions/

答え2

警告:これはハッキングです。したがって、私はその信頼性についていかなる約束もしません。システムが損傷する可能性が低いです。その他のオプション、しかし。


これを行うには、ファイルシステムにDebianの新しいコピーをインストールし、chrootその中にいくつかのパッケージをインストールし、別の名前空間内にある種のハイブリッドシステムを作成してプログラムを実行します。一部のステップにはルートアクセスが必要で、他のステップはオプションでなければなりません(ただし、まだ把握していません)。シェルが必要ですdebootstrapchroot後者gccはカスタムツールが必要なためです)。

最小 Debian インスタンスのインストール

これにはというプログラムが必要ですdebootstrap。名前が示すように、このプログラムを使用してDebianインストールを起動できます。次のコマンドを使用してインストールできます。

sudo apt-get install debootstrap

これで完了したので、実際のインストールを開始できます。

  1. まず、どのパッケージがどのバージョンのDebianに付属しているかを確認してください。この記事を書いている時点で、
    私のパッケージのバージョンはDebianです。sid
  2. この Debian イメージを保存する場所を決定します。
    私は退屈で、これを何度も実行する必要があると予想され、電話をかけてchroot.0自分のCWDに直接入力しました~
  3. 次のコマンドを実行します。

    sudo debootstrap --variant=minbase sid chroot.0
    

    sid目的のDebianバージョンとchroot.0使用したいディレクトリパスに置き換えます。

    ここでuseを使用し--variant=fakerootておそらく避けることができますが、sudoそうすると、多くの追加パッケージがインストールされ(--variantsを組み合わせることができない場合)、権限の問題によって残りの答えが無効になる可能性があります。

実行中にこの回答の次の部分を読むことができます。

パッケージのインストール

これは簡単な部分です。システムのインストールが完了したら、chrootそれを入力して必要なソフトウェアパッケージをインストールできます。

  1. chroot最小のDebianインスタンスを入力してください。

    sudo chroot chroot.0
    

    (再びchroot.0を使用したパスに置き換えます)。

  2. これで、必須パッケージをインストールできるルートシェルにする必要があります。

    apt install idle-python3.7 python3.7
    
  3. chrootを実行してくださいexit

今、私たちできるchrootただし、新しいユーザーを作成し、ホームディレクトリにバインドマウントポイントを設定するのが難しい場合を除き、ホームディレクトリで実行され隔離されrootます。chrootまったく新しいシステムを構築します。代わりにツールの作成を始めましょう。

ツールを作る

どこかに保存してください:

#include <stdio.h>
#include <string.h>
#include <sys/mount.h>
#include <linux/limits.h>

int main(int argc, char **argv) {
    if (argc < 3) {
        printf(
"This is a single-use, disposable program that binds specified directories from\n"
"a chroot's root to the current root.\n"
"\n"
"Argument #1 should be the path to the chroot directory, sans trailing /.\n"
"Subsequent arguments should be paths relative to the root, with preceeding /.\n"
        );
        return 2;
    }
    for (int i = 2; i < argc; i += 1) {
        char source[PATH_MAX];  /* Not really MAX, but quite big. */
        strcpy(&source, argv[1]);
        strcat(&source, argv[i]);
        if (mount(&source, argv[i],
                  NULL, MS_BIND,
                  NULL) == -1) {
            return 1;
        }
    }
    return 0;
}

以下を使用してコンパイルしますgcc

gcc bindfromchroot.c -o bindfromchroot

私がそう呼ぶのbindfromchrootは、それがすることだからです。直接使用できない理由は、少なくとも2回の呼び出しが必要なためmount --bindです。そのうちの1つはそのライブラリに影響し、もう1つはそのライブラリに影響します。どちらの呼び出しも後で動作を停止し、エラーが発生します。名前空間を削除する必要があります。mountmountmountexit

これですべての設定が完了したので、シェルスクリプトに入力する必要があるいくつかのコマンドを実行できます。

名前空間の作成とプログラムの実行

  1. 走ったりsudo unshare -m su YOUR_USERNAMEsudo unshare -m su $(id -un)別の名前空間でシェルを起動するあなた(または現在のユーザー)として。 「別の名前空間」が重要です。これは、ホスト Debian に最小の Debian インスタンスの一部をインストールする場合、変更が (すべてのプロセスではなく) 新しいシェルとそのサブプロセスにのみ適用されることを意味します。次の手順を実行すると、致命的なエラーの発生について迷惑な警告メッセージが表示されるため、-c /bin/shコマンドに追加することをお勧めします。bash
  2. 以前にコンパイルしたツールを実行します。がかかり、sudo実際にsaveを通じてエラーを知らせることはありませんが、echo $?操作は完了です。バインドする必要のある Debian の量はプログラムによって異なりますが、できるだけ具体的に記述することをお勧めします。いいえ/etc/devまたはにバインドします/boot。私のコンピュータでPython 3.7を実行するには:

    sudo ./bindfromchroot chroot.0 /usr /lib
    
  3. 実行したいプログラムをテストします(例idle-python3.7:問題が解決しない場合は、エラーメッセージを確認して何が欠落しているかを確認し、手順1exitからやり直してください。)

プログラムを自動的に実行するシェルスクリプトの作成

私はこれのために1つのライナーを設計しました。適切に修正してください。

sudo unshare -m su wizzwizz4 -c sh -c 'sudo -S ./bindfromchroot chroot.0 /usr /lib; idle-python3.7'

環境変数を保存するには、代わりにこのバージョンを使用してください。

sudo -E unshare -m su wizzwizz4 -mc sh -c 'sudo -ES ./bindfromchroot chroot.0 /usr /lib; idle-python3.7'

環境変数で定義されているプログラムを実行するようにsudo -ES変更できます。必要に応じて、グラフィックプロンプト(例:提供されているものなど)にすることもできます。sudo -EASUDO_ASKPASSgit gui

関連情報