2015/08/19

Debian/Ubuntuで32bit/64bitそれぞれのパッケージを管理できるMultiarchについて

Debian/Ubuntuで複数のアーキテクチャ向けのパッケージを管理するための “Multiarch” と呼ばれる仕組みについて過去に何度か触れてきたが、ここで改めてまとめておく。

元の記事は2011年11月に書かれたが、対応のあまり進んでいない時期に書かれており内容が古いことなどから、ほとんどの内容を書き直している。

  1. Multiarchとその対応時期
  2. パッケージ管理時のアーキテクチャの指定
    1. アプリケーションのアーキテクチャ指定
  3. ライブラリの配置ディレクトリ

Multiarchとその対応時期

x86_64版のDebian/Ubuntuでは64bit版のプログラムやライブラリと32bit版のそれらの両方を動かすことができるが、ライブラリの配置ディレクトリは別々の場所にする必要があり、古いDebian/Ubuntuでは/lib//usr/lib/が64bit版のライブラリ用に使用され、32bit版はlib32という新しいディレクトリに含まれる形となっていた。[1]また、32bit用のライブラリはパッケージ管理上うまく扱う仕組みがなく、幾つかの32bit版ライブラリをひとまとめにした形の “ia32-libs” と呼ばれるパッケージが提供されていた。

Multiarchに対応した環境[2]ではパッケージが(衝突しない範囲で)各アーキテクチャごとに管理できるようになっており、ライブラリの配置ディレクトリも工夫されている(見出し:ライブラリの配置ディレクトリを参照)。これにより、異なるアーキテクチャ向けの同一ライブラリを同一のOS環境に共存かつ個別にインストールできるようになっている。

x86_64版のDebian/UbuntuではMultiarchに対応後 “ia32-libs” パッケージが廃止され、同パッケージに含まれていたライブラリは個別の32bit版ライブラリのパッケージとしてインストールされるようになっている。

OS環境のMultiarchへの対応は

  • Debianではwheezy(2013年)
  • Ubuntuでは2011年から2012年にかけてのバージョン

で行われており、本記事が公開されている時点では既に対応済みとなっている。

パッケージ管理時のアーキテクチャの指定

apt-getなどのコマンドでは名前の末尾に “:[アーキテクチャ文字列]” を付けることで操作したいアーキテクチャを選択できる。x86_64版のDebian/Ubuntuでは “:i386” が32bit版、 “:amd64” が64bit版の指定となる。

(32bit版GTK+ 3をインストールする例)
$ sudo apt-get install libgtk-3-0:i386

(32bit版GTK+ 3のファイル一覧を表示)
$ dpkg-query --listfiles libgtk-3-0:i386

Synapticでは左下にあるパッケージ一覧の種類を選択するボタンの中から “Architecture (アーキテクチャ)” を選択すると

  • arch: all (アーキテクチャ非依存)
  • arch: amd64 (64bit用)
  • arch: i386 (32bit用)

から対象アーキテクチャを選択することができ、更にクイック検索を使用してパッケージを絞り込むことで特定のアーキテクチャ向けのパッケージが検索できる。

Synapticでアーキテクチャを選択した状態でパッケージをクイック検索

アプリケーションのアーキテクチャ指定

アーキテクチャの指定ができるのはライブラリだけではなく、一部のアプリケーションでも指定することができる。

x86_64版のDebian/Ubuntuでは末尾に “:i386” の付いたアプリケーションのパッケージを選択することで64bit版の代わりに32bit版をインストールすることができ、場合によってはメモリ使用量が少なくなるなどメリットもあるが、動作が64bit版のパッケージより遅くなるものもある。

ライブラリの配置ディレクトリ

x86_64版のDebian/Ubuntuでは、従来の/lib/以下のライブラリは/lib/x86_64-linux-gnu/(64bit版)と/lib/i386-linux-gnu/(32bit版)とに分かれている。ただし/lib/自体は残っており、特別なサブディレクトリ(例:カーネルモジュール用ディレクトリ/lib/modules/)などが配置されている他、一部のMultiarchに対応していないライブラリが配置されていることがある。

同様に、従来の/usr/lib/以下のライブラリは/usr/lib/x86_64-linux-gnu/(64bit版)と/usr/lib/i386-linux-gnu/(32bit版)とに分かれており、/usr/lib/には特別なサブディレクトリ(例:Mono関係のライブラリ用ディレクトリ/usr/lib/mono/やMozilla系ブラウザのプラグイン用ディレクトリ/usr/lib/mozilla/など)や一部ライブラリが配置されている。

使用したバージョン:
  • APT 1.0.9.7ubuntu4.1
  • Synaptic 0.81.3
[1]: RPM系のディストリではlibディレクトリは32bit用で、64bit用ライブラリがlib64というディレクトリに入っている
[2]: パッケージを扱うツール側と各ライブラリのパッケージの両方の対応が必要