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"은 다음과 같이 두 번 설치된 것으로 나열되는 패키지입니다.

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의 경우 두 패키지가 공존하도록 하는 방법을 모르겠습니다. (예를 들어 두 개의 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를 만족하지 않는 경우, 가능하지만 덜 편리한 또 다른 접근 방식은 chroot 내부에 amd64 make를 설치하지 않고 대신 chroot 내부에서 호스트 루트를 사용할 수 있도록 만드는 것입니다(바인드 마운트 사용, 참조).chroot 감옥 내에서 /bin 및 /lib 제공예) 또는 적어도 make바이너리와 그 종속성( makelibc일 뿐임)입니다. PATH에 바이너리가 설치된 디렉터리를 추가합니다. 위와 같이 더미 패키지를 생성하되 설치되었다고만 선언하고 또는 헤더를 make넣지 마십시오 .DependsMulti-Arch

답변2

이 메시지의 의미는 "동일한 이름을 가진 두 개의 서로 다른 아키텍처 패키지가 설치된 경우 정확히 동일한 버전이어야 합니다."입니다.

이는 둘 다 /usr/share/doc/.../changelog.Debian다른 파일을 제공하고 둘 다 동일한 파일을 설치하는 경우 여기에서 파일 충돌이 허용되기 때문입니다.

그러나 make두 패키지 모두 서로 다른 /usr/bin/make.

나는 dpkg 허용을 사용하여 상태를 기반으로 패키지를 설정할 수 있다고 생각합니다. --auto-deconfigure그러면 해당 패키지가 다시 실행되고 지원을 위해 제거가 허용됩니다.makeunpackedinstalledpostinstmake:amd64make:armhf

관련 정보