64 비트 데비안 / 우분투에서 32 비트 프로그램을 어떻게 실행합니까?


74

64 비트 (amd64 일명 x86_64) 데비안 또는 우분투 설치가 있습니다. 때때로 32 비트 (i386 / i686) 프로그램을 실행하거나 32 비트 시스템 용 프로그램을 컴파일해야합니다. 최소한의 소란으로 어떻게 할 수 있습니까?

보너스 : 이전 또는 최신 버전의 배포판으로 실행하거나 테스트하려면 어떻게해야합니까?


답변:


52

기본 지원

데비안과 우분투는 우분투 11.04와 데비안 wheezy (7.0)부터 다중 아키텍처를 지원합니다. 동일한 시스템에서 x86_32 (i386) 및 x86_64 (amd64) 패키지를 간단한 방식으로 혼합 할 수 있습니다. 이것을 다중 아키 텍 지원 이라고 합니다. 자세한 내용 은 warl0ck의 답변 을 참조하십시오.

이전 릴리스에서 데비안과 우분투는 amd64에 많은 32 비트 라이브러리를 제공합니다. 기본 32 비트 라이브러리 세트와이 라이브러리에 종속 된 다른 패키지를 갖도록 패키지를 설치하십시오 . 필요한 모든 라이브러리가있는 경우 32 비트 실행 파일 만 실행하면됩니다. 개발을 위해서는을 설치 하고 다른 패키지 ( 예 :)를 설치 하십시오 . 당신은 찾을 수 있습니다 뿐만 아니라 유용하고, 데비안에. 패스 ix86에 대한 컴파일하려면 GCC에 대한 옵션을 선택합니다.ia32-libs ia32-libs 설치gcc-multilib gcc-multilib 설치g++-multilibbinutils-multiarch binutils-multiarch 설치ia32-libs-dev-m32

참고 uname -m여전히 표시됩니다 x64_64에 관계없이 설치 한 것을 32 비트 사용자 모드 구성 요소로, 64 비트 커널을 실행하는 경우. 아래 설명 된 Schroot가이를 처리합니다.

슈 루트

이 섹션은 데비안과 같은 배포판을 다른 Linux 배포판의 "내부"에 설치하기위한 안내서입니다. 64 비트 우분투 내부에 32 비트 우분투를 설치한다는 측면에서 사용되지만 데비안 스 테이블 내부에 데비안을 불안정하게 설치하거나 그 반대의 경우와 같이 다른 상황에는 약간 수정하여 적용해야합니다.

소개

아이디어는 서브 트리에 대체 배포를 설치하고 그로부터 실행하는 것입니다. 이런 식으로 64 비트 시스템이나 다른 배포판 또는 다른 패키지 세트가 설치된 테스트 환경에 32 비트 시스템을 설치할 수 있습니다.

chroot명령 및 시스템 호출은 디렉토리 트리의 하위 트리로 제한있어 파일 시스템의 전망을 감상 할 수있는 프로세스를 시작합니다. 데비안과 우분투는 schroot ( 이 기능을 둘러싼 유틸리티)를 제공하여보다 유용한 하위 환경을 만듭니다.

설치 schroot패키지 schroot 설치 ( 데비안 )와 debootstrap패키지 debootstrap 설치 ( 데비안 ). 부트 스트랩은 대체 배포판 설치에만 필요하며 나중에 제거 할 수 있습니다.

schroot 설정

이 예는 32 비트 Ubuntu 10.04LTS (lucid lynx) 대체 환경을 설정하는 방법을 설명합니다. 비슷한 설정이 데비안과 우분투의 다른 릴리스에서도 작동합니다. /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

파일 /etc/mtab이나 /etc/fstabchroot 에는 없습니다 . mountchroot에서 수동으로 명령을 사용하지 않는 것이 좋습니다 . 외부에서 수행하십시오. 그러나 합리적 /etc/mtab으로 df작동하는 등의 명령을 작성하기에 충분 하도록 작성하십시오 .

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

directory유형, schroot이 수행 바인드 마운트 해당 디렉토리가 부모의 설치와 공유됩니다 즉, 디렉토리의 수를 : /proc, /dev, /home, /tmp.

chroot의 서비스

여기에 설명 된 것처럼 schroot는 데몬을 실행하기에 적합하지 않습니다. schroot를 종료하면 schroot의 프로그램이 종료됩니다. 보다 영구적 인 것을 원한다면“디렉토리”schroot 대신“plain”schroot를 사용 /etc/fstab하고 부모 설치 에서 영구 바인드 마운트를 설정하십시오.

데비안과 우분투에서는 설치시 서비스가 자동으로 시작됩니다. 이를 방지하려면 (특히 네트워크 포트가 공유되어 있기 때문에 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 표준 패키지가 MTA를 가져옵니다. nullmailer기본값 대신 선택하십시오 postfix(chroot는 메일을 보내길 원하지만 메일을받지 않으려는 것은 아닙니다).

더 나아 가기

자세한 내용은 참조 schroot설명서schroot 자주 묻는 질문schroot.conf매뉴얼을 . Schroot는 데비안 autobuilder ( 빌드 ) 프로젝트의 일부입니다 . debootstrap 에 대한 Ubuntu 커뮤니티 페이지에 유용한 추가 정보가있을 수 있습니다 .

가상 기기

대체 환경을 완전히 분리해야하는 경우 KVM ( qemu-kvm qemu-kvm 설치 ) 또는 VirtualBox 와 같은 가상 머신을 사용하십시오 .


@Gilles [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]상태에 대한 설명을 추가 할 수 있습니까 ?
Faheem Mitha

1
@FaheemMitha 스크립트가 chroot에서 실행 중인지 테스트합니다 . chroot 설치를 독립형 시스템으로 부팅 할 수 있습니다.
Gilles

users=faheem예제 와 같은 줄을 추가하는 것이 좋습니다 . 기본적으로 저는 적어도 사용자 그룹의 구성원이 아닙니다. 그러나 나는 기대했을 것입니다.
Faheem Mitha

25

Ubuntu 11.04 (natty)와 Debian 7.0 (wheezy)은 멀티 아치 지원을 도입 했기 때문에 32 비트 및 64 비트 라이브러리가 하나의 시스템에 공존 할 수 있습니다. 32 비트 라이브러리 libXX를 설치하려면 먼저 필요한 32 비트 아키텍처를 시스템에 추가하십시오.

우분투의 경우 :

sudo dpkg --foreign-architecture i386

그리고 데비안의 경우 :

sudo dpkg --add-architecture i386

그런 다음 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 기반 프로젝트에서도 작동합니다.


2
apt-get install ia32-libs나를 위해 일했습니다 (13.04)!
Étienne

1
우분투 14.04의 경우 "sudo dpkg --add-architecture i386"
diyism

예를 들어, Debian Jessie의 경우 : dpkg --add-architecture i386; 적절한 업데이트; apt-get install libstdc ++ 5 : i386 libpam0g : i386
Jonathan Ben-Avraham

0

32 비트 바이너리가있는 경우 최신 64 비트 데비안 / 우분투 시스템에서 실행하려면 다음을 수행하십시오.

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

이것은 데비안 9에서 테스트되었습니다.


1
sudo apt-get install lib32z1도움이된다면 특정 32 비트 실행 파일 도 필요 했습니다. 오류는 sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory입니다. 예, 2019 년이며 sqlite 프로젝트에서 지원하는 사전 컴파일 된 64 비트 sqlite3 클라이언트를 찾을 수 없습니다 : (이 공유 리소스에 설치할 수있는 것이 제한되어 있으므로 사전 컴파일 된 sqlite 패키지를 풀다운해야합니다. 고맙게도 설치할 수 lib32z1있습니다
harperville
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.