[CentOS 7] 套件升級不求人,手動編譯自己來:以 OpenSSH 為例

by 9/19/2016 0 意見

很久很久以前,在那個沒有 RPM、YUM 的時代,每一次安裝新套件都是件非常的麻煩事。

到底有多麻煩呢?
我們就拿這個還算簡單的 OpenSSH 套件讓時光倒轉回去吧!

只要是 Redhat 系列的愛用者,一定都對 RPM 跟 YUM 不陌生,而 Debian 家的 DPKG 跟 APT 也是一樣,簡簡單單的一兩行指令,輕鬆的就能把套件從套件庫安裝到我們的作業系統裡。

在那個套件管理程式還不存在的年代,要安裝一個新套件,得像 David Revoy - Building Krita 3.0 on Linux for cats 提到的順序,操作流程大概是這樣子的:

  1. 取得原始碼。
  2. 解壓縮。
  3. 安裝編譯器、函數庫。
  4. 檢查環境組態。
  5. 安裝所需的及相依套件
  6. 開始編譯。
  7. 進行安裝。

想太多,這有什麼好難的啦 ......

用想的當然不難,真的實作才知道有多辛苦。

例如說,
我們為了安裝某 1 個主要套件,在步驟 5 要安裝 3 個相依套件,可是這 3 個相依套件都需要有它們自己所需的 4 個相依套件。

這 3*4=12 個相依套件的相依套件,又各自有它們的 2 個相依套件。

非得把這個遞迴產生的 12*2=24 個相依套件們給全部安裝好,才能真正的讓主要套件進行步驟 6 的動作。

步驟 1 到步驟 7 的動作至少要執行 1+24=25 次!!!
要是任何一個步驟失敗的話,像是突然當機、版本不符、不相容 ...... 等等的問題,就得繼續這樣子的在無限迴圈裡轉轉轉,直到排除所有錯誤。

坐而言,不如起而行。
讓我們實際來做一遍,就拿 OpenSSH 這個很基本也很重要的套件來從頭到尾實作一次。


下載原始碼 (Source Code)


找到 OpenSSH 官網的 Linux 相關說明

這邊提供了 HTTPFTPRSYNC 三種下載方式,並且提供了世界各地的鏡像站 (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 撰文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

0 意見 :

張貼留言