很久很久以前,在那個沒有 RPM、YUM 的時代,每一次安裝新套件都是件非常的麻煩事。
到底有多麻煩呢?
我們就拿這個還算簡單的 OpenSSH 套件讓時光倒轉回去吧!
只要是 Redhat 系列的愛用者,一定都對 RPM 跟 YUM 不陌生,而 Debian 家的 DPKG 跟 APT 也是一樣,簡簡單單的一兩行指令,輕鬆的就能把套件從套件庫安裝到我們的作業系統裡。
在那個套件管理程式還不存在的年代,要安裝一個新套件,得像 David Revoy - Building Krita 3.0 on Linux for cats 提到的順序,操作流程大概是這樣子的:
- 取得原始碼。
- 解壓縮。
- 安裝編譯器、函數庫。
- 檢查環境組態。
- 安裝所需的及相依套件
- 開始編譯。
- 進行安裝。
想太多,這有什麼好難的啦 ......
用想的當然不難,真的實作才知道有多辛苦。
例如說,
我們為了安裝某 1 個主要套件,在步驟 5 要安裝 3 個相依套件,可是這 3 個相依套件都需要有它們自己所需的 4 個相依套件。
這 3*4=12 個相依套件的相依套件,又各自有它們的 2 個相依套件。
非得把這個遞迴產生的 12*2=24 個相依套件們給全部安裝好,才能真正的讓主要套件進行步驟 6 的動作。
步驟 1 到步驟 7 的動作至少要執行 1+24=25 次!!!
要是任何一個步驟失敗的話,像是突然當機、版本不符、不相容 ...... 等等的問題,就得繼續這樣子的在無限迴圈裡轉轉轉,直到排除所有錯誤。
坐而言,不如起而行。
讓我們實際來做一遍,就拿 OpenSSH 這個很基本也很重要的套件來從頭到尾實作一次。
下載原始碼 (Source Code)
找到 OpenSSH 官網的 Linux 相關說明。
這邊提供了 HTTP、FTP、RSYNC 三種下載方式,並且提供了世界各地的鏡像站 (Mirror Site) 位置。
我選擇 USA (San Francisco, CA) 美國舊金山的鏡像站,這邊提供 2.1.1p4 以上的版本,我選擇了目前最新的版本:7.3p1。
將連結位置複製下來,進到 Shell 裡,把原始碼下載回來。
wget http://mirrors.sonic.net/pub/OpenBSD/OpenSSH/portable/openssh-7.3p1.tar.gz
再將它解壓縮。
tar zxvf openssh-7.3p1.tar.gz
可以看到很多 *.c 跟 *.h 的檔案,那個就是用 C 語言撰寫的程式原始碼。
cd openssh-7.3p1 && ls -l
閱讀安裝說明
天知道該怎麼編譯、安裝?需不需要相依套件?有沒有注意事項?
當然有!可是在哪兒呢?
通常會在名為 README 或 INSTALL 之類的純文字檔裡面。
先看一下套件介紹,這裡提到了基本資料、相依套件及參考連結。
less README
重點在這兒,非看不可的安裝說明。
less INSTALL
首先提到了前置需求,像是相依套件。
接著就是最重要的編譯及安裝步驟、參數說明。
最後是相關設定和其他說明。
檢查環境組態
首先要取得系統目前是否存在必要的函數庫 (Librarry)、編譯器 (Compiler) 及相依套件 (Dependent Package)。
通常目錄裡都會有一個叫 configure 的執行檔,它用來讓我們檢查環境組態,以及修改編譯與安裝的設定參數。
./configure --help
這次我們使用預設值去檢查環境組態,並產生編譯用的設定檔。
./configure
怎麼馬上就遇到問題了.... XDDD
「configure: error: no acceptable C compiler found in $PATH」
我們要編譯原始碼,可是沒有編譯器是要怎麼執行啦!
所以,要先把編譯器安裝起來。
sudo yum -y install gc gcc
再產生一次環境組態檔,怎麼又有問題了?!
「configure: error: *** zlib.h missing」
還記得在套件介紹跟安裝說明,提到了一定要先安裝好的相依套件,這就是其中一個:Zlib。
yum list | grep ^zlib
不過 Zlib 有這麼多個,我們要裝的是哪一個啊?
因為我們現在是要編譯,也就是代表還在開發 (Development) 階段,所以要安裝的是名稱後面有「-devel」的套件。
當然就把它安裝起來囉。
sudo yum -y install zlib-devel
繼續產生環境組態檔?!
「configure: error: *** OpenSSL headers missing」
是要搞我幾次,你才甘願啦 .... #$#$%@#(以下消音)
原來我們忘了另一個相依套件:OpenSSL 啦,就比照辦理,確認一下套件正確的名稱。
yum list | grep ^openssl
同樣把它安裝起來。
sudo yum -y install openssl-devel
再重新跑一次產生環境組態,才好不容易完成了準備工作。
就為了產生 Makefile 這個檔案。
它提供了下個步驟要用到的參數與設定值,像是:
- clean 清理
- install 安裝
- uninstall 移除
進行編譯
因為我們可能曾經用不同的環境組態或其他電腦編譯過,很可能會殘留許多暫存檔或是不適用於現行環境的檔案,而影響這次編譯的結果,所以要先把這些檔案清除掉。
make clean
接著才真的放心開始編譯。
make
這邊要花費不少時間,先去上個廁所,再喝杯 蘋果貓的好咖啡,稍等一下下!
感謝老天!沒有出現任何錯誤訊息。
開始安裝
去吧,皮卡丘。十萬伏特!
(謎之音:你是 Pokemon Go 玩太多了哦~~~)
make install
什麼?!
「/usr/bin/install: 無法移除 ‘/usr/local/bin/ssh’: 拒絕不符權限的操作」
「make: *** [install-files] Error 1」
別怕!
這只是因為我們的帳號權限不夠,沒有辦法安裝到系統目錄裡,交給 root 權限來處理吧。
sudo make install
終於,這次真的搞定了。
重新啟動服務
原先 CentOS 官方套件庫提供的版本是 6.6.1p1。
ssh -V
在我們重新啟動服務之後,可以看到已經升級成 7.3p1 了。
sudo systemctl restart sshd
執行檔預設的安裝目錄會在 /usr/local/bin 裡面。
用戶端實測
這邊用 macOS 的終端機來連線。
我們可以看到,OpenSSH 的版本真的已經更換成新的版號了。
注意事項
安裝成功之後,可千萬別把這個原始碼目錄給砍了,日後我們要反安裝的話,還得用到它,因為在這個 Makefile 裡面才有記錄所有安裝的檔案與目錄。
sudo make uninstall
若是真的不小心手滑一下,那 ...... 就只能我們自己手動的一個一個目錄清查了。
參考資料
圖片來源
- http://www.davidrevoy.com/article193/guide-building-krita-on-linux-for-cats
- https://zh.wikipedia.org/wiki/%E5%80%89%E9%BC%A0%E8%BC%AA
- Pokemon
更新紀錄
- 2016/9/19 撰文。
0 意見 :
張貼留言