Debian/Ubuntu에서 충돌하는 패키지를 설치하고 실행하는 방법은 무엇입니까?

Debian/Ubuntu에서 충돌하는 패키지를 설치하고 실행하는 방법은 무엇입니까?

내 Debian 컴퓨터에 설치하고 싶지만 python3.7최신 버전에서 제공되고 최신 버전이 필요하므로 핵심 패키지를 불안정한 버전으로 업그레이드해야 합니다.idle-python3.7stablesidlibc제가 평소대로 하면. 또한 어떤 이유로든 다음을 지정하는 많은 수의 패키지를 업그레이드하거나 제거해야 합니다.정확히 python3.5종속성 중 하나로. 나는 그렇게 하고 싶지 않습니다.

python3.7어떤 이유로든 컴파일할 수 없습니다. 시도할 때 테스트가 실패합니다. 그러나 데비안 관리자가 내 아키텍처에 맞게 컴파일했기 때문에 나는 그들의 버전을 사용하고 싶습니다.

충돌하는 패키지를 어떻게 설치하나요?

답변1

둘 다 Buster에서 작업합니다(테스트됨)https://packages.debian.org/search?keywords=python3.7

테스트 릴리스에서 안정적인 릴리스로 백포트할 수 있어야 합니다.https://backports.debian.org/Instructions/

답변2

경고: 이것은 해킹입니다. 그러므로 나는 그 신뢰성에 대해 어떠한 약속도 하지 않습니다. 시스템이 손상될 가능성이 적습니다.다른 옵션, 하지만.


이를 위해 우리는 파일 시스템에 데비안의 새 복사본을 설치하고 chroot그 안에 일부 패키지를 설치한 다음 별도의 네임스페이스 내에 일종의 하이브리드 시스템을 만들어 프로그램을 실행합니다. 일부 단계에는 루트 액세스가 필요하고 다른 단계는 선택 사항이어야 합니다(그러나 아직 파악하지 못했습니다). 쉘이 필요하며 debootstrap( chroot후자 gcc는 사용자 정의 도구가 필요하기 때문입니다).

최소 Debian 인스턴스 설치

이를 위해서는 이라는 프로그램이 필요합니다 debootstrap. 이름에서 알 수 있듯이 이 프로그램을 사용하면 데비안 설치를 부팅할 수 있습니다. 다음 명령을 사용하여 설치할 수 있습니다.

sudo apt-get install debootstrap

이제 완료되었으므로 실제 설치를 시작할 수 있습니다.

  1. 먼저, 원하는 패키지가 어떤 버전의 데비안과 함께 제공되는지 확인하세요. 이 글을 쓰는 시점에서
    내 패키지의 버전은 Debian입니다.sid
  2. 이제 이 데비안 이미지를 저장할 위치를 결정하세요.
    나는 지루했고 이 작업을 여러 번 수행해야 할 것으로 예상되어 내 전화를 걸어 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때문입니다 . 그 중 하나는 해당 라이브러리에 영향을 미치고 다른 하나는 해당 라이브러리에 영향을 미칩니다. 두 호출 모두 나중에 작동이 중지되고 오류가 발생합니다. 네임스페이스 를 제거 해야 합니다 .mountmountmountexit

이제 모든 설정이 완료되었으므로 쉘 스크립트에 입력해야 할 몇 가지 명령을 실행할 수 있습니다.

네임스페이스 생성 및 프로그램 실행

  1. 달리 sudo unshare -m su YOUR_USERNAME거나sudo unshare -m su $(id -un)별도의 네임스페이스에서 셸 시작귀하(또는 현재 사용자)로서. "별도의 네임스페이스"가 중요합니다. 이는 호스트 Debian에 최소 Debian 인스턴스의 일부를 설치할 때 변경 사항이 (모든 프로세스가 아닌) 새 셸과 그 하위 프로세스에만 적용된다는 것을 의미합니다. 다음 단계를 실행한 후 치명적인 오류 발생에 대한 성가신 경고 메시지가 표시되므로 -c /bin/sh명령에 추가하는 것이 좋습니다.bash
  2. 이전에 컴파일한 도구를 실행합니다. 가 걸리고 sudo실제로 save 를 통해 오류를 알려주지는 않지만 echo $?작업은 완료됩니다. 바인딩해야 하는 데비안의 양은 프로그램에 따라 다르지만 최대한 구체적으로 작성하는 것이 좋습니다.아니요/etc, /dev또는 에 바인딩합니다 /boot. 내 컴퓨터에서 Python 3.7을 실행하려면 다음을 실행했습니다.

    sudo ./bindfromchroot chroot.0 /usr /lib
    
  3. 실행하려는 프로그램을 테스트하십시오(예 idle-python3.7: . 그래도 문제가 해결되지 않으면 오류 메시지를 확인하여 무엇이 누락되었는지 확인하고 exit1단계부터 다시 시도하세요.

프로그램을 자동으로 실행하는 쉘 스크립트 작성

나는 이것을 위해 하나의 라이너를 디자인했습니다. 적절하게 수정하십시오.

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

관련 정보