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
패키지에는 기본 32비트 라이브러리 세트와 이 라이브러리에 의존할 수 있는 다른 패키지가 있습니다. 필요한 라이브러리가 모두 있으면 32비트 실행 파일이 실행되어야 합니다. 개발을 위해 설치gcc-multilib
, 그리고 이에 의존할 수 있는 다른 패키지, 예를 들어 다음과 같은 패키지를 g++-multilib
찾을 수 있습니다.binutils-multiarch
유용하기도 하고,ia32-libs-dev
데비안에서. ix86용으로 컴파일하려면 옵션을 -m32
gcc에 전달하세요.
어떤 32비트 사용자 모드 구성 요소를 설치했는지에 관계없이 64비트 커널을 실행 중인지 여부 는 uname -m
계속 표시됩니다 . x64_64
아래에 설명된 Schroot가 이 문제를 처리합니다.
슈루트
이 섹션은 다른 Linux 배포판 "내부"에 Debian 계열 배포판을 설치하는 방법을 안내합니다. 64비트 우분투 안에 32비트 우분투를 설치하라는 문구가 있지만 데비안 안정 내부에 불안정한 데비안을 설치하거나 그 반대의 경우와 같은 다른 상황에 적용하려면 약간 수정해야 합니다.
소개하다
아이디어는 하위 트리에 대체 배포판을 설치하고 거기에서 실행하는 것입니다. 이 방법으로 64비트 시스템 위에 32비트 시스템을 설치하거나, 다른 버전의 배포판을 설치하거나, 다른 패키지 세트로 테스트 환경을 설치할 수 있습니다.
이것chroot
명령과 시스템 호출은 디렉토리 트리의 하위 트리로 제한된 파일 시스템 보기로 프로세스를 시작합니다. 데비안과 우분투 릴리스슈루트, 이 기능을 중심으로 보다 유용한 하위 환경을 생성하는 유틸리티입니다.
설치하다schroot
팩 (더반)그리고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=/32
schroot에게 32비트 설치를 위한 파일을 저장할 위치를 알려줍니다. 이 줄은 username=yourusername
사용자가 yourusername
schroot를 사용할 수 있음을 나타냅니다. 이 행은 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/mtab
df
ln -s /proc/mounts /32/etc/mtab
유형을 사용하면 directory
schroot가 실행됩니다.번들 설치여러 디렉터리, 즉 이러한 디렉터리는 상위 설치와 공유됩니다: /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 ) 또는가상 상자.
답변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비트가 됩니다.CFLAG
CXXFLAG
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비트 애플리케이션을 실행하는 방법에 대한 답이 있습니다. 죄송합니다. 이 답변에는 컴파일이 포함되지 않습니다. 하지만 다른 플랫폼용 바이너리를 실행하는 데에는 매우 간단하고 강력하므로 출시할 가치가 있습니다.
date
64비트 인스턴스의 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, ..