64ビット(AMD64 a.k.a. x86_64)のDebianまたはUbuntuをインストールしています。 32ビット(i386/i686)プログラムをときどき実行するか、32ビットシステム用にプログラムをコンパイルする必要があります。最小限の手間でこれを行うにはどうすればよいですか?
おまけ:古いまたは新しいリリースのディストリビューションで実行またはテストしたい場合はどうなりますか?
Ubuntu 11.04とDebian wheezy(7.0)以降、DebianとUbuntuはマルチアーチをサポートしています。x86_32(i386)とx86_64(AMD64)のパッケージを同じシステムで簡単に混在させることができます。これは multiarch support として知られています。詳細は warl0ckの回答 を参照してください。
以前のリリースでは、DebianとUbuntuにはAMD64に多数の32ビットライブラリが付属しています。インストール ia32-libs
32ビットライブラリの基本セット、およびおそらくこれに依存する他のパッケージを持つパッケージ。必要なライブラリがすべて揃っていれば、32ビットの実行可能ファイルは単純に実行されるはずです。開発の場合、インストール gcc-multilib
、そしておそらくg++-multilib
など、それに依存する他のパッケージ。 binutils-multiarch
も便利で、Debianでは ia32-libs-dev
です。 -m32
オプションをgccに渡して、ix86用にコンパイルします。
インストールした32ビットのユーザーモードコンポーネントに関係なく、64ビットのカーネルを実行している場合でも、uname -m
にはx64_64
が表示されます。以下で説明するSchrootがこれを処理します。
このセクションは、Debianのようなディストリビューションを別のLinuxディストリビューションの「内部」にインストールするためのガイドです。これは、32ビットUbuntuを64ビットUbuntuの内部にインストールするという言葉で表現されていますが、Debian不安定版をDebian安定版にインストールしたり、その逆を行ったりするなど、他の状況に小さな変更を加えて適用する必要があります。
アイデアはサブツリーに代替ディストリビューションをインストールし、そこから実行することです。その方法で64ビットシステムに32ビットシステムをインストールしたり、ディストリビューションの別のリリースをインストールしたり、さまざまなパッケージセットがインストールされたテスト環境をインストールしたりできます。
chroot
コマンドとシステムコールは、ディレクトリツリーのサブツリーに制限されているファイルシステムのビューでプロセスを開始します。 DebianとUbuntuには schroot が同梱されており、この機能をラップしてより使いやすいサブ環境を作成するユーティリティです。
インストール schroot
パッケージ ( Debian )および debootstrap
パッケージ ( Debian )。 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
は、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
のいくつかのファイル、特に/etc/resolv.conf
のDNS設定と/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
または/etc/fstab
というファイルはありません。 chrootでmount
コマンドを手動で使用することはお勧めしません。外部から実行してください。ただし、十分な/etc/mtab
を作成して、df
などのコマンドが適切に機能するようにしてください。
ln -s /proc/mounts /32/etc/mtab
directory
タイプの場合、schrootはいくつかのディレクトリの bind mounts を実行します。つまり、これらのディレクトリは親インストールと共有されます:/proc
、/dev
、/home
、/tmp
。
ここで説明するように、schrootはデーモンの実行には適していません。 schrootを終了すると、schroot内のプログラムは強制終了されます。より永続的にしたい場合は、「ディレクトリ」のschrootではなく「プレーン」のschrootを使用し、親インストールの/etc/fstab
に永続的なバインドマウントを設定します。
DebianおよびUbuntuでは、サービスはインストール時に自動的に開始されます。これを回避するには(特にネットワークポートが共有されているために、chrootの外部で実行されているサービスが中断される可能性があります)、chrootで policy not running servicesを設定します。次のスクリプトを /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
manual 、 schroot FAQ および schroot.conf
manual を参照してください。 Schrootは Debian autobuilder(buildd)プロジェクト の一部です。 buntuコミュニティページのdebootstrapに関する追加の役立つヒント があるかもしれません。
代替環境を完全に分離する必要がある場合は、 [〜#〜] kvm [〜#〜] ( qemu-kvm )または VirtualBox 。
bunt 11.04(natty)および Debian 7.0(wheezy)が導入された multiarch サポートが導入されたため、1つのシステムで32ビットおよび64ビットライブラリが共存できます。 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++プログラムではかなり簡単です。CFLAG
またはCXXFLAG
に-m32
を追加すると、生成されたプログラムが32ビットになります。
export CFLAGS="-m32"
gcc main.c -o main
これはメイクファイルベースのプロジェクトでも機能します。
最新の64ビットDebian/Ubuntuシステムで実行したい32ビットバイナリがある場合は、次のようにします。
dpkg --add-architecture i386
apt update
apt install libc6-i386
これはDebian 9でテストされています。