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
パッケージには、デフォルトの32ビットライブラリセットと、このライブラリに依存できる他のパッケージがあります。必要なライブラリがすべてある場合は、32ビット実行可能ファイルを実行する必要があります。開発用インストールgcc-multilib
、そしてそれに依存できる他のパッケージ、例えば次のようなパッケージをg++-multilib
見つけることができます。binutils-multiarch
役に立ったり、ia32-libs-dev
Debian で。 ix86用にコンパイルするには、オプションを-m32
gccに渡します。
どの32ビットユーザーモードコンポーネントをインストールしたかに関係なく、64ビットカーネルを実行しているかどうかは引き続きuname -m
表示されます。x64_64
以下で説明する Schroot はこの問題を処理します。
シュルート
このセクションでは、他のLinuxディストリビューション「内部」にDebianファミリディストリビューションをインストールする方法について説明します。 64 ビット Ubuntu 内に 32 ビット Ubuntu をインストールするためのフレーズがありますが、Debian 安定の内部に不安定な Debian をインストールしたり、その逆の場合などの他の状況に適用したい場合は、少し修正する必要があります。
紹介する
アイデアは、サブツリーに代替ディストリビューションをインストールし、そこで実行することです。これにより、64ビットシステムの上に32ビットシステムをインストールしたり、異なるバージョンのディストリビューションをインストールしたり、異なるパッケージセットでテスト環境をインストールしたりできます。
これchroot
コマンドとシステムコールは、ディレクトリツリーのサブツリーに限定されたファイルシステムビューでプロセスを開始します。 Debian と Ubuntu リリースシュルート、この機能を中心に、より便利なサブ環境を生成するユーティリティです。
インストールする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
2 つのグループのユーザーが 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
手動。シュルートはDebian Auto Builder (buildd) プロジェクト。他の便利なヒントがあるかもしれません。debootstrapのUbuntuコミュニティページ。
仮想デバイス
バックアップ環境を完全に分離する必要がある場合は、仮想マシンを使用してください。キーボード仮想マシン(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ビットになります。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
。
そうでない場合は、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、..