10.2. 設定 Linux® Binary 相容性
前一頁 | 章 10. Linux® Binary 相容性 | 下一頁

## 10.2. 設定 Linux® Binary 相容性

Linux® 程式庫預設並不會安裝，且並不會開啟 Linux® Binary 相容性。 Linux® 程式庫可以手動安裝或是從 FreeBSD Port 套件集安裝。

在嘗試編譯 Port 前，要載入 Linux® 核心模組，否則編譯會失敗：

    # kldload linux

對 64-位元的相容性：

    # kldload linux64

確認模組已載入：

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

在 FreeBSD 安裝基本的 Linux® 程式庫和 Binary 最簡單的方式是安裝 emulators/linux_base-c6 套件或是 Port 。要安裝 Port：

    # pkg install emulators/linux_base-c6

要在開機時開啟 Linux® 相容性，可以加入這行到 `/etc/rc.conf`：

    linux_enable="YES"

在 64-位元的機器上，`/etc/rc.d/abi` 會自動載入用來做 64-位元模擬的模組。

Since the Linux binary compatibility layer has gained support for running both 32- and 64-bit Linux binaries (on 64-bit x86 hosts), it is no longer possible to link the emulation functionality statically into a custom kernel.

### 10.2.1. 手動安裝其他程式庫

若有 Linux® 應用程式在設定 Linux® Binary 相容性後出現缺少共用程式庫的情況，確認這個 Linux® Binary 需要哪個共用程式庫並手動安裝。

在 Linux® 系統，可使用 `ldd` 來找出應用程式需要哪個共用程式庫。 例如，檢查 `linuxdoom` 需要哪個共用程式庫，在有安裝 Doom 的 Linux® 系統執行這個指令：

    % ldd linuxdoom
    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`。 複製完後，建立符號連結 (Symbolic link) 至輸出結果第一欄的名稱。以這個例子會在 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

若 Linux® 共用程式庫已經存在，並符合 `ldd` 輸出結果第一欄的主要修訂版號，則不需要複製該行最後一欄的檔案，使用既有的程式庫應可運作。若有較新的版本建議仍要複製共用程式庫，只要符號連結指向新版的程式庫，舊版便可移除。

例如，以下程式庫已存在 FreeBSD 系統：

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

且 `ldd` 顯示 Binary 需要使用較新的版本：

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

雖然既有的程式庫只有在最後一碼過時一或兩個版本，程式應該仍可使用稍微舊的版本執行，雖然如此，保險起見還替換既有的 `libc.so` 為較新的版本：

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

一般來說，只有在安裝 Linux® 程式到 FreeBSD 完的前幾次會需要查看 Linux® Binary 相依的共用程式庫。之後系統便有足夠的 Linux® 共用程式庫能夠執行新安裝的 Linux® Binary，便不再需要額外的動作。

### 10.2.2. 安裝 Linux® ELF Binary

ELF Binary 有時候需要額外的步驟。當執行無商標 (Unbranded) 的 ELF Binary，會產生錯誤訊息：

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

要協助 FreeBSD 核心區別是 FreeBSD ELF Binary 還是 Linux® Binary，可使用 brandelf(1)：

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

由於 GNU 工具鏈會自動放置適當的商標資訊到 ELF Binary，通常不需要這個步驟。

### 10.2.3. 安裝以 Linux® RPM 為基礎的應用程式

要安裝 Linux® RPM 為基礎的應用程式，需先安裝 archivers/rpm4 套件或 Port。安裝完成之後，`root` 可以使用這個指令安裝 `.rpm`：

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

如果需要， `brandelf` 已安裝的 ELF Binary。注意，這將會無法乾淨地解除安裝。

### 10.2.4. 設定主機名稱解析器

如果 DNS 無法運作或出現這個錯誤：

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

將 `/compat/linux/etc/host.conf` 設定如下：

    order hosts, bind
    multi on

這指定先搜尋 `/etc/hosts`，其次為 DNS。 當 `/compat/linux/etc/host.conf` 不存在， Linux® 應用程式會使用 `/etc/host.conf` 並會警告不相容的 FreeBSD 語法。如果名稱伺服器未設定使用 `/etc/resolv.conf` 的話，則可移除 `bind`。

前一頁 | 上一層 | 下一頁
章 10. Linux® Binary 相容性 | 起始頁 | 10.3. 進階主題

本文及其他文件，可由此下載： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。

若有 FreeBSD 方面疑問，請先閱讀 FreeBSD 相關文件，如不能解決的話，再洽詢 <questions@FreeBSD.org>。
關於本文件的問題，請洽詢 <doc@FreeBSD.org>。