2020年10月16日 星期五

Linux Developer 都應該學習的 Container 工具 - Apptainer / Singularity

現今對於 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 GuideAdmin 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 原本的指令會是:

$ sudo singularity build --sandbox ubuntu_18.04 docker://ubuntu:18.04

但是透過 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


沒有留言:

在 ARM 平台上使用 Function Multi-Versioning (FMV) - 以使用 Android NDK 為例

Function Multi-Versioning (FMV) 過往的 CPU 發展歷程中, x86 平台由於因應各種應用需求的提出, 而陸陸續續加入了不同的指令集, 此外也可能因為針對市場做等級區隔, 支援的數量與種類也不等. 在 Linux 平台上這些 CPU 資訊可以透過...