64비트 Debian/Ubuntu에서 32비트 프로그램을 어떻게 실행하나요?

64비트 Debian/Ubuntu에서 32비트 프로그램을 어떻게 실행하나요?

64비트(amd64, 즉 x86_64) Debian 또는 Ubuntu를 설치했습니다. 가끔 32비트(i386/i686) 프로그램을 실행하거나 32비트 시스템용 프로그램을 컴파일해야 할 때가 있습니다. 최소한의 문제로 이 작업을 수행하려면 어떻게 해야 합니까?

보너스: 이전 버전이나 최신 버전의 배포판을 사용하여 실행하거나 테스트하려면 어떻게 해야 합니까?

답변1

현재 버전의 경우

Debian과 Ubuntu는 현재 다중 아키텍처를 지원합니다. x86_32(i386) 및 x86_64(amd64) 패키지를 동일한 시스템에서 간단한 방법으로 혼합할 수 있습니다. 이를 다중 아키텍처 지원이라고 합니다.우분투또는더반자세한 내용은 위키를 참조하세요.

바라보다워커의 대답간단하고 최신 답변을 얻으세요.


이전 버전의 경우

이전 버전에서는 Debian과 Ubuntu가 amd64에 많은 32비트 라이브러리와 함께 제공되었습니다. 설치하다ia32-libs ia32-libs 설치패키지에는 기본 32비트 라이브러리 세트와 이 라이브러리에 의존할 수 있는 다른 패키지가 있습니다. 필요한 라이브러리가 모두 있으면 32비트 실행 파일이 실행되어야 합니다. 개발을 위해 설치gcc-multilib gcc-multilib 설치, 그리고 이에 의존할 수 있는 다른 패키지, 예를 들어 다음과 같은 패키지를 g++-multilib찾을 수 있습니다.binutils-multiarch binutils-multiarch 설치유용하기도 하고,ia32-libs-dev데비안에서. ix86용으로 컴파일하려면 옵션을 -m32gcc에 전달하세요.

어떤 32비트 사용자 모드 구성 요소를 설치했는지에 관계없이 64비트 커널을 실행 중인지 여부 는 uname -m계속 표시됩니다 . x64_64아래에 설명된 Schroot가 이 문제를 처리합니다.

슈루트

이 섹션은 다른 Linux 배포판 "내부"에 Debian 계열 배포판을 설치하는 방법을 안내합니다. 64비트 우분투 안에 32비트 우분투를 설치하라는 문구가 있지만 데비안 안정 내부에 불안정한 데비안을 설치하거나 그 반대의 경우와 같은 다른 상황에 적용하려면 약간 수정해야 합니다.

소개하다

아이디어는 하위 트리에 대체 배포판을 설치하고 거기에서 실행하는 것입니다. 이 방법으로 64비트 시스템 위에 32비트 시스템을 설치하거나, ​​다른 버전의 배포판을 설치하거나, ​​다른 패키지 세트로 테스트 환경을 설치할 수 있습니다.

이것chroot명령과 시스템 호출은 디렉토리 트리의 하위 트리로 제한된 파일 시스템 보기로 프로세스를 시작합니다. 데비안과 우분투 릴리스슈루트, 이 기능을 중심으로 보다 유용한 하위 환경을 생성하는 유틸리티입니다.

설치하다schroot 루트 디렉터리 설치(더반)그리고debootstrap debootstrap 설치(더반). Debootstrap은 대체 배포판을 설치할 때만 필요하며 나중에 제거할 수 있습니다.

시겐 설정

이 예에서는 32비트 Ubuntu 10.04LTS(lucid lynx) 대체 환경을 설정하는 방법을 보여줍니다. 다른 버전의 Debian 및 Ubuntu에서도 비슷한 설정이 작동합니다. /etc/schroot/chroot.d/lucid32다음 내용으로 파일을 만듭니다 .

[lucid32]
description=Ubuntu 10.04LTS 32-bit
directory=/32
type=directory
personality=linux32
users=yourusername
groups=users,admin

이 줄은 directory=/32schroot에게 32비트 설치를 위한 파일을 저장할 위치를 알려줍니다. 이 줄은 username=yourusername사용자가 yourusernameschroot를 사용할 수 있음을 나타냅니다. 이 행은 groups=users,admin두 그룹의 사용자가 schroot를 사용할 수 있음을 나타냅니다. 지시어를 배치할 수도 있습니다 users=….

새 릴리스 설치

디렉토리를 생성하고 debootstrap으로 채우기를 시작합니다. Debootstrap은 지정된 배포 및 아키텍처에 대한 핵심 패키지 세트를 다운로드하고 설치합니다.

mkdir /32
debootstrap --arch i386 lucid /32 http://archive.ubuntu.com/ubuntu

