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-c7 package または port を使う方法です。port をインストールするには、 以下のコマンドを実行してください。
#
pkg install emulators/linux_base-c7
起動時から Linux® 互換機能を有効にする場合には、
/etc/rc.conf
に以下の行を追加してください。
linux_enable="YES"
64 ビットのコンピュータでは、
/etc/rc.d/abi
により 64 ビット互換のためのモジュールは自動的に読み込まれます。
Linux® バイナリ互換機能のレイヤには、(64 ビット x86 ホストにおける) 32 および 64 ビット Linux バイナリのサポートが追加されたため、 エミュレーション機能をカスタムカーネルに静的にリンクする必要はありません。
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® のバイナリも追加の作業をせずに動作させることができるようになります。
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 バイナリに自動的に適切なマークを付加するようになったので、 この作業は通常必要ありません。
Linux® RPM
ベースのアプリケーションをインストールするには、
最初に archivers/rpm4 package または
port をインストールしてください。
インストールすると、このコマンドを
root
権限で使うことで、
.rpm
をインストールできます。
#
cd /compat/linux
#
rpm2cpio < /path/to/linux.archive.rpm | cpio -id
必要に応じて、インストールした ELF
バイナリに brandelf
を実行してください。
綺麗にアンインストールできないかもしれませんので注意してください。
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
を削除してください。
本文書、および他の文書は https://download.freebsd.org/ftp/doc/ からダウンロードできます。
FreeBSD に関する質問がある場合には、
ドキュメント を読んだ上で
<questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、
<doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。