LGJ Notes

蒙古大夫 2.0。 這裡紀錄的都不是我的專業,我的專業就是不專業。別傻了,什麼是專業?

« 關於波紋號(tilde/swung dash) | Main | 圈數字 »

FreeBSD + GNU/Linux 聯合大作戰(二)
2006/08/03,19:12 :: 點閱次數 (6536)
不可諱言的,目前 GNU/Linux 在市場上是比其他的 free unix-like OS 較受青睞,原因當然很多,這裡暫不探討這些原因。這裡要談的是,各廠商的軟體,只支援 GNU/Linux,而且又非 free/open source 的封閉性軟體的時候,那麼,使用 FreeBSD 的使用者怎麼辦呢?


這些沒有原始碼,又尚未有 FreeBSD native binary 的軟體不少,例如 Adobe PDF Reader®Mathematica®MapleMATLAB®Oracle® 等等,這些軟體有 GNU/Linux binary,但並沒有 FreeBSD binary,而且也沒有原始碼,縱使想自行編譯也拿他們一點辦法也沒有。

在 FreeBSD 有實作 Linux ABI(Application Binary Interface),他能夠很巧妙的在執行 Linux binary 時,把該呼叫的函式,轉為呼叫 Linux 的函式,這樣就能『直接』在 FreeBSD 上執行 Linux binary 了。雖然官方文件仍然沿著歷史的因素,稱呼為 Linux emulator,但他其實並不是模擬器,因為執行時也載入真正的 Linux kernel/lib 供應用軟體呼叫,也因此有人稱他為 Linuxulator。

當然,要達成這樣子的功能,必須先安裝一套 GNU/Linux base system。Linux 核心(系統呼叫的部份)也需先載入 linux 模組(linux.ko)。GNU/Linux base system 可以從 ports 安裝,目前有 Fedora Core/Gentoo/Debian/SuSE 等可供選擇,這樣就行了。

我們就來試試看這個 Linux ABI 的能耐,這裡以 Adobe Reader 來做測試,這個軟體滿常用到的,而前陣子 FreeBSD port 中只有 7.0.1 的版本(目前已經有 7.0.8),由於這個新版本有一些突破性的功能,例如 3D Object,我們就來試試看如何在 FreeBSD 執行 Linux binary。

cd /usr/ports/emulators/linux_base-fc4
make install clean
vi /boot/loader.conf 加入
  linux_load="YES"
或尚未載入而又不想重開機的話,可以使用 kldload 來載入:
  kldload linux
這樣就可以直接執行 Linux binary 了,當然這些 binary 所需要的額外動態函式庫(*.so)要自行 copy 到:
/usr/compat/linux/usr/lib
或
/usr/compat/linux/usr/X11R6/lib
並執行
/usr/compat/linux/sbin/ldconfig
這樣執行 Linux binary 時才找得到所需要的動態函式庫。

Adobe Reader 就比較單純,因為必要的 lib 是本身就有附上,而其他 lib 在所安裝上的 linux_base 中就已經有了,所以只要解開在一個獨立目錄,修改一下 acroread 這個 sh script:

  Linux)
    ACRO_CONFIG=intellinux
把他修改成:
  Linux|FreeBSD)
    ACRO_CONFIG=intellinux
就成了。我個人使用的是英文版的,但有加裝中日韓文字型,所以閱讀不內嵌中日韓文字型的 PDF 就沒有問題了。

AR 7.0.8 on FreeBSD

萬一你要執行的 linux binary,系統無法辨識(較新的 GNU/Linux 所編譯出來的可執行檔大部份情形都可以辨識),例如:

file your_linux_binary | awk '/Linux/ {print $10,$12}'
並沒有輸出任何資料的話(一般 Linux binary 會輸出 `GNU/Linux' 字樣),那麼可以利用 brandelf 把他標示上去:
brandelf -t Linux your_linux_binary
這樣系統就會辨識出他是 GNU/Linux binary。或者由於相關的可執行檔太多,一個一個去修正會很麻煩,我們可以讓系統對於無法辨識的 binary,就把他當做是 GNU/Linux binary:
sysctl kern.fallback_elf_brand=3
想一開機就有這個設定的話,在 /etc/sysctl.conf 加入:
kern.fallback_elf_brand=3
那個 ELF ABI 代號 3 是 ELF 的型態,是由 SCO/USL(Unix Systems Laboratories)所訂定的,要得知目前所能支援的 ELF ABI 代號,可執行:
[edt1023@lgj ~]$ brandelf -l
known ELF types are: FreeBSD(9) Linux(3) Solaris(6) SVR4(0)
即可得知。 這個 Adobe Reader 的例子算是比較單純的,一些複雜些的軟體,可能需要做 lib 的對應(/etc/libmap.conf)。一些大型的商業軟體的使用可以參考: FreeBSD handbook 第十章


相關參考資料:
http://www.bsdforums.org/forums/archive/index.php/t-909.html
http://kerneltrap.org/node/13

迴響

 
Accessible and Valid XHTML 1.0 Strict and CSS Powered by BS2 Blog