在 Debian/Ubuntu 等 Linux 發行版下簡易打包軟體 – 以 SAC 為例

我們常見到的Linux 發行版基本上就是一個「拼裝車」,組合各個不同來源的專案原始碼組合成一個有多用途的「通用作業系統」。我們將以地震學軟體 SAC 為例,說明如何簡單利用「套件打包」的機制,藉由既有軟體打包管理工具,使得發行版內的軟體更能有秩序地被管理。

套件打包的目的

相對於 Windows、FreeBSD 作業系統都有官方維護的基礎元件(base component),我們常見到的 Linux 發行版基本上就是一個全然的「拼裝車」,組合各個不同來源的專案原始碼組合成一個有實際用途的「通用作業系統」。通常發行版的維護者會優先將符合自由及開放原始碼授權的專案納入其關鍵元件,各個發行版看似五花八門,但終究離不開這個本質。少數發行版(如: Ubuntu Linux)在法律資源充足下會在安裝期間提供授權不相容(如: Nvidia 驅動、OpenZFS 核心模組)的元件以增進使用者體驗。但在大部分情況下,只要是授權有疑慮或明定不開放散佈原始碼的軟體,在發行版整合上就是一個巨大的阻礙,因為這意味者我們無法透過社群合作的機制,讓更熟悉軟體開發部署工程的人檢視我們平常使用的程式是否是易於使用、沒有潛在問題的。

而我們在 Unix-like (Linux、FreeBSD、Solaris、更早期的 SunOS…等) 環境下,最早期藉由原始碼安裝軟體方式,就是進入原始碼資料夾。執行 make 將軟體編譯完成後,再使用 root 權限 make install,將軟體安裝到預設的路徑 ( /usr/local ) 下。但現在我們已經極度不建議安裝用這樣的方式在預設路徑( /usr/local ),因為容易跟其他也手動安裝在同位置的套件混淆,使得嘗試解除安裝的過程中容易誤刪手動 make install 安裝其他套件的檔案,讓升級或解除安裝套件更加複雜。更別說在「不重複安裝」的前提下,解決 A 函式庫一更新,以它為基礎的 B 專案就得重新編譯才能找到 A 以執行的常見問題了。

因此我們開始使用了「套件打包」的機制,藉由單一專案的軟體打包管理程式(dpkg, rpm),統一發行版內軟體管理的秩序。

使用情境 – 為什麼要「打包」SAC?

SAC 全名是 Seismic Analysis Code,是個歷史悠久的地震學資料處理軟體,由美國的 IRIS (地震學研究機構聯合會) 團隊開發,主要使用 C 語言開發,需在相容 Unix-like (如 Linux, FreeBSD, Cygwin…等) 的 X 視窗系統下才能正常使用,並只提供相關原始碼、執行檔給非特殊國家之地震學相關人員。若需取得相關程式需至官方網站填寫申請表單,由該單位人員審核後才可藉由 email 附件取得檔案。

傳統而言,在同一作業系統環境下安裝 SAC 有兩種途徑,第一種是直接把 IRIS 提供的執行檔手動放到指定位置 ( Linux 下指定 /usr/local ) 後執行,第二種是在作業系統下自行使用 gcc 等編譯器建置後安裝到自行指定的位置 (若未指定則仍安裝到 /usr/local )

第一種方法的方便之處在於說,不需要瞭解太多 Linux / Unix 的基礎知識與相關操作就可以藉由非常基本的指令 (cp, sudo…等) 完成安裝

缺點在於只能安裝在 x86/x86_64 平臺下的 CPU 才能順利執行的 Linux 執行檔,也就是說若你今天想在同樣安裝 Linux 的小型開發板 (如:樹梅派、Apple Silicon M1 上執行的虛擬機器)或是在官方沒考慮的 Unix-like 環境(Cygwin, FreeBSD, Termux)下執行是做不到的 (樹梅派或許可以在上面開 QEMU 模擬,但速度可預想是非常非常慢的)

另外第一種方法也無法自行客製化相關功能,這限制的問題在於說用此方法安裝的 SAC 程式只能在極度有限的操作體驗下進行,而使得剛熟悉 bash 等指令介面的使用者進入 SAC 的指令介面會發現 TAB 自動補完、上下、結束時保留指令歷史、Ctrl+R 搜尋歷史等在 bash 有的功能這邊都沒有或限制更多。但如果客製化編譯就可以藉由增加相關選項就可以改善。

因此我們知道如果藉由第二種方法有可修改安裝路徑、自行增減相關功能、移植更方便等優勢,但此方法對於沒有接觸過系統管理、程式開發的使用者挑戰並不小,且若想要提供給多個各自符合資格的人員,安裝一樣客製化設定同時符合易於安裝、升級、解除安裝原則的 SAC 程式也勢必會花費很多心力。此時發行版下的套件管理工具就是我們很重要的夥伴了! 在這邊我們將用 Debian/Ubuntu 下的 apt (dpkg) 工具來協助我們更輕易地部署「我們的 SAC」

SAC Debian/Ubuntu Packager 介紹

這個工具使用最基本的 Shell Script 腳本,搭配 dpkg 程式,將編譯後的 SAC 程式放置在特定資料夾後,再加入軟體資訊後打包壓縮成單一安裝檔 (<pkg_name>.deb),最後再由使用者從 apt 程式安裝該套件,納入發行版套件管理系統的記錄中。

由以上討論我們可以歸納這個方法的好處:

  1. 使得 SAC 更易於安裝、解除安裝、升級
  2. SAC 底層用到的函式庫一旦有重大升級,發行版套件管理程式(apt)會跳出相關警告,讓你記得要重新安裝程式。
  3. 減少繁瑣的環境變數設定

使用這個工具安裝 SAC 之前,符合相關資格的使用者仍需自行至 IRIS 網站申請下載原始碼,以遵守授權相關規範。詳細安裝方式請參考 GitHub 上的 README 頁面。

結論

套件打包適合用在一定數量的人會安裝的軟體上,以減少繁瑣安裝過程中可能會出錯的機率,以增進效率並兼顧使用體驗。也是讓 Linux 在有限硬碟空間下提供完整功能的關鍵。若有心在未來的專案上利用 Linux 環境作為開發測試平臺,這仍然是不可或缺的知識。