最近需要編譯一個很挑剔 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。

novus 發表在 痞客邦 PIXNET 留言(0) 人氣()