最近需要編譯一個很挑剔 gcc 和 glibc 版本、而且作者疑似已經沒有繼續維護的程式。雖然是可以裝多套 gcc 和 glibc,然後以不同的 suffix 和 spec file 切換使用,但我實在不願意去更動那個脆弱的 makefile,所以 chroot 自然成為最有經濟效益的方案。
我研究了一下如何自動幫 chroot 設定環境,於是找到了 schroot,花了一點時間了解之後我幾乎不會想再回去用原有的 chroot 指令。可惜的是網路上關於這個工具的介紹並不多,很多人就只是當成不用 root 權限的 chroot 來用,還有一些讓我不能理解的文章,明明花了篇幅去安裝 schroot 並且撰寫設定檔,結果最後卻還是用原始的 chroot.....
schroot 也是建立在 chroot 之上,但是比起後者有以下的優點:
- 不需要 root 權限。使用 root 權限進入 chroot 環境還是有潛在危險性。
- 可以很方便的設定多個環境。
- 自動化。可以設定進入環境時自動複製檔案、mount 位置、執行程序等等;並且在離開的時候把這些變更還原。
- 可以直接從 disk image 或 archive 進 chroot
撰寫配置檔
使用 schroot 之前要先建立偽系統目錄的內容,可使用 debootstrap 或直接從系統中複製一份,這裡不多說明。接下來要編輯 schroot.conf,對於隨用即丟的環境似乎稍微麻煩一點,這種情況直接用系統的 chroot 命令會比較單純。但對於打算重複使用的環境來說,只要一次把配置檔寫好以後就可以直接進入,還算蠻方便的。
主要配置檔位於 /etc/schroot/schroot.conf,次要配置檔放在 /etc/schroot/chroot.d,兩者的差別我不太清楚,用前者就可以了。配置檔的寫法和 Windows 的 ini 差不多,大概像這樣:
[hardy_amd64] type=directory description=Ubuntu 8.04 Hardy for amd64 directory=/srv/chroot/hardy64 root-users=foo users=foo,bar [sid_file] type=file description=Debian sid file-based chroot file=/srv/chroots/sid.tar.gz priority=3 groups=sbuild
簡單的說明
- 區段名稱和 description 可依個人偏好命名。
- type:可為 plain、directory、file、loopback、block-device、btrfs-snapshot、lvm-snapshot 之一。其中 plain 和 directory 都是資料夾,差別在於 directory 會自動 執行預設的 setup script 和掛載一些目錄,而 plain 什麼都不會做。使用 file 可以直接把 archive 當成 chroot 目標。
- directory:當 type 為 plain 或 directory 時,用來指定目標的位置。
- file:當 type 為 file 時,用來指定目標的位置。
- users: 原系統中可以透過 schroot 進入此子系統的使用者。
- root-user: 原系統中可以透過 schroot 進入此子系統並取得 root 權限的使用者。
我懶得打了,請參考:http://manpages.ubuntu.com/manpages/natty/man5/schroot.conf.5.html
把配置存檔後可以用以下命令列舉
$ schroot -l
假如 hardy_amd64 有出現在上面的列表中,執行
$ schroot -c hardy_amd64 -u <使用者名稱>
複製與掛載檔案
由於我實在沒時間寫教學文章,以下虎頭蛇尾的點到為止,僅提供一些資訊給有興趣的人。
在 /etc/schroot/default 下面有幾個檔案,主要的功能為
- fstab
- 指定原系統當中會被掛載進子系統的目錄,格式和系統的 /etc/fstab 雷同。注意在預設的情況下 schroot 會自動把 host 的 /home 給 bind 進來,這點和 dchroot 或 chroot 不同,如果對子系統的 /home 做變更,原系統也會受到影響。這個行為可以透過編輯 fstab 加以調整,把 /home 那行註解掉即可。
- copyfiles
- 指定每次進入子系統時,原系統中會被複製進子系統的檔案
- nssdatabases
- 指定每次進入子系統時,原系統中會被複製進子系統的資料庫,如 passwd、shadow、group 等等。注意每次進入都會重新複製一次,所以在子系統內對這些資料庫做的變更都會被覆寫掉。不希望這個行為可以更改此檔案。
這裡使用的是 Ubuntu Natty 所對應的版本,舊版可能會叫做 fstab-default、copyfiles-default 這些名稱。
自動執行 script
schroot 會自動執行 /etc/schroot/setup.d/ 底下所找到的 scripts,當 chroot 啟動時會用檔名順序並且以 「setup-start」選項執行,而離開 chroot 時會用相反順序並以「setup-stop」選項執行。可以在現有的檔案中增加你想進行的動作,也可以自己建立新的 script。
留言列表