鳥哥的Linux私房菜讀書筆記--Tarball的管理與建議
Tarball的安裝時可以跨平臺的,C語言的程式程式碼在各個平臺上是互通的。
1、使用原始碼管理軟體所需要的基礎軟體
(1)gcc或cc等C語言編譯程式(conplier)
(2)make與autoconfig等軟體
(3)需要kernel提供的libary以及相關的include檔案
· 如果是要安裝 gcc 等軟體開發工具,請使用『 yum groupinstall "Development Tools" 』 · 若待安裝的軟體需要圖形介面支援,一般還需要『 yum groupinstall "X Software Development" 』 · 若安裝的軟體較舊,可能需要『 yum groupinstall "Legacy Software Development" 』
2、tarball安裝的基本步驟
(1)取得原始檔:將 tarball 檔案在 /usr/local/src 目錄下解壓縮; (2)取得步驟流程:進入新建立的目錄底下,去查閱 INSTALL 與 README 等相關檔案內容 (很重要的步驟!); (3)相依屬性軟體安裝:根據 INSTALL/README 的內容察看並安裝好一些相依的軟體 (非必要); (4)建立 makefile:以自動偵測程式 (configure 或 config) 偵測作業環境,並建立 Makefile 這個檔案; (5)編譯:以 make 這個程式並使用該目錄下的 Makefile 做為他的引數配置檔案,來進行 make (編譯或其他) 的動作; (5)安裝:以 make 這個程式,並以 Makefile 這個引數配置檔案,依據 install 這個目標 (target) 的指定來安裝到正確的路徑! 注意到上面的第二個步驟,通常在每個軟體在釋出的時候,都會附上 INSTALL 或者是 README 這種檔名的說明檔,這些說明檔請『確實詳細的』 閱讀過一遍,通常這些檔案會記錄這個軟體的安裝要求、軟體的工作專案、 與軟體的安裝引數設定及技巧等,只要仔細的讀完這些檔案,基本上,要安裝好 tarball 的檔案,都不會有什麼大問題囉。至於 makefile 在製作出來之後,裡頭會有相當多的目標 (target),最常見的就是 install 與 clean 囉!通常『make clean』代表著將目標檔案 (object file) 清除掉,『make』則是將原始碼進行編譯而已。 注意喔!編譯完成的可執行檔案與相關的配置檔案還在原始碼所在的目錄當中!因此,最後要進行『make install』來將編譯完成的所有都給他安裝到正確的路徑去,這樣就可以使用該軟體
tarball 軟體之安裝的指令下達方式: (1)./configure 這個步驟就是在建立 Makefile 這個檔案囉!通常程式開發者會寫一支 scripts 來檢查你的 Linux 系統、相關的軟體屬性等等,這個步驟相當的重要, 因為未來你的安裝資訊都是這一步驟內完成的!另外,這個步驟的相關資訊應該要參考一下該目錄下的 README 或 INSTALL 相關的檔案! (2)make clean make 會讀取 Makefile 中關於 clean 的工作。這個步驟不一定會有,但是希望執行一下,因為他可以去除目標檔案!因為誰也不確定原始碼裡面到底有沒有包含上次編譯過的目標檔案 (*.o) 存在,所以當然還是清除一下比較妥當的。 至少等一下新編譯出來的執行檔我們可以確定是使用自己的機器所編譯完成的嘛! (3) make make 會依據 Makefile 當中的預設工作進行編譯的行為!編譯的工作主要是進行 gcc 來將原始碼編譯成為可以被執行的 object files ,但是這些 object files 通常還需要一些函式庫之類的 link 後,才能產生一個完整的執行檔!使用 make 就是要將原始碼編譯成為可以被執行的可執行檔案,而這個可執行檔案會放置在目前所在的目錄之下, 尚未被安裝到預定安裝的目錄中; (4) make install 通常這就是最後的安裝步驟了,make 會依據 Makefile 這個檔案裡面關於 install 的專案,將上一個步驟所 編譯完成的資料給他安裝到預定的目錄中,就完成安裝啦! 如果安裝成功, 並且是安裝在獨立的一個目錄中,例如 /usr/local/packages 這個目錄中好了,那麼你就必需手動的將這個軟體的 man page 給他寫入 /etc/man_db.conf 裡面去。
3、tarball軟體安裝的建議事項
在預設情況下,原來的Linux distribution釋放安裝的軟體大多是在/usr裡面,使用者自行安裝的軟體則建議放在/usr/local中,原始碼則建議放在/usr/local/src(src是source的縮寫)
一般預設安裝軟體所使用的路徑
/etc/httpd #配置檔案
/usr/lib #函式庫
/usr/bin #執行檔
/usr/share/man #聯機幫助文件
如果將安裝位置放置在預設的/usr/local裡面,則以上資料就會被分別放置在 /usr/local/etc /usr/local/lib /usr/local/bin /usr/local/man
如果選擇的是為該軟體建置的單獨目錄,則以上資料就會被分別放置在(以apache為例) /usr/local/apache /usr/local/apache/lib /usr/local/apache/bin /usr/local/apache/man
軟體放置在單一目錄下時,移除時使用,命令:$ rm -rf /usr/local/apache即可移除。當我們在執行某些指令的時候,與該指令是否在PATH環境變數所記錄的路徑有關,以上為例,/usr/local/apache/bin肯定不在PATH裡面,所以執行apache是就得使用絕對路徑,或者將/usr/local/apache/bin加入到PATH裡面,/usr/local/apache/man也需要加入到man page的搜尋路徑當中。
使用tarball的建議:(1)最好將 tarball 的原始資料解壓縮到 /usr/local/src 當中; (2)安裝時,最好安裝到 /usr/local 這個預設路徑下; (3)考慮未來的反安裝步驟,最好可以將每個軟體單獨的安裝在 /usr/local 底下; (4)為安裝到單獨目錄的軟體之 man page 加入 man path 搜尋:如果你安裝的軟體放置到 /usr/local/software/ ,那麼 man page 搜尋的設定中,可能就得要在/etc/man_db.conf 內的 40~50 行左右處,寫入如下的一行: MANPATH_MAP /usr/local/software/bin /usr/local/software/man
4、範例
以ntp(時間伺服器)為例。對軟體的要求如下:
· 假設 ntp-4.*.*.tar.gz 這個檔案放置在 /root 這個目錄下; · 原始碼請解開在 /usr/local/src 底下; · 我要安裝到 /usr/local/ntp 這個目錄中; <1>解壓縮下載的 tarball ,並參閱 README/INSTALL 檔案
[[email protected] ~]# cd /usr/local/src <==切換目錄
[[email protected] src]# tar -zxvf /root/ntp-4.2.8p3.tar.gz <==解壓縮到此目錄
ntp-4.2.8p3/ <==會建立這個目錄喔!
ntp-4.2.8p3/CommitLog
....(底下省略)....
[[email protected] src]# cd ntp-4.2.8p3
[[email protected] ntp-4.2.8p3]# vi INSTALL <==記得 README 也要看一下!
<2>檢查 configure 支援引數,並實際建置 makefile 規則檔案
[[email protected] ntp*]# ./configure --help | more <==查詢可用的引數有哪些
--prefix=PREFIX install architecture-independent files in PREFIX
--enable-all-clocks + include all suitable non-PARSE clocks:
--enable-parse-clocks - include all suitable PARSE clocks:
# 上面列出的是比較重要的,或者是你可能需要的引數功能!
[[email protected] ntp*]# ./configure --prefix=/usr/local/ntp \
> --enable-all-clocks --enable-parse-clocks <==開始建立 makefile
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
....(中間省略)....
checking for gcc... gcc <==也有找到 gcc 編譯程式了!
....(中間省略)....
config.status: creating Makefile <==現在知道這個重要性了吧?
config.status: creating config.h
config.status: creating evconfig-private.h
config.status: executing depfiles commands
config.status: executing libtool commands
一般來說 configure 設定引數較重要的就是 --prefix=/path 了,--prefix 後面接的路徑就是『這個軟體未來要安裝到那個目錄去?』如果你沒有指定 --prefix=/path 這個引數,通常預設引數就是/usr/local 至於其他的引數意義就得要參考 ./configure --help 了! 這個動作完成之後會產生 makefile 或 Makefile 這個檔案。當然啦,這個偵測檢查的過程會顯示在螢幕上,特別留意關於 gcc 的檢查,還有最重要的是最後需要成功的建立起 Makefile 才行! <3>最後開始編譯與安裝嚕!
[[email protected] ntp*]# make clean; make
[[email protected] ntp*]# make check
[[email protected] ntp*]# make install
# 將資料給他安裝在 /usr/local/ntp 底下
5、利用patch更新原始碼
以上述用的main為例
<1>測試舊版程式的功能
[[email protected] ~]# tar -zxvf main-0.1.tgz
[[email protected] ~]# cd main-0.1
[[email protected] main-0.1]# make clean main
[[email protected] main-0.1]# ./main
version 0.1
Please input your name: VBird
Please enter the degree angle (ex> 90): 45
Hi, Dear VBird, nice to meet you.
The Sin is: 0.71
The Cos is: 0.71
<2>查閱patch file 的內容
[[email protected] main-0.1]# vim ~/main_0.1_to_0.2.patch
diff -Naur main-0.1/cos_value.c main-0.2/cos_value.c ##注意
--- main-0.1/cos_value.c 2015-09-04 14:46:59.200444001 +0800
+++ main-0.2/cos_value.c 2015-09-04 14:47:10.215444000 +0800
@@ -7,5 +7,5 @@
{
float value;
....(底下省略)....
上面表格內有個底線的部分,那代表使用 diff 去比較時,被比較的兩個檔案所在路徑,這個路徑非常的重要喔! 因為 patch 的基本語法如下: patch -p 數字 < patch_file 特別留意那個『 -p 數字』,那是與 patch_file 裡面列出的檔名有關的資訊。假如在 patch_file 第 一行寫的是這樣: *** /home/guest/example/expatch.old那麼當我下達『 patch -p0 < patch_file 』時,則更新的檔案是『 /home/guest/example/expatch.old 』,如果『 patch -p1 < patch_file』,則更新的檔案為『home/guest/example/expatch.old』,如果『patch -p4 < patch_file』則更新『expatch.old』,也就是說, -pxx 那個 xx 代表『拿掉幾個斜線(/)』的意思!根據剛剛上頭的資料,我們可以發現比較的檔案是在 main-0.1/xxx 與main-0.2/xxx , 所以說,如果你是在 main-0.1 底下,並且想要處理更新時,就得要拿掉一個目錄 (因為並沒有 main-0.2 的目錄存在, 我們是在當前的目錄進行更新的!),因此使用的是 -p1 所以: <3>更新原始碼,並且重新編譯程式!
[[email protected] main-0.1]# patch -p1 < ../main_0.1_to_0.2.patch
patching file cos_value.c
patching file main.c
patching file Makefile
patching file sin_value.c
# 請注意,鳥哥目前所在目錄是在 main-0.1 底下喔!注意與 patch 檔案的相對路徑!
# 雖然有五個檔案,但其實只有四個檔案有修改過喔!上面顯示有改過的檔案!
[[email protected] main-0.1]# make clean main
[[email protected] main-0.1]# ./main
version 0.2
Please input your name: VBird
Please enter the degree angle (ex> 90): 45
Hi, Dear VBird, nice to meet you.
The sin(45.000000) is: 0.71
The cos(45.000000) is: 0.71
# 你可以發現,輸出的結果中版本變了,輸出資訊多了括號 () 喔!
[[email protected] main-0.1]# make install <==將他安裝到 /usr/local/bin 給大家用
cp -a main /usr/local/bin
[[email protected] main-0.1]# main <==直接輸入指令可執行!
[[email protected] main-0.1]# make uninstall <==移除此軟體!
rm -f /usr/local/bin/main
只要下載 patch file 就能夠對你的軟體原始碼更新了!只不過更新了原始碼並非軟體就更新!你還是得要將該軟體進行編譯後,才會是最終正確的軟體喔! 因為 patch 的功能主要僅只是更新原始碼檔案而已!切記切記!此外,如果你 patch 錯誤呢?沒關係的!我們的 patch 是可以還原的啊!透過『 patch -R < ../main_0.1_to_0.2.patch 』就可以還原