64ビットDebian / Ubuntuで32ビットプログラムを実行するにはどうすればよいですか?


74

64ビット(amd64別名x86_64)DebianまたはUbuntuがインストールされています。時々32ビット(i386 / i686)プログラムを実行するか、32ビットシステム用にプログラムをコンパイルする必要があります。どうすれば最小限の手間でこれを行うことができますか?

ボーナス:ディストリビューションの古いリリースまたは新しいリリースで実行またはテストしたい場合はどうすればよいですか?


回答:


52

ネイティブサポート

Ubuntu 11.04とDebian wheezy(7.0)以降、DebianとUbuntuはマルチアーキテクチャをサポートしています。x86_32(i386)とx86_64(amd64)パッケージを同じシステム上で簡単に混在させることができます。これはとして知られているmultiarchのサポートを参照してくださいwarl0ckの答えの詳細については。

古いリリースでは、DebianおよびUbuntuにはamd64に多数の32ビットライブラリが付属しています。パッケージをインストールして、32ビットライブラリの基本セットと、場合によってはこのライブラリに依存する他のパッケージをインストールします。必要なライブラリがすべて揃っている場合、32ビットの実行可能ファイルを実行するだけです。開発の場合は、をインストールします。また、おそらく、それに依存する他のパッケージ(など)をインストールします。Debian やDebian でも役に立つかもしれません。オプションをgccに渡して、ix86用にコンパイルします。ia32-libs ia32-libsをインストールするgcc-multilib gcc-multilibをインストールするg++-multilibbinutils-multiarch binutils-multiarchをインストールするia32-libs-dev-m32

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

シュルート

このセクションは、Debianのようなディストリビューションを別のLinuxディストリビューションの「内部」にインストールするためのガイドです。64ビットのUbuntu内に32ビットのUbuntuをインストールするという用語で表現されていますが、Debian安定版内にDebian不安定版をインストールするなど、他の状況に若干の変更を加えて適用する必要があります。

前書き

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

chrootコマンドとシステムコールは、ディレクトリツリーのサブツリーに制限のファイルシステムの観点でプロセスを開始します。DebianとUbuntuはschrootを出荷します。これは、この機能をラップしてより使いやすいサブ環境を作成するユーティリティです。

インストールschrootパッケージ schrootをインストールするDebianの)およびdebootstrapパッケージ debootstrapをインストールするDebianを使用)。Debootstrapは、代替ディストリビューションのインストールにのみ必要であり、後で削除できます。

schrootをセットアップする

この例では、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は、32ビットインストールのファイルを配置する場所をschrootに伝えます。この行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ではなく「プレーン」schrootを使用/etc/fstabし、親インストールで永続的なバインドマウントを設定します。

DebianおよびUbuntuでは、インストール時にサービスが自動的に開始されます。これを回避するには(特にネットワークポートが共有されているためにchrootの外部で実行されているサービスを中断する可能性があります)、chrootでサービスを実行しないというポリシーを確立します。次のスクリプトをasとして/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マニュアルschrootよくある質問schroot.confマニュアルをSchrootDebian autobuilder(buildd)プロジェクトの一部です。Ubuntuコミュニティページにdebootstrapに関する追加の役立つヒントがあります。

仮想マシン

代替環境を完全に分離する必要がある場合は、KVMqemu-kvm qemu-kvmをインストールする)やVirtualBoxなどの仮想マシンを使用します。


@Gilles [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]条件の実行内容の説明を追加できますか?
ファヒームミサ14

1
@FaheemMitha スクリプトがchrootで実行されているかどうかをテストします。スタンドアロンシステムとしてchrootインストールの起動をサポートするためにあります。
ジル14年

users=faheemあなたの例のような行を追加することをお勧めします。デフォルトでは、少なくとも私にとっては、ユーザーグループのメンバーではありません。しかし、私はそうなると思っていたでしょう。
ファヒームミタ14

25

ためのUbuntu 11.04(粋)とのDebian(喘鳴)7.0導入multiarchサポートを、32ビットと64ビットのライブラリは、1つのシステム上で共存することができます。32ビットライブラリlibXXをインストールするには、まず必要な32ビットアーキテクチャをシステムに追加します。

Ubuntuの場合:

sudo dpkg --foreign-architecture i386

Debianの場合:

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

これは、メイクファイルベースのプロジェクトでも機能します。


2
apt-get install ia32-libs私のために働いた(13.04)!
エティエンヌ

1
Ubuntu 14.04の場合、「sudo dpkg --add-architecture i386」
-diyism

たとえば、Debian Jessieの場合:dpkg --add-architecture i386; apt-get update; apt-get install libstdc ++ 5:i386 libpam0g:i386
ジョナサンベンアブラハム

0

最新の64ビットDebian / Ubuntuシステムで実行したい32ビットバイナリがある場合は、次を実行します。

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

これはDebian 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.