내 Debian 컴퓨터에 설치하고 싶지만 python3.7
최신 버전에서 제공되고 최신 버전이 필요하므로 핵심 패키지를 불안정한 버전으로 업그레이드해야 합니다.idle-python3.7
stable
sid
libc
제가 평소대로 하면. 또한 어떤 이유로든 다음을 지정하는 많은 수의 패키지를 업그레이드하거나 제거해야 합니다.정확히 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
이제 완료되었으므로 실제 설치를 시작할 수 있습니다.
- 먼저, 원하는 패키지가 어떤 버전의 데비안과 함께 제공되는지 확인하세요. 이 글을 쓰는 시점에서
내 패키지의 버전은 Debian입니다.sid
- 이제 이 데비안 이미지를 저장할 위치를 결정하세요.
나는 지루했고 이 작업을 여러 번 수행해야 할 것으로 예상되어 내 전화를 걸어chroot.0
내 CWD에 직접 입력했습니다~
. 다음 명령을 실행하세요:
sudo debootstrap --variant=minbase sid chroot.0
sid
원하는 Debian 버전과chroot.0
사용하려는 디렉터리 경로로 바꾸세요 .여기에서 use를 사용
--variant=fakeroot
하고 아마도 피할 수도 있지만sudo
그렇게 하면 많은 추가 패키지가 설치되고(--variant
s를 결합할 수 없는 경우) 권한 문제로 인해 나머지 답변이 유효하지 않게 될 수 있습니다.
실행되는 동안 이 답변의 다음 부분을 읽을 수 있습니다.
패키지 설치
이것은 쉬운 부분입니다. 시스템 설치가 완료되면 chroot
이를 입력하고 원하는 소프트웨어 패키지를 설치할 수 있습니다.
chroot
최소 Debian 인스턴스를 입력하세요.sudo chroot chroot.0
(다시 chroot.0을 사용한 경로로 바꾸십시오).
이제 필수 패키지를 설치할 수 있는 루트 셸에 있어야 합니다.
apt install idle-python3.7 python3.7
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
때문입니다 . 그 중 하나는 해당 라이브러리에 영향을 미치고 다른 하나는 해당 라이브러리에 영향을 미칩니다. 두 호출 모두 나중에 작동이 중지되고 오류가 발생합니다. 네임스페이스 를 제거 해야 합니다 .mount
mount
mount
exit
이제 모든 설정이 완료되었으므로 쉘 스크립트에 입력해야 할 몇 가지 명령을 실행할 수 있습니다.
네임스페이스 생성 및 프로그램 실행
- 달리
sudo unshare -m su YOUR_USERNAME
거나sudo unshare -m su $(id -un)
별도의 네임스페이스에서 셸 시작귀하(또는 현재 사용자)로서. "별도의 네임스페이스"가 중요합니다. 이는 호스트 Debian에 최소 Debian 인스턴스의 일부를 설치할 때 변경 사항이 (모든 프로세스가 아닌) 새 셸과 그 하위 프로세스에만 적용된다는 것을 의미합니다. 다음 단계를 실행한 후 치명적인 오류 발생에 대한 성가신 경고 메시지가 표시되므로-c /bin/sh
명령에 추가하는 것이 좋습니다.bash
이전에 컴파일한 도구를 실행합니다. 가 걸리고
sudo
실제로 save 를 통해 오류를 알려주지는 않지만echo $?
작업은 완료됩니다. 바인딩해야 하는 데비안의 양은 프로그램에 따라 다르지만 최대한 구체적으로 작성하는 것이 좋습니다.아니요/etc
,/dev
또는 에 바인딩합니다/boot
. 내 컴퓨터에서 Python 3.7을 실행하려면 다음을 실행했습니다.sudo ./bindfromchroot chroot.0 /usr /lib
- 실행하려는 프로그램을 테스트하십시오(예
idle-python3.7
: . 그래도 문제가 해결되지 않으면 오류 메시지를 확인하여 무엇이 누락되었는지 확인하고exit
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 -EA
SUDO_ASKPASS
git gui