chroot命令用來在指定的根目錄下運行指令。chroot,即 change root directory (更改 root 目錄)。在 linux 系統中,系統默認的目錄結構都是以/
,即是以根 (root) 開始的。而在使用 chroot 之后,系統的目錄結構將以指定的位置作為/
位置。
在經過 chroot 之后,系統讀取到的目錄和文件將不在是舊系統根下的而是新根下(即被指定的新的位置)的目錄結構和文件,因此它帶來的好處大致有以下3個:
- 增加了系統的安全性,限制了用戶的權力;
在經過 chroot 之后,在新根下將訪問不到舊系統的根目錄結構和文件,這樣就增強了系統的安全性。這個一般是在登錄 (login) 前使用 chroot,以此達到用戶不能訪問一些特定的文件。
- 建立一個與原系統隔離的系統目錄結構,方便用戶的開發;
使用 chroot 后,系統讀取的是新根下的目錄和文件,這是一個與原系統根下文件不相關的目錄結構。在這個新的環境中,可以用來測試軟件的靜態編譯以及一些與系統不相關的獨立開發。
- 切換系統的根目錄位置,引導 Linux 系統啟動以及急救系統等。
chroot 的作用就是切換系統的根位置,而這個作用最為明顯的是在系統初始引導磁盤的處理過程中使用,從初始 RAM 磁盤 (initrd) 切換系統的根位置並執行真正的 init。另外,當系統出現一些問題時,我們也可以使用 chroot 來切換到一個臨時的系統。
做個演示:
- 創建一個目錄作為根目錄,chroot MyRootDir默認會執行${SHELL} -i,即MyRootDir/bin/bash,所以需要拷貝bash到指定目錄
- 直接執行chroot MyRootDir出現錯誤:chroot: failed to run command ‘/bin/bash’: No such file or directory,原因是缺少bash相關的庫,使用ldd查看庫並拷貝(此例子中為簡化演示,直接拷貝/lib目錄)
- 這樣就執行新根目錄內的命令
- 也可以手動指定bash路徑切換,這樣就不需要將bash放入新根路徑的/bin目錄下
chroot的第三個參數為運行的指令,該指令位於新的root路徑,從下面可以驗證改命令執行的不是系統路徑的命令
下面是chroot的命令說明:
從chroot的用法可以看出它的使用場景有一定的局限性,首先它依賴於一台現成的unix系統(根目錄必須存在於某台現有系統上),其次chroot僅僅是在系統目錄上進行了隔離,並沒有對進程、網絡等層面進行隔離。
首先檢驗一下進程空間:
在pts/0端切換到新的根目錄,執行ping 127.0.0.1操作,該操作屬於新根目錄下進行的
新開一個終端界面,查看ping進程可以看到在原系統下面是可以看到新根目錄下執行的進程。chroot並沒有在進程層面上進行隔離
同樣地在新根目錄下執行ifconfig等網絡操作可以看到網絡信息跟原系統是完全一樣的。chroot並沒有在網絡層面上進行隔離
chroot並不能完全保證系統安全,在很多層面上chroot並沒有進行完全隔離
詳細技術講解參見:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/