10.2. Linux® バイナリ互換機能の設定

Linux® ライブラリは、デフォルトでは FreeBSD にインストールされません。 また、Linux® バイナリ互換機能も、デフォルトでは有効ではありません。 Linux® ライブラリは、手動もしくは FreeBSD Ports Collection を使ってインストールできます。

port を構築する前に、 linux カーネルモジュールを読み込んでください。 このモジュールを読み込んでいないと、構築に失敗してしまいます。

# kldload linux

64 ビットの互換機能を使うには、以下を実行してください。

# kldload linux64

以下のようにしてモジュールが読み込まれていることを確認してください。

% kldstat
      Id Refs Address    Size     Name
      1    2 0xc0100000 16bdb8   kernel
      7    1 0xc24db000 d000     linux.ko

Linux® ライブラリおよびバイナリの基本セットを FreeBSD システムにインストールする最も簡単な方法は、 emulators/linux-base-c6 package または port を使う方法です。port をインストールするには、 以下のコマンドを実行してください。

# printf "compat.linux.osrelease=2.6.18\n" >> /etc/sysctl.conf
# sysctl compat.linux.osrelease=2.6.18
# pkg install emulators/linux_base-c6

起動時から Linux® 互換機能を有効にする場合には、 /etc/rc.conf に以下の行を追加してください。

linux_enable="YES"

64 ビットのコンピュータでは、 /etc/rc.d/abi により 64 ビット互換のためのモジュールは自動的に読み込まれます。

Linux® バイナリ互換機能をカスタムカーネルに静的にリンクする場合には、 options COMPAT_LINUX をカスタムカーネルのコンフィグレーションファイルに追加してください。 そして、8章FreeBSD カーネルのコンフィグレーション の説明にしたがって新しいカーネルをコンパイルしてインストールしてください。

10.2.1. 手動によるライブラリの追加のインストール

Linux® バイナリ互換機能を設定した後に、Linux® アプリケーションが必要な共有ライブラリが存在しないというエラーを出した場合には、 Linux® バイナリがどの共有ライブラリを必要としているかを確認して、 手動でインストールしてください。

Linux® システムで、ldd を使うことにより、 アプリケーションが必要とする共有ライブラリを調べることができます。 たとえば、linuxdoom が必要とする共有ライブラリを調べるには、 Doom がインストールされている Linux® システム上で、以下のコマンドを実行してください。

% ldd linuxxdoom
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29

Linux® システムでの出力の最後のカラムに表示されているすべてのファイルを FreeBSD システムの /compat/linux の下にコピーしてください。コピーしたら、 最初のカラムに示されるファイル名でコピーしたファイルに対してシンボリックリンクを張ってください。 この例では、FreeBSD システムで以下のようになります。

/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

ldd の出力の最初のカラムに表示されているメジャーバージョンが同じ Linux® 共有ライブラリが既にインストールされている場合は、 最後のコラムにある名前のファイルを新たにコピーする必要はありません。 既にあるライブラリで動作するはずです。 ただ、新しいバージョンの共有ライブラリがある場合には、 コピーすることをお奨めします。 新しいライブラリにシンボリックリンクを変更したら、 古いライブラリは削除してかまいません。

たとえば、以下のライブラリがすでに FreeBSD システムに存在するとします。

/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27

そして、ldd の出力が以下のように、 バイナリが新しいバージョンを必要とする場合を考えます。

libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29

存在しているライブラリの最後の番号が 1 つか 2 つ古いだけなので、 わずかに古いライブラリでもプログラムは動作するはずです。 しかしながら、libc.so を新しいバージョンに置き換えるのが安全です。

/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

通常は、Linux® のバイナリが必要とする共有ライブラリを探す必要があるのは、 FreeBSD のシステムに Linux® のプログラムをインストールする最初の数回だけです。 それが過ぎれば、十分な Linux® の共有ライブラリがシステムに存在するので、 新しくインストールした Linux® のバイナリも追加の作業をせずに動作させることができるようになります。

10.2.2. Linux® の ELF バイナリのインストール

ELF のバイナリを使うためには、 追加の作業が必要です。 マークのない (unbranded) ELF バイナリを実行しようとすると、 以下のようなエラーメッセージが表示されてしまうことでしょう。

% ./my-linux-elf-binary
ELF binary type not known
Abort

FreeBSD のカーネルが FreeBSD の ELF バイナリと Linux® のバイナリとを見分けられるようにするために、brandelf(1) を以下のようにして使ってください。

% brandelf -t Linux my-linux-elf-binary

GNU のツール群が ELF バイナリに自動的に適切なマークを付加するようになったので、 この作業は通常必要ありません。

10.2.3. Linux® RPM ベースのアプリケーションのインストール

Linux® RPM ベースのアプリケーションをインストールするには、 最初に archivers/rpm4 package または port をインストールしてください。 インストールすると、このコマンドを root 権限で使うことで、 .rpm をインストールできます。

# cd /compat/linux
# rpm2cpio < /path/to/linux.archive.rpm | cpio -id

必要に応じて、インストールした ELF バイナリに brandelf を実行してください。 綺麗にアンインストールできないかもしれませんので注意してください。

10.2.4. ホストネームリゾルバの設定

DNS がうまく動作しなかったり、 以下のようなエラーメッセージが表示される場合は、 /compat/linux/etc/host.conf ファイルを以下のように設定する必要があります。

resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword

ファイルの内容を以下のように設定してください。

order hosts, bind
multi on

この設定では /etc/hosts を最初に検索し、 次に DNS を検索するように指定します。 /compat/linux/etc/host.conf が存在しない場合には、 Linux® アプリケーションは /etc/host.conf を使用しようとし、 FreeBSD の文法とは互換性がないと警告を出力します。 /etc/resolv.conf を利用してネームサーバの設定をしていない場合には、 bind を削除してください。

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。