Singularity 啟用 Fakeroot

Singularity 啟用 Fakeroot

此篇介紹 Singularity fakeroot 功能(又稱為 rootless mode)透過利用 namespace UID/GID 映射,允許無特權的使用者以 “fake root “的權限進行操作容器環境。

簡單來說如果當前使用者,要進行容器內環境組件安裝與操作檔案權限,大多數需要 sudo 的操作,這邊可以直接透過 --fakeroot 參數獲得容器內權限以進行操作。

為什麼要用 fakeroot

fakeroot 能讓使用者在容器裡面具有與 root 幾乎相同的管理權限,可以在容器中使用 sudo 特權。但在當前環境中使用者還是被原擁有權限所限制,fakeroot 可以讓沒有權限操作外部環境的使用者能操作 Container 進行開發,並且減少開發者因權限過大而對當前系統進行錯誤的操作。

簡單來說可以想像 fakeroot 是允許當前運行過程獲得權限來進行操作,但是實際上不會授予權限給使用者。看起來就像擁有"fake" "root",它不會改變容器環境之外的任何東西。

用戶名稱空間與容器一起使用,可以在沒有特權操作的情況下設置容器,從而普通用戶可以充當容器內部的root用戶來執行管理任務,而無需在外部主機上具有root用戶。

更多情境這邊可以參考網路黑貓分享 - Linux Developer 都應該學習的 Container 工具 - Singularity 可能會更有體悟。

點擊查看参考資料
https://sylabs.io/guides/3.6/user-guide/fakeroot.html?highlight=fakeroot

如何在環境啟用 fakeroot

本次實驗環境為:

  • CoreOS 7
  • Singularity: 3.6.4

事前準備:

開始前需先確保以下條件已達成:

  • 環境需求要允許fakeroot創建使用者namespace,需要kernel >= 3.8 參考官方說明
  • 確認當前Linux環境啟用非特權使用者名稱空間已開啟。如CentOS:
1
2
3
sudo sh -c 'echo user.max_user_namespaces=15000 \
>/etc/sysctl.d/90-max_net_namespaces.conf'
sudo sysctl -p /etc/sysctl.d /etc/sysctl.d/90-max_net_namespaces.conf

查看目前使用者的id資訊

透過創建一個新使用者 yylin 為例

1
2
yylin$ id
uid=1001(yylin) gid=1001(yylin) groups=1001(yylin)

fakeroot 主要依賴 /etc/subuid/etc/subgid 文件,在該文件中查找當前環境系統實際 UID/GID 到每個使用者帳號中,並可以在namespace 中重新映射 UID/GID 範圍。

當系統管理員將使用者相關配在這兩個文件中就能使用fakeroot功能

請系统管理員配置 namespace UID/GID 映射

singularity 提供 config fakeroot 指令来统一管理這些文件,這邊要透過 sudo 帳號新增 yylin 使用者於config。

1
2
3
4
5
6
7
8
9
$ sudo singularity config fakeroot --add yylin

# Show generated `/etc/subuid`
$ cat /etc/subuid
1001:4294836224:65536

# Show generated `/etc/subgid`
$ cat /etc/subgid
1001:4294836224:65536

官網補充詳細說明:User Namespaces & Fakeroot


透過 Fakeroot 建立 SIF Container

1
2
3
$ cat Singularity
Bootstrap: docker
From: ubuntu:16.04
1
2
3
4
5
6
7
# 當前使用者無法直接build container
$ singularity build ubuntu_16.04.sif Singularity

# 透過fakeroot執行
$ singularity build --fakeroot ubuntu_16.04.sif docker://ubuntu:18.04
$ ls
ubuntu_16.04.sif

Reference

  1. Fakeroot feature
  2. Linux Developer 都應該學習的 Container 工具 - Singularity
  3. Singularity:配置 fakeroot
  4. https://scits.math.unibe.ch/singularity.html#1

評論