이제 거의 작동하는 시스템이 완성되었습니다. 다음은 몇 가지 사소한 개선 사항입니다. Schroot를 실행하면 여러 파일 /32/etc, 특히 DNS 구성 /etc/resolv.conf, 사용자 데이터베이스 /etc/passwd및 기타 파일을 자동으로 덮어씁니다(덮어쓸 수 있음, 설명서 참조). 일부 파일을 완전히 수동으로 복사해야 할 수도 있습니다.

cp -p /etc/apt/apt.conf /32/etc/apt/      # for proxy settings
cp -p /etc/apt/sources.list /32/etc/apt/  # for universe, security, etc
cp -p /etc/environment /32/etc/           # for proxy and locale settings
cp -p /etc/sudoers /32/etc/               # for custom sudo settings

chroot 에는 파일이 없습니다 /etc/mtab. 나는 이 명령을 chroot 내에서 수동으로 사용하는 것이 아니라 외부에서 사용하는 것을 /etc/fstab권장합니다 . 그러나 명령이 합리적으로 잘 작동 하도록 mount충분히 좋은 명령을 작성하십시오 ./etc/mtabdf

ln -s /proc/mounts /32/etc/mtab

유형을 사용하면 directoryschroot가 실행됩니다.번들 설치여러 디렉터리, 즉 이러한 디렉터리는 상위 설치와 공유됩니다: /proc, /dev, /home, /tmp.

chroot의 서비스

여기서 언급했듯이 schroot는 데몬 실행에 적합하지 않습니다. schroot를 종료하면 schroot의 프로그램이 종료됩니다. 보다 지속성을 높이려면 "카탈로그" schroot 대신 "일반" schroot를 사용하고 /etc/fstab상위 설치에서 영구 바인드 마운트를 설정하십시오.

Debian 및 Ubuntu에서는 설치 중에 서비스가 자동으로 시작됩니다. 이를 방지하려면(특히 네트워크 포트가 공유되기 때문에 chroot 외부에서 실행되는 서비스가 중단될 수 있음)정책chroot에서 서비스를 실행하지 마십시오. 다음 스크립트를 다음으로 설정합니다./32/usr/sbin/policy-rc.d실행 가능하게 만듭니다( chmod a+rx /32/usr/sbin/policy-rc.d).

#!/bin/sh
## Don't start any service if running in a chroot.
## See /usr/share/doc/sysv-rc/README.policy-rc.d.gz
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
  exit 101
fi

새 시스템 채우기

이제 chroot를 사용할 수 있습니다. 이 시점에서는 더 많은 패키지를 설치해야 합니다.

schroot -c lucid32
sudo apt-get update
apt-get install lsb-core nano
...

다음과 같은 로케일을 생성해야 할 수도 있습니다.

locale-gen en_US en_US.utf8

schroot가 8.04(hardy)와 같은 이전 버전의 Ubuntu용인 경우 ubuntu-standard 패키지에 MTA가 도입되어 있다는 점에 유의하세요. nullmailer기본값 대신 선택하십시오 postfix(chroot가 메일을 보내기를 원할 수도 있지만 메일을 받기를 원하지 않을 수도 있습니다).

더 나아가

자세한 내용은 다음을 참조하세요.schroot수동, 이것슈루트 FAQ그리고 schroot.conf수동. 슈루트는데비안 자동 빌더(buildd) 프로젝트. 다른 유용한 팁이 있을 수 있습니다.debootstrap에 대한 우분투 커뮤니티 페이지.

가상 기기

백업 환경을 완전히 격리해야 하는 경우 가상 머신을 사용하세요.키보드 가상 머신(qemu-kvm qemu-kvm 설치) 또는가상 상자.

답변2

~부터우분투11.04(자연) 및더반7.0(헐떡임) 출시다중 아키텍처예, 32비트 및 64비트 라이브러리는 시스템에 공존할 수 있습니다. 32비트 라이브러리 libXX를 설치하려면 먼저 필요한 32비트 아키텍처를 시스템에 추가하십시오.

sudo dpkg --add-architecture i386
sudo apt-get update

그런 다음 32비트 라이브러리를 설치합니다.

sudo apt-get install libXX:i386

ia32-libs 패키지. Ubuntu 12.04부터는 더 이상 라이브러리가 포함되지 않으며 libXX:i386패키지만 종속성으로 도입됩니다.

C 및 C++ 프로그램의 경우 컴파일 부분은 매우 쉽습니다. 또는 -m32에 추가 하면 결과 프로그램이 32비트가 됩니다.CFLAGCXXFLAG

export CFLAGS="-m32"
gcc main.c -o main

이는 makefile 기반 프로젝트에도 적용됩니다.

답변3

32비트 바이너리만 있고 최신 64비트 Debian/Ubuntu 시스템에서 실행하려면 다음을 수행하세요.

dpkg --add-architecture i386
apt update
apt install libc6-i386

이는 Debian 9에서 테스트되었습니다.

답변4

나는 이것을 Docker 솔루션으로 작성했습니다.https://bbosmith.medium.com/running-32-bit-i386-applications-on-64-bit-arm-using-docker-de7a198914a2. Docker는 이 솔루션을 실행하는 모든 곳에서 작동합니다. 설정을 적절하게 변경하기만 하면 됩니다.

Docker 이미지를 사용할 수 있는 모든 플랫폼에서 32비트 애플리케이션을 실행하는 방법에 대한 답이 있습니다. 죄송합니다. 이 답변에는 컴파일이 포함되지 않습니다. 하지만 다른 플랫폼용 바이너리를 실행하는 데에는 매우 간단하고 강력하므로 출시할 가치가 있습니다.

date64비트 인스턴스의 32비트 Debian 인스턴스에서 실행하고 싶다고 가정해 보겠습니다 . 분명히 이것은 인공적인 것입니다. 원하는 바이너리를 삽입하십시오.

먼저 32비트 Linux를 지원하는 플랫폼이 사용 가능하다는 것을 증명하십시오.

host $ docker buildx imagetools inspect debian
Name:      docker.io/library/debian:latest
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest:    sha256:e97ee92bf1e11a2de654e9f3da827d8dce32b54e0490ac83bfc65c8706568116

Manifests:
  Name:      docker.io/library/debian:latest@sha256:c2cedd7f80a4dd0f9f80d3699bd433ccf3de33ab63bfa2d4c4ba870c998222d6
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/amd64

  Name:      docker.io/library/debian:latest@sha256:e2e12679dbb45a942e627756196cc8a87182c5de53000b021a051733422e1d45
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/arm/v5

  Name:      docker.io/library/debian:latest@sha256:2acb8966cd93f0928d5ed57116849afae60eb8603797ca9b34801620d35236d9
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/arm/v7

  Name:      docker.io/library/debian:latest@sha256:6496a3400e12fbff53da7318b304405a5cb2f185a74bdb4458dcc4b645839380
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/arm64/v8

  Name:      docker.io/library/debian:latest@sha256:0877f432f15595d9754cdd7c01e8afd53767db4b515b9a47d3e67e1e2f40f520
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/386

  Name:      docker.io/library/debian:latest@sha256:f464ff1c8422dce7ce2f9c179b7e39a680748b4d0e3e074ad705cf84d4372a0c
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/mips64le

  Name:      docker.io/library/debian:latest@sha256:5105fb4c3f037b0a6278c3ae1f0320ff1e169a3d7cfb0ca7a7b51f8657039c21
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/ppc64le

  Name:      docker.io/library/debian:latest@sha256:c5bfba100bac4c910c69710efe8a07b4b39d547f3c75722944eb741845742936
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/s390x

예! Platform: linux/386.

그렇지 않다면 데비안(이 경우 사용됨) 대신 다른 이미지를 시도하거나 오리 검색을 수행해야 합니다.

다음으로 Dockerfile을 작성합니다.

FROM debian

ENTRYPOINT ["date"]

ENTRYPOINT 형식을 사용하면 exec매개변수를 전달할 수 있습니다."+DATE: %D%nTIME: %T"

바라보다https://docs.docker.com/reference/dockerfile/#shell-and-exec-form

빌드하세요:

host $ docker buildx build --platform <target for build> -t <dockeruser>/<dockerImageToBuild>:latest \
     --push .

예를 들어.

host $ docker buildx build --platform linux/386 -t bbos/dateegforso:latest --push .

태그 이름( bbos/dateegforso)은 모두 소문자여야 합니다.

그러면 빌드 이미지가 Bob의 docker.io 저장소로 푸시됩니다. 푸시는 필요하지 않지만 이미지는 전역적으로 유지됩니다.

이 푸시를 활성화하려면 로그인해야 합니다.

docker login

다음 명령을 사용하여 실행하십시오.

docker run --init --platform <platform to run if multiple> <dockeruser>/<dockerImageToBuild>:latest <args>

예를 들어.

docker run --init --platform linux/386 bbos/dateegforso:latest "+DATE: %D%nTIME: %T"

(이미지가 현재 존재하며 명령은 있는 그대로 작동해야 합니다.)

--init필수는 아니지만 장기간 실행되는 작업이 있고(분명히 그렇지 않음 date) 해당 작업을 종료해야 하는 경우 필요합니다. 그렇지 않으면 ctrl-c라라랜드로 보내세요.

docker가 실행되는 어느 곳에서나 실행할 수 있습니다. x64 리눅스, AMD, AARM64, ..

관련 정보