從源碼配置和構(gòu)建 Samba
和大多數(shù) Linux 軟件一樣,Samba 是開源的,您可以得到程序員所用的源代碼文件,然后編譯成您自己系統(tǒng)的一個(gè)二進(jìn)制文件包。這樣您就可以運(yùn)行新的軟件而不是版本維護(hù)人員所提供的舊版本,調(diào)整編譯時(shí)間選項(xiàng),設(shè)置編譯器特性實(shí)現(xiàn)最優(yōu)性能,甚至更改源代碼。學(xué)習(xí)操作方法。
獲取 Samba 源代碼
Samba 源代碼在 Samba 網(wǎng)站中提供。如果您對(duì)從源代碼編譯和安裝軟件比較熟悉,使用 Samba 可能不會(huì)有麻煩,但是,由于 Samba 對(duì)許多安裝的關(guān)鍵特性,您需要格外注意,確保您的軟件是您所信任的。為此,Samba 開發(fā)人員提供認(rèn)證密鑰,您可以用來驗(yàn)證您的下載。
下載一個(gè)源 tarball
您可以從主 Samba Web 頁面下載 Samba 源代碼。一個(gè)鏈接連接到主頁上顯示的最新穩(wěn)定版本(撰寫本文時(shí)是版本 3.5.6)。單擊它獲取這個(gè)版本,tarball 出現(xiàn)在您的 Web 瀏覽器將其下載的地方。下一代 Samba(Samba 版本 4)的一個(gè)可下載鏈接也出現(xiàn)在主頁面上;然而 Samba 版本 4 目前正在進(jìn)行 alpha 測試,已經(jīng)好幾年了。如果您一定要試用其功能或者想要幫助 Samba 開發(fā),可以使用它。
構(gòu)建您自己的提要您可以構(gòu)建一個(gè) RSS、Atom 或 HTML 提要,以便在我們添加新文章或更新內(nèi)容時(shí)收到通知。訪問 developerWork RSS 提要。選擇 Linux 作為專區(qū),Articles 作為類型,輸入 Linux Professional Institute 作為關(guān)鍵字。然后選擇您想要的提要類型。在主下載鏈接附近,您將發(fā)現(xiàn)一個(gè)到當(dāng)前版本發(fā)行說明的鏈接,還有另一個(gè)到簽名的鏈接,您可以用來識(shí)別軟件的完整性。如果您的目的是驗(yàn)證軟件的完整性,就應(yīng)該下載簽名文件。(要實(shí)現(xiàn)這一點(diǎn),需要右鍵單擊該鏈接。)這個(gè)文件稱為 samba-version.tar.asc,其中 version 是 Samba 版本號(hào)。
額外下載選項(xiàng)在 Samba 下載頁面出現(xiàn)。這個(gè)頁面包括到舊版 Samba 歸檔文件的鏈接;使用 Git 下載軟件的操作指南、Control Version System、以及其他工具;到相關(guān)工具的鏈接,比如圖形化用戶界面管理器和用于其他平臺(tái)的 Server Message Block (SMB)/Common Internet File System (CIFS)包;等等。一個(gè)尤其重要的鏈接是到 Samba 包 GnuPG (GPG) 密鑰的鏈接。如果您想要驗(yàn)證 Samba 包的真實(shí)性,必須下載該文件(samba-pubkey.asc),如下所述。
驗(yàn)證軟件真實(shí)性
不驗(yàn)證軟件的真實(shí)性,也可以解壓、編譯、安裝和使用 Samba。但是,由于服務(wù)器極其重要,運(yùn)行少數(shù)必要命令來驗(yàn)證其真實(shí)性通常是個(gè)好主意。執(zhí)行以下步驟:
1、確保您已經(jīng)下載了 samba-version.tar.asc 和 samba-pubkey.asc 文件。
2、輸入 gunzip samba-version.tar.gz 來解壓(而不是用 untar 命令)這個(gè)打包文件。
3、如果您還沒有這么做,輸入 gpg --import samba-pubkey.asc 將 Samba 公共密鑰導(dǎo)入到您的 GPG 密鑰環(huán)。
4、輸入 gpg --verify samba-version.tar.asc 驗(yàn)證這個(gè)密鑰。這個(gè)程序應(yīng)該響應(yīng)類似的消息:
gpg: Signature made Thu 07 Oct 2010 02:23:24 PM EDT using DSA key ID 6568B7EA gpg: Good signature from "Samba Distribution Verification Key <samba-bugs@samba.org\>"
輸出結(jié)果可能繼續(xù)是一條消息,大致意思是密鑰不能被一個(gè)可信簽名所認(rèn)證。這條消息強(qiáng)調(diào)了剛才描述的驗(yàn)證過程的一個(gè)局限性:如果主 Samba 網(wǎng)站被破壞,入侵者可能會(huì)使用假冒版本替換 Samba 包和兩個(gè)密鑰,這可能會(huì)誤導(dǎo)您接受虛假密鑰。在某種程度上,您可以通過在第 4 步 gpg 中使用 --keyserver wwwkeys.pgp.net 選項(xiàng)來保護(hù)您自己。該選項(xiàng)導(dǎo)致 gpg 將檢索來自 wwwkeys.gpg.net 的密鑰作為驗(yàn)證過程的一部分。除了 Samba 服務(wù)器之外,有些人發(fā)布的假 Samba 包可能會(huì)破壞這個(gè)密鑰服務(wù)器。
解封 tarball
假設(shè)您的軟件包已經(jīng)通過了驗(yàn)證步驟(或者,如果您不想再為此步驟而傷神),您可以解封您的源代碼 tarball。在您的主目錄下,或者在 /usr/src/ 這樣一個(gè)路徑進(jìn)行該操作,其目的是保留源代碼進(jìn)行軟件的本地安裝。如果您在 /usr/src/ 解封源代碼,您可能需要請求根權(quán)限或者更改對(duì) /usr/src/ 的訪問權(quán)限,使普通用戶可以寫入此目錄。
無論您怎樣做,都需要切換到您想要將源代碼解壓到其中的目錄區(qū)。然后輸入以下命令:
$ tar xvf ~/samba-version.tar
該命令假設(shè)您已經(jīng)解壓了 tarball,而且位于您的主目錄區(qū)。如果 tarball 仍然是壓縮的,您可以先解壓它,或者將 z 添加到 tar 命令中,然后更改文件名,命令如下:
$ tar xvzf ~/samba-version.tar.gz
如果文件駐留在其他位置,而不是主目錄區(qū),應(yīng)相應(yīng)調(diào)整路徑。當(dāng)然,您還應(yīng)該更改文件名來反映您所使用的版本。
在解壓這些文件時(shí),該命令生成一個(gè)文件列表。如果您看到錯(cuò)誤消息,可能是您沒有權(quán)限寫入當(dāng)前目錄,或者可能是耗盡了可用磁盤空間。一旦任務(wù)成功完成,您將看到出現(xiàn)一個(gè)新的子目錄:samba-version。這就是您的 Samba 源代碼樹。
編譯 Samba
源代碼現(xiàn)在已經(jīng)可用,可以開始編譯流程了。在開始之前,檢查您的系統(tǒng)中的必備軟件。您必須在執(zhí)行實(shí)際編譯之前配置該軟件。您可能會(huì)遇到問題,但您必須解決。
安裝必備軟件
要編譯 Samba,必須提供其他一些軟件包,最引人注目的就是 GCC。GCC 是 C 語言的一個(gè)編譯器集合,大多數(shù) Samba 都是用 C語言編寫的。在大多數(shù) Linux 版本中,不出預(yù)料,您可以從一個(gè)名為 gcc 的包中安裝 GCC。另一個(gè)關(guān)鍵開發(fā)工具是 make,這可以調(diào)用 gcc 和其他開發(fā)工具,調(diào)用模式由 Samba 開發(fā)人員決定。
Samba 代碼依賴其他幾個(gè) libraries— 軟件包,為其他程序的使用提供支持功能。這些庫可能已經(jīng)安裝在您的計(jì)算機(jī)上了,但要編譯一個(gè)程序,您需要庫的頭文件,這通常安裝在單獨(dú)的軟件包(名稱以 -dev 或 -devel. 結(jié)束)中。至少,使用您的版本的打包工具確保libc 或 libc6 開發(fā)庫已安裝。有些庫需要,有些庫不需要,具體取決于您的配置選項(xiàng)。如果一個(gè)庫找不到,configure 腳本 — 有可能是構(gòu)建進(jìn)程自身— 將生成一個(gè)錯(cuò)誤消息,您可能要追查到相關(guān)庫。
很多發(fā)行版可以很容易地在一次操作中安裝一個(gè)開發(fā)工具和庫的基本選項(xiàng)。例如,在 Ubuntu 中,您可以安裝 build-essential 包。在諸如 Fedora 這類版本中,在安裝操作系統(tǒng)時(shí)可以安裝大量軟件包,這樣如果您在安裝操作系統(tǒng)時(shí)知道您的計(jì)算機(jī)將用于軟件開發(fā),那么您可以在那時(shí)選擇相關(guān)包。如果您找到這樣一個(gè)適合您的操作系統(tǒng)的選項(xiàng),您不得不逐個(gè)安裝軟件包。
配置 Samba
要配置 Samba,首先更改 Samba 源代碼主目錄的 source3 子目錄。該目錄有供主要 Samba 包使用的源代碼。
注意: Samba 源代碼主目錄的其他子目錄保存輔助程序、支持程序、文檔等等的源代碼。例如,客戶端子目錄保存與 Linux 作為客戶機(jī)安裝 SMB/CIFS 共享的能力相關(guān)的文件;swat 子目錄有 Samba Web Administration Tool (SWAT) 源代碼。構(gòu)建 Samba 主文件包也需要編譯這些程序,但是您可能需要手動(dòng)編譯其他程序。編譯 Samba 主體,在 source3 子目錄中,構(gòu)建關(guān)鍵 smbd 和 nmbd 服務(wù)器程序以及支持庫和一些相關(guān)工具。
configure 腳本處理配置流程,最簡單的情況下,您可以輸入 ./configure 使用其默認(rèn)選項(xiàng)來配置 Samba。很多參數(shù)都可以對(duì)編譯時(shí)間選項(xiàng)進(jìn)行微調(diào)。輸入 ./configure --help 來查看選項(xiàng)清單。(如果您在一個(gè)控制臺(tái)上工作,不要上下滾動(dòng),您可能想將輸出重新指向一個(gè)文件,這樣您可以通過 less 詳細(xì)閱讀或者在一個(gè)文本編輯器中閱讀。)
您也可能想要設(shè)置各種環(huán)境變量,這也在 ./configure --help 輸出中有詳細(xì)描述。大多數(shù)情況下,默認(rèn)就可以了,但是,如果您對(duì)相關(guān)系統(tǒng)有足夠的了解,您可以調(diào)整選項(xiàng)以滿足您的需求。例如,您可以設(shè)置 CFLAGS 環(huán)境變量來調(diào)整您的 C 編譯器標(biāo)記。如果您對(duì)環(huán)境變量不是很了解,最好不要管它。
您詳細(xì)閱讀了選項(xiàng)和環(huán)境變量后,您就可以配置您的 Samba:
$ CFLAGS="-O3" ./configure --without-ldap
該示例告訴腳本使用 -O3 GCC 編譯器,然后編譯 Samba ,不需要支持 Lightweight Directory Access Protocol。您可以更改或忽略這些選項(xiàng),當(dāng)然,根據(jù)您安裝的版本視情況而定。
編譯軟件
實(shí)際上,編譯軟件對(duì)于您而言不費(fèi)吹灰之力。僅輸入:
$ make
結(jié)果是出現(xiàn)一系列代碼行,顯示 make 實(shí)用工具正在進(jìn)行的處理,如下:
Compiling lib/netapi/joindomain.c Compiling lib/netapi/serverinfo.c Compiling lib/netapi/getdc.c
運(yùn)氣好的話,這一進(jìn)程將繼續(xù)直至軟件被編譯,這很可能需要幾分鐘,但具體時(shí)間稍有差異,具體取決于您的計(jì)算機(jī)的速度。如果您的機(jī)器運(yùn)行不止一個(gè)處理器或者多核處理器,您可能需要使用 -j 選項(xiàng)來 make,使其同時(shí)運(yùn)行多個(gè)編譯任務(wù),因而加快進(jìn)程速度。例如,您可以輸入 make -j 4,使得 make 可以同時(shí)運(yùn)行 4 個(gè)源代碼文件。軟件編譯完成后,您可以使用 install 目標(biāo)運(yùn)行 make 來安裝它:
# make install
盡管您可以作為一個(gè)普通用戶執(zhí)行上述操作(假設(shè)您像那個(gè)用戶那樣擁有對(duì)源代碼目錄樹的 Write 訪問權(quán)限),但是使用 make install 需要您有 root 權(quán)限,所以該命令將 Samba 二進(jìn)制文件和文檔復(fù)制到計(jì)算機(jī)的系統(tǒng)目錄中(通常在 /usr/local/ 中,除非您通過 configure 腳本選項(xiàng)更改了該位置) 。
解決問題
很遺憾,配置和編譯有時(shí)會(huì)失敗。這類問題最常見的原因是庫的缺失。如果配置失敗,您可能會(huì)在輸出底部附近看到一個(gè)消息,指出缺失什么 — 例如,該消息可能指出不能找到 Pluggable Authentication Module 庫。然后,您可以使用您的系統(tǒng)包管理工具,比如 Synaptic 或 Yumex,來搜索和安裝相關(guān)軟件。記住,您可能需要將開發(fā)庫與主庫文件包分開安裝。
您可以以類似的方式在 make 階段處理錯(cuò)誤;然而這類錯(cuò)誤通常生成大量錯(cuò)誤消息。不要管列表中后面出現(xiàn)的錯(cuò)誤,向上滾動(dòng)找到第一個(gè)錯(cuò)誤消息。通常,一個(gè)錯(cuò)誤會(huì)導(dǎo)致另一個(gè),以此類推。更正了第一個(gè)錯(cuò)誤就打破了這鏈條,通常會(huì)使軟件能夠正確編譯。
更正 make 錯(cuò)誤可能比更正 configure 錯(cuò)誤需要更多的說明,因?yàn)?make 錯(cuò)誤可能反映文件缺失甚至文件中不正確的元素。如果一個(gè)缺失的文件是罪魁禍?zhǔn)?,那么它的名稱通常就是一個(gè)線索,試著找到您版本的發(fā)行包,去掉文件名中的所有擴(kuò)展名;這樣會(huì)幫助您找到一個(gè)丟失的配置庫(configure 忽略了的)進(jìn)行標(biāo)記。如果這也失敗的話,使用文件名嘗試一個(gè) Web 搜索,這可能引導(dǎo)您找到需要安裝的庫的名稱。如果錯(cuò)誤是有關(guān)錯(cuò)誤語法的,問題可能更嚴(yán)重。您可能會(huì)禁用與 configure 腳本選項(xiàng)相關(guān)的特性;然而您可能需要升級(jí)(或降級(jí)) 您的 C 編譯器或者您想要編譯的 Samba 版本。如果您正在處理軟件的一個(gè)預(yù)發(fā)布版本,您可能會(huì)遇到一個(gè) bug,需要您自己進(jìn)行修補(bǔ)。這類任務(wù)超出了本文的范圍,您需要向 Samba 開發(fā)人員或經(jīng)驗(yàn)豐富的程序員尋求幫助。
【編輯推薦】