2010/02/09

DD-WRT: 使用 Optware

上一篇提到的 can't resolve symbol 問題,我終於看到了類似的案例:ASUS WL-500gP的library是否支援fstat64函式追蹤。這位使用者試圖嘗試使用 fstat64 這個方法,但這個方法需要新的函式庫 libuClibc-0.9.28.so 才有支援,於是他放到 /jffs/opt/lib 內,取代原有檔案。執行測試程式後,卻發生 can't resolve symbol 的問題。幾經查證之下,原來 /lib 裡就有同名函式庫,系統依照 LD_LIBRARY_PATH 環境變數定義的順序,先找到了 /lib 內的檔案,但這個檔案或許是為了嵌入式系統而特化的而導致沒有這個方法,於是發生錯誤。

這位使用者提出了解套法:修改 LD_LIBRARY_PATH 的搜尋順序,雖然問題解決了,但換 wget 這個程式出問題了,wget 這個指令其實是由內建的 BusyBox 來提供支援的,可能由於載入的函式庫已經不是原本那個特化過的版本,因而發生錯誤。DD-WRT 官方論壇也有人發文 (wget: Segmentation fault),得到的回應是使用套件版的 wget 來解決問題,問題真正的核心依舊沒有解決。

結合上一篇我的「can't resolve symbol 'setlocale'」問題,我們推理一下:由於 DD-WRT 內建的 ipkg 是來自於功能較強大的 OpenWRT,所以它提供的套件所需要的函式庫自然也不同於特化過的 DD-WRT。因此我透過 ipkg 安裝的套件,預設使用的函式庫應該要是 OpenWRT 的 (功能完整的),但現在環境是 DD-WRT (嵌入式特化精簡的)。

又因為執行程式時,環境變數 LD_LIBRARY_PATH 所設定的函式庫載入順序,DD-WRT版的函式庫 (/lib) 一定會比Open-WRT版的 (/jffs/opt/lib) 要來的早載入,因此發生類似的問題。也就是說如果我也採用修改環境變數的方式,讓它讀取到 OpenWRT 版本的函式庫,就可以正常執行,但是這麼一來內建的一些程式就會發生問題 (如 wget)。

這時候我要介紹另一個套件庫Optware。這套函式庫最大的特點在於,它的所有套件在編譯的時候,就已經先定義好了 RPATH (一種指定搜尋函式庫目標的變數) 到 /opt/lib,這個目錄是 Optware 自己的,且 RPATH 的搜尋優先權遠大於環境變數 LD_LIBRARY_PATH。因此我若使用了 Optware 的套件包,它的套件會自己根據內建的 RPATH 搜尋到 Optware 自己的函式庫目錄 /opt/lib,與環境變數毫不衝突。使用它我就不必再為了相容系統跟套件的問題傷透腦筋,因為實際上它們兩個是互不相干的。

另外,Optware 有針對 DD-WRT 作特化。DD-WRT 內建的 ipkg 是直接使用 OpenWRT 的套件,而實際上是有很多套件不能相容的,無法執行。而 Optware 提供的 ipkg-opt 套件卻針對 DD-WRT 進行維護,雖然套件數量遠不及前者,但都是可以正常執行的。

知道了解套法後,我們馬上來安裝看看 Optware。由於並沒有內建的關係,需要執行一些步驟才可以。

前置準備:

先確定系統的 /opt 資料夾可讀寫,並是 ext2/3 檔案系統。因為Optware使用這個目錄,而預設值 DD-WRT 的 /opt 是空的無法操作,所以你必須借助 USB 隨身碟、外接碟甚至是有支援 MMC/SD 卡的機種來加以掛載擴充。檔案系統必須為 ext2/3 就比較麻煩,要先借助 Linux 來格式化,這邊我就先略過不提。

有了空間,還必須掛載。你可以參照第一篇 (Asus WL-520GU 刷 DD-WRT 韌體) 下方 USB 掛載的說明,使用 Automatic Drive Mount 功能來掛載到 /opt。又或者你的 USB 有分區,需要手動掛載特定分區 (修改地方為 系統管理→指令→儲存啟動指令):
mount /dev/scsi/host0/bus0/target0/lun0/part1 /opt

另外,也可能需要開啟 JFFS 功能,儘管 Optware 的套件不會用到。(不確定)

開始安裝:

接著就是安裝 ipkg-opt,Optware的套件管理程式,這需要執行一些程式:
# wget http://www.3iii.dk/linux/optware/optware-install-ddwrt.sh -O - | tr -d '\r' > /tmp/optware-install.sh
# sh /tmp/optware-install.sh
第一行直接貼到 Telnet/SSH 去執行,完成就可以取得安裝的程式檔案 /tmp/optware-install.sh。然後第二行才是執行這個安裝程式,你會見到類似的畫面輸出:
Checking system config ...
Using 192.168.1.1 as default gateway.
Using the following nameserver(s):
nameserver 192.168.1.30
Warning: local nameserver is different than gateway!
Check config or enter:
sed -i s/192.168.*/192.168.1.1/ /tmp/resolv.conf
to correct this.
Installing package uclibc-opt_0.9.28-13_mipsel.ipk ...
Connecting to ipkg.nslu2-linux.org[140.211.166.82]:80
uclibc-opt_0.9.28-12 100% |***********************************************| 832 KB 00:00:00 ETA
Updating /opt/etc/ld.so.cache
......
如果沒有錯誤發生,它應該會在 /opt 目錄下建立 Optware 的結構,並且安裝執行環境跟最重要的 ipkg-opt 套件管理程式,以後就可以使用 ipkg-opt 來取代 DD-WRT 內建的 ipkg 指令。

執行以下指令查看 Optware 的套件庫一覽表,雖然沒有 OpenWRT 的 ipkg 多,卻也是十分豐富了:
# ipkg-opt list|more
abook - 0.5.6-2 - Abook is a text-based addressbook program designed to use with mutt mail client.
ack - 1.90-1 - grep-like text finder
adduser - 1.10.3-1 - a multi-call binary for login and user account administration
adns - 1.4-2 - Asynchronous resolver library and DNS resolver utilities.
aget - 0.4.1-1 - Aget is a multithreaded HTTP download accelerator.
aiccu - 20070115-2 - Automatic IPv6 Connectivity Client Utility.
alac-decoder - 0.1.0-2 - A decoder for the apple lossless file format
......

最後,要解決我要使用 swapon 的問題,安裝 util-linux-ng 這個擴充工具套件就可以了,裡面就有 swapon 跟 fdisk 等原本系統應備的工具指令,當然也有許多跟內建的重疊到,但按照環境變數 PATH 的設定,內建的指令會優先執行,因此不必擔心相容問題。
# ipkg-opt update
# ipkg-opt install util-linux-ng
# swapon

Usage:
swapon -a [-e] [-v] [-f] enable all swaps from /etc/fstab
swapon [-p priority] [-v] [-f] enable given swap
swapon -s display swap usage summary
swapon -h display help
swapon -V display version
......

沒有留言:

張貼留言