現今對於 Daily Linux Developer / User 面對不同程式/開發版本環境感到很頭疼, 常常疲於
- 執行舊版程式需要安裝舊版本 Library, 設定 RPATH / LD_LIBRARY_PATH
- 開發需求建立不同的版本 SDK 開發/執行環境, 在較舊系統上需要新軟體, 或是新系統上需要舊軟體工具(基於驗證或是綁定版本等等需求)
- 短暫需要的工具, 安裝了一堆套件一一全部移除相當麻煩
- 嘗鮮希望測試實驗性版本軟體
面對這些林林總總開發上的需求, 但是 ... 卻一定不希望弄亂/髒平日使用的主要系統環境
而在接觸到 Singularity 之前
個人認為 python 的 Virtual Environment (VENV) 是很酷的東西
因為可以很快的在同路徑與環境下直接切換不同版本的開發環境
而儘管 docker / VM 也能夠提供多種版本的開發環境
但是 docker / VM 也著一些相對不便的缺點:
- 需要 root 才會有比較方便的使用體驗
- 需要登入 / 切換使用者環境, 不是開發者既有的 Home
- isolation 對 service 是優點, 但對開發完全成為一個重大缺點
- 目錄資料需要複製 / 轉移 / 同步
本文談到的 rootless 與環境功能相信 docker 都能提供, 但是流程相對煩雜非常非常多
相關工具也並非官方提供, 會有版本造成無法運作的問題
而透過使用 Singularity 可以很輕鬆達成完整環境類似 VENV 的效果
Singularity 的好處很多, 對於開發者而言:
- 是 container 技術, 不像 VM 有效能減損問題
- 基本的設定與使用非常簡單
- 能直接在既有的 Home 目錄下切換環境, 無同步上的困擾
- 可使用 docker hub 的資源
- 簡單的 image / sandbox 概念設計
- 透過 fakeroot 就可以建立/修改自己需要的 image 環境, 無需 root
- 符合 OCI 標準, 能提供 Docker 那類 service 導向的 instance 環境
Singularity 因為無需 root 權限的特性廣受 HPC 相關應用服務的歡迎與採用
但是 Singularity 的文件數量並不像 Docker 那樣豐富, 但還是有相當不錯的介紹
個人推薦瑞士University of Bern 中 Science IT 單位提供的
Singularity Container 指引當然還是推薦官方網站與官方文件中的 User Guide 與 Admin Guide
本文單純是以 Developer 角度的推薦說明文
包含安裝過程與詳細的操作與進階功能請參考上述文件連結
建立基本 SIF image, 基本操作
安裝 Singularity 後, 當然立刻會想要抓個環境來試試看
$ singularity build ubuntu_18.04.sif docker://ubuntu:18.04
接著你會看到類似下列的畫面
大小約 26MB 左右, 可想而知環境是相當陽春的, 但接著嘗試用看看吧
$ singularity shell ubuntu_18.04.sif
從截圖中可以看到主系統是 Ubuntu 20.10 但 SIF 環境是 18.04, 此外還可以比較一些工具
完全是不同的世界! 更棒的是第一張截圖顯示了還是在同一個路徑下
這時候好奇嘗試 apt-get update, 或是 sudo apt-get update 會發現完全無法執行
那麼該怎麼安裝想要的套件呢?
這時候你需要建立 sandbox (也就是 image 的 rootfs)
再透過調整好的 sandbox 來建立 sif image
建立 Sandbox
在 University of Bern 的投影片中絕大多數需要 sudo 的操作都可以透過 --fakeroot 參數取代
像是建立 sandbox 原本的指令會是:
但是透過 fakeroot 特性, 現在只需要:
$ singularity build --fakeroot --sandbox ubuntu_18.04 docker://ubuntu:18.04
如此你就建立了可以修改的 sandbox, sandbox 的功能與 SIF image 相同
但最大的不同是它可以 writable! 所以可以用來修改與建立想要的環境
接著讓我們以安裝 gcc 與 clang 為例
首先透過 fakeroot 以 writable 方式開啟 ubuntu_18.04 環境, 並 apt-get update
$ singularity shell --fakeroot --writable ubuntu_18.04
接著來以 apt-get install gcc clang 指令試試看安裝 gcc & clang
要安裝的是 gcc-7 與 clang-6.0 完全就是 ubuntu 18.04 的套件版本
透過 sandbox 建立 SIF image 檔案
安裝完後當然可以直接使用 gcc / clang, 但這裡我們先離開 sandbox 環境
接著要把修改好的 sandbox 封裝成方便轉移與可供他人使用的 SIF image 檔案
將 sandbox 轉為 sif 的指令為:
$ singularity build --fakeroot ubuntu_18.04_dev.sif ubuntu_18.04
是的, build 的來源不僅只能是 docker hub, 還能由客製的 sandbox 與 singularity hub
在此觀察了 sif 檔案大小, 發現大小增加到 210MB 上下
這個新建立的 ubuntu_18.04_dev.sif 就可以提供給任何人來使用
編譯測試
這裡建立了一個 test/test.c 作為切換的展示
而 test/test.c 內容為:
#include <stdio.h>
int main(void)
{
printf("This is a singularity test.\n");
}
這個測試是展示在相同的目錄下切換不同系統環境
清除 sandbox 目錄
由於 sandbox 是透過 fakeroot 身份建立的, 因此可能會有無法用自身帳號移除部份檔案/目錄的情況
這時候請執行 fakeroot 指令轉換為 (fake) root
雖然顯示為 root, 但是事實上並不是真的 root 也無法執行實際系統上需要 root 的指令 (這裡嘗試執行 apt-get update)
這時用此方式就可以順利移除產生的 sandbox
如何? Singularity 是不是簡單好吃不黏牙?
UPDATE - 由於 Sylabs 的公司化與透過 Singularity 與營利, 然而又並沒有改名, 因此原本社群版本在 2021 年 11 月時更名為 Apptainer