Linux小宝典之理解Chroot模式
Chroot 在 Linux 系統中發揮了根目錄的切換工作,同時帶來了系統的安全性等好處。本文通過編寫 chroot 來理解 chroot 的作用和好處,這不僅有助于更好的使用 chroot,同時加深了對 Linix 系統初始 RAM 磁盤工作的認識。
chroot,即 change root directory (更改 root 目錄)。在 linux 系統中,系統默認的目錄結構都是以 `/`,即是以根 (root) 開始的。而在使用 chroot 之后,系統的目錄結構將以指定的位置作為 `/` 位置。
在經過 chroot 之后,系統讀取到的目錄和文件將不在是舊系統根下的而是新根下(即被指定的新的位置)的目錄結構和文件,因此它帶來的好處大致有以下3個:
在經過 chroot 之后,在新根下將訪問不到舊系統的根目錄結構和文件,這樣就增強了系統的安全性。這個一般是在登錄 (login) 前使用 chroot,以此達到用戶不能訪問一些特定的文件。
使用 chroot 后,系統讀取的是新根下的目錄和文件,這是一個與原系統根下文件不相關的目錄結構。在這個新的環境中,可以用來測試軟件的靜態編譯以及一些與系統不相關的獨立開發。
chroot 的作用就是切換系統的根位置,而這個作用最為明顯的是在系統初始引導磁盤的處理過程中使用,從初始 RAM 磁盤 (initrd) 切換系統的根位置并執行真正的 init。另外,當系統出現一些問題時,我們也可以使用 chroot 來切換到一個臨時的系統。
為了更好的理解 chroot 發揮的作用,我們將嘗試指定一個特定的位置進行根目錄切換。但是由于在經過 chroot 之后,系統讀取到的 bin/ 等與系統相關目錄將不再是舊系統根目錄下的,而是切換后新根下的目錄結構和文件,因此我們有必要準備一些目錄結構以及必要的文件。
$ pwd
/home/wstone/Build/work
$ tree .
.
|-- bin
| |-- ash -> busybox
| |-- bash
| `-- busybox
|-- etc
`-- newhome
這里使用了靜態編譯后的 busybox 來提供必要的命令,使用靜態編譯僅是為了避免動態庫文件的拷貝。當然我們也可以拷貝舊系統的下的命令到新的目錄結構中使用,但是那些命令通常是動態編譯的,這就意味著我們不得不拷貝相關的動態庫文件到相應的目錄結構中。同時這里的 bash 也非真正的 Bourne Again shell,而是一個執行 ash 的 shell 腳本。展示了位于舊系統中的 chroot 命令的使用。需要注意的是在使用 chroot 時,要求擁有相關的操作權限。
$ pwd /home/wstone/Build/work# chroot . # pwd /# ls ash: ls: not found# busybox ls bin etc newhome3 directories, 3 files我們可以看到當前路徑(/home/wstone/Build/work/),在經過 chroot 后轉變成了 `/` 目錄,同時從新根下讀取了與系統相關的目錄結構。使用ls 命令失敗是由于我們創建的測試目錄結構中并沒有包含命令 ls,但是我們成功的使用了 busybox 中的 ls。以上看到的只是 chroot 的一種使用方式,其實標準的 chroot (Coreutils - GNU core utilities 提供的 chroot)使用方式有2種:
清單 3. 標準 chroot 的2種使用方式
| [1] chroot NEWROOT [COMMAND...] [2] chroot OPTION |
剛才我們使用的是方式[2]。這將在沒有給定環境時,默認執行 `/bin/sh`,但是當給定環境后,將運行 `${SHELL} –i`,即與環境相同的可交互的 shell。我們的目錄結構中并沒有包含sh,顯然清單 2中的 chroot 運行了 `${SHELL} –i`。當然我們也可以在進行切換時指定需要的命令,即使用方式[1]。
清單 4. chroot 另一種方式的使用
# chroot . /bin/ash
#
在清單 4 中,嘗試了在經過 chroot 后,執行新目錄結構下的 ash shell。不得不說的是,如果新根下的目錄結構和文件準備的夠充分,那么一個新的簡單的 Linux 系統就可以使用了。其實更為常見的是在初始 RAM 磁盤 (initrd)中使用 chroot,以此來執行系統的init。清單 5 中,展示的是在 Linux 2.4 內核 initrd 中使用 chroot。
清單 5. 在 Linux 2.4 內核 initrd 中使用 chroot 的示例
| mount /dev/hda1 /new-root cd /new-root pivot_root . old-root exec chroot . /sbin/init <dev/console >dev/console 2>&1 umount /old-root |
由于 Linux 內核的升級,initrd 處理機制和格式發生了變化,在 Linux 2.6 內核 initrd 中不能再使用 pivot_root,因此一般也不再使用 chroot,而是選擇使用 busybox 提供的 switch_root 或者 klibc 提供的 run-init 進行根目錄的切換。(這并不是說不能在 Linux 2.6內核 initrd 中使用 chroot,選擇 switch_root 或 run-init 僅是出于習慣和方便的考慮。)但是實質上,它們僅是將 chroot 的功能進行了封裝,以此更加方便簡單的切換根目錄。
清單 6. 在 Linux 2.6 內核 initrd 中 chroot 的使用
| [1] find -xdev / -exec rm '{}' '; [2] cd /newmount; mount --move . /; chroot . |
switch_root 和 run-init 完成了類似清單 6中的功能,刪除 rootfs 的全部內容以釋放空間,以及掛載新的根文件系統并進行切換。在 busybox 和 klibc中也有提供 chroot 命令,只是功能上與 Coreutils (GNU core utilities) 包含的 chroot 有稍許差異。
總結
以上是生活随笔為你收集整理的Linux小宝典之理解Chroot模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql启动报错:Another My
- 下一篇: CentOS6.3 重启后/etc/re