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) パッケージを同じシステムで簡単な方法で混在させることができます。これをマルチアーキテクチャサポートと呼びます。Ubuntuまたはダーバン詳しくはWikiをご覧ください。

バラよりウォーカーの答えシンプルで最新の答えを入手してください。


以前のバージョンの場合

以前のバージョンでは、DebianとUbuntuはamd64に多くの32ビットライブラリが付属していました。インストールするia32-libs ia32-libsのインストールパッケージには、デフォルトの32ビットライブラリセットと、このライブラリに依存できる他のパッケージがあります。必要なライブラリがすべてある場合は、32ビット実行可能ファイルを実行する必要があります。開発用インストールgcc-multilib gcc-multilibのインストール、そしてそれに依存できる他のパッケージ、例えば次のようなパッケージをg++-multilib見つけることができます。binutils-multiarch binutils-multiarchのインストール役に立ったり、ia32-libs-devDebian で。 ix86用にコンパイルするには、オプションを-m32gccに渡します。

どの32ビットユーザーモードコンポーネントをインストールしたかに関係なく、64ビットカーネルを実行しているかどうかは引き続きuname -m表示されます。x64_64以下で説明する Schroot はこの問題を処理します。

シュルート

このセクションでは、他のLinuxディストリビューション「内部」にDebianファミリディストリビューションをインストールする方法について説明します。 64 ビット Ubuntu 内に 32 ビット Ubuntu をインストールするためのフレーズがありますが、Debian 安定の内部に不安定な Debian をインストールしたり、その逆の場合などの他の状況に適用したい場合は、少し修正する必要があります。

紹介する

アイデアは、サブツリーに代替ディストリビューションをインストールし、そこで実行することです。これにより、64ビットシステムの上に32ビットシステムをインストールしたり、異なるバージョンのディストリビューションをインストールしたり、異なるパッケージセットでテスト環境をインストールしたりできます。

これchrootコマンドとシステムコールは、ディレクトリツリーのサブツリーに限定されたファイルシステムビューでプロセスを開始します。 Debian と Ubuntu リリースシュルート、この機能を中心に、より便利なサブ環境を生成するユーティリティです。

インストールする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,admin2 つのグループのユーザーが 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手動。シュルートはDebian Auto Builder (buildd) プロジェクト。他の便利なヒントがあるかもしれません。debootstrapのUbuntuコミュニティページ

仮想デバイス

バックアップ環境を完全に分離する必要がある場合は、仮想マシンを使用してください。キーボード仮想マシンqemu-kvm qemu-kvmのインストール) または仮想ボックス

答え2

~からUbuntu11.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

そうでない場合は、Debian(この場合は使用されます)の代わりに別の画像を試すか、アヒル検索を実行する必要があります。

次に、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 Linux、AMD、AARM64、..

関連情報