chroot,即 change root directory (更改 root 目錄)。在 linux 系統中,系統默認的目錄結構都是以 /,即以根 (root) 開始的。而在使用 chroot 之后,系統的目錄結構將以指定的位置作為 / 位置。
基本語法
chroot NEWROOT [COMMAND [ARG]...]
具體用法請參考本文的 demo。
為什么要使用 chroot 命令
增加了系統的安全性,限制了用戶的權力:
在經過 chroot 之后,在新根下將訪問不到舊系統的根目錄結構和文件,這樣就增強了系統的安全性。一般會在用戶登錄前應用 chroot,把用戶的訪問能力控制在一定的范圍之內。
建立一個與原系統隔離的系統目錄結構,方便用戶的開發:
使用 chroot 后,系統讀取的是新根下的目錄和文件,這是一個與原系統根下文件不相關的目錄結構。在這個新的環境中,可以用來測試軟件的靜態編譯以及一些與系統不相關的獨立開發。
切換系統的根目錄位置,引導 Linux 系統啟動以及急救系統等:
chroot 的作用就是切換系統的根位置,而這個作用最為明顯的是在系統初始引導磁盤的處理過程中使用,從初始 RAM 磁盤 (initrd) 切換系統的根位置并執行真正的 init,本文的最后一個 demo 會詳細的介紹這種用法。
通過 chroot 運行 busybox 工具
busybox 包含了豐富的工具,我們可以把這些工具放置在一個目錄下,然后通過 chroot 構造出一個 mini 系統。簡單起見我們直接使用 docker 的 busybox 鏡像打包的文件系統。先在當前目錄下創建一個目錄 rootfs:
$ mkdir rootfs
然后把 busybox 鏡像中的文件釋放到這個目錄中:
$ (docker export $(docker create busybox) | tar -C rootfs -xvf -)
通過 ls 命令查看 rootfs 文件夾下的內容:
$ ls rootfs

萬事俱備,讓我們開始吧!
執行 chroot 后的 ls 命令
$ sudo chroot rootfs /bin/ls

雖然輸出結果與剛才執行的 ls rootfs 命令形同,但是這次運行的命令卻是 rootfs/bin/ls。
運行 chroot 后的 pwd 命令
$ sudo chroot rootfs /bin/pwd

哈,pwd 命令真把 rootfs 目錄當根目錄了!
不帶命令執行 chroot
$ sudo chroot rootfs

這次出錯了,因為找不到 /bin/bash。我們知道 busybox 中是不包含 bash 的,但是 chroot 命令為什么會找 bash 命令呢? 原來,如果不給 chroot 指定執行的命令,默認它會執行 '${SHELL} -i',而我的系統中 ${SHELL} 為 /bin/bash。
既然 busybox 中沒有 bash,我們只好指定 /bin/sh 來執行 shell 了。
$ sudo chroot rootfs /bin/sh

運行 sh 是沒有問題的,并且我們打印出了當前進程的 PID。
檢查程序是否運行在 chroot 環境下
雖然我們做了好幾個實驗,但是肯定會有朋友心存疑問,怎么能證明我們運行的命令就是在 chroot 目錄后的路徑中呢?
新聞熱點
疑難解答