如何在Linux中實現chroot在使用者空間的效果(不用root)?
目標是在主機 Linux 系統內的一個移位(重新定位)發行版(其 / 不得與全域 / 重合)中安裝和執行程序。這些程序不適合使用不同的 / 。
fakechroot 不是一個完整的解決方案,因為它使用庫替換而不是在系統呼叫級別上起作用(因此對靜態連結的二進製文件不利)。
解決方案可能必須基於 ptrace 或namespaces (unshare)。
基於 ptrace 的解決方案可能不如基於命名空間/unshare 的解決方案有效(但後一種技術是尖端的,可能沒有很好的探索路徑)。
基於 ptrace
UMView
至於基於 ptrced 的解決方案,感謝https://stackoverflow.com/a/1019720/94687上的評論,我發現了 UMView:
- http://wiki.virtualsquare.org/wiki/index.php/ViewFS
- http://wiki.virtualsquare.org/wiki/index.php/Virtual_installation_of_software
連結的文件描述瞭如何擁有主機 fs 的“寫入時複製視圖”——這與執行 chroot 並不完全一樣。關於如何在 umview 中實現 /-substitution 的確切說明會很好地回答我的問題(如果你知道如何做到這一點,請寫一個!)。
umview 必須是開源的,因為它包含在 Ubuntu 和 Debian 中—— http://packages.ubuntu.com/lucid/umview。
“限製程序”
在http://www.cs.vu.nl/~rutger/publications/jailer.pdf、http://www.cs.vu.nl/~guido/mansion/publications/ps/secrypt07.pdf中描述了另一種實現.
他們有一個改變根的策略規則,CHRDIR,它的效果類似於 chroot。(“監禁政策”一節)
但是,他們可能還沒有發布他們的原始碼(部分基於修改後的 strace http://www.liacs.nl/~wichert/strace/ - “實施”部分)……
喬迪
Geordi ( http://www.eelis.net/geordi/ , https://github.com/Eelis/geordi ) 可能會被修改以在被監禁的程序中對系統呼叫進行所需的文件參數重寫。
proat
PRoot是一個現成的基於 ptrace 的工具。http://proot.me/:
chroot 等效項
要在給定的 Linux 發行版中執行命令,只需給出來賓 rootfs 的路徑,然後給出所需的命令。下面的範例執行程序 cat 以列印文件的內容:
proot -r /mnt/slackware-8.0/ cat /etc/motd Welcome to Slackware Linux 8.0
未指定時,預設命令為 /bin/sh。因此,限制互動式 shell 及其所有子程序的最短方法是:
proot -r /mnt/slackware-8.0/ $ cat /etc/motd Welcome to Slackware Linux 8.0
基於非共享
自提出問題以來,Linux 核心中的 user_namespaces 支持變得更加成熟。現在,您可以在Simulate chroot with unshare
chroot
的幫助下正常執行 a :unshare
unshare --user --map-root-user --mount-proc --pid --fork chroot ...... su - user1