日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Linux chroot命令

發(fā)布時間:2025/3/15 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux chroot命令 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是 chroot?

chroot,即 change root directory (更改 root 目錄)。在 linux 系統(tǒng)中,系統(tǒng)默認的目錄結構都是以?/,即是以根 (root) 開始的。而在使用 chroot 之后,系統(tǒng)的目錄結構將以指定的位置作為?/?位置。

圖 1. Linux 系統(tǒng)的目錄結構?

為何使用 chroot?

在經過 chroot 之后,系統(tǒng)讀取到的目錄和文件將不在是舊系統(tǒng)根下的而是新根下(即被指定的新的位置)的目錄結構和文件,因此它帶來的好處大致有以下3個:

A. 增加了系統(tǒng)的安全性,限制了用戶的權力;?
在經過 chroot 之后,在新根下將訪問不到舊系統(tǒng)的根目錄結構和文件,這樣就增強了系統(tǒng)的安全性。這個一般是在登錄 (login) 前使用 chroot,以此達到用戶不能訪問一些特定的文件。

B. 建立一個與原系統(tǒng)隔離的系統(tǒng)目錄結構,方便用戶的開發(fā);?
使用 chroot 后,系統(tǒng)讀取的是新根下的目錄和文件,這是一個與原系統(tǒng)根下文件不相關的目錄結構。在這個新的環(huán)境中,可以用來測試軟件的靜態(tài)編譯以及一些與系統(tǒng)不相關的獨立開發(fā)。

C. 切換系統(tǒng)的根目錄位置,引導 Linux 系統(tǒng)啟動以及急救系統(tǒng)等。?
chroot 的作用就是切換系統(tǒng)的根位置,而這個作用最為明顯的是在系統(tǒng)初始引導磁盤的處理過程中使用,從初始 RAM 磁盤 (initrd) 切換系統(tǒng)的根位置并執(zhí)行真正的 init。另外,當系統(tǒng)出現(xiàn)一些問題時,我們也可以使用 chroot 來切換到一個臨時的系統(tǒng)。

chroot 的使用?

為了更好的理解 chroot 發(fā)揮的作用,我們將嘗試指定一個特定的位置進行根目錄切換。但是由于在經過 chroot 之后,系統(tǒng)讀取到的 bin/ 等與系統(tǒng)相關目錄將不再是舊系統(tǒng)根目錄下的,而是切換后新根下的目錄結構和文件,因此我們有必要準備一些目錄結構以及必要的文件。

清單 1. 準備切換的目錄結構

$ pwd
/home/wstone/Build/work
$ tree .
.
|-- bin
| |-- ash -> busybox
| |-- bash
| `-- busybox
|-- etc
`-- newhome

這里使用了靜態(tài)編譯后的 busybox 來提供必要的命令,使用靜態(tài)編譯僅是為了避免動態(tài)庫文件的拷貝。當然我們也可以拷貝舊系統(tǒng)的下的命令到新的目錄結構中使用,但是那些命令通常是動態(tài)編譯的,這就意味著我們不得不拷貝相關的動態(tài)庫文件到相應的目錄結構中。同時這里的 bash 也非真正的 Bourne Again shell,而是一個執(zhí)行 ash 的 shell 腳本。在清單 2中,展示了位于舊系統(tǒng)中的 chroot 命令的使用。需要注意的是在使用 chroot 時,要求擁有相關的操作權限。

在/home/wstone/Build/work 目錄下建立一個文件,名為”bash”,內容就兩行如下:

#!/bin/ash
ash

然后給與這個”bash”文件可執(zhí)行權利?
chmod +x ./bin/bash

這個腳本的第一句表示解析該腳本的解釋器( interpreter)所在位置。chroot缺省執(zhí)行/bin/bash命令。為了要在新的chroot環(huán)境下使用ash,所以建立/bin/bash這個用來執(zhí)行ash的文件。也可以顯示的指出要執(zhí)行的命令,比如要執(zhí)行ash

$ pwd

/home/wstone/Build/work

$chroot . ./bin/ash #pwd

/

清單 2. 位于系統(tǒng)中的 chroot 的使用

$ pwd
/home/wstone/Build/work

# chroot .
# pwd

/

# ls
ash: ls: not found

# busybox ls
bin ? ? ?etc ? ? ?newhome

3 directories, 3 files

我們可以看到當前路徑(/home/wstone/Build/work/),在經過 chroot 后轉變成了?/?目錄,同時從新根下讀取了與系統(tǒng)相關的目錄結構。使用 ls 命令失敗是由于我們創(chuàng)建的測試目錄結構中并沒有包含命令 ls,但是我們成功的使用了 busybox 中的 ls。以上看到的只是 chroot 的一種使用方式,其實標準的 chroot (Coreutils - GNU core utilities 提供的 chroot)使用方式有2種:

清單 3. 標準 chroot 的2種使用方式

[1] chroot NEWROOT [COMMAND...]

[2] chroot OPTION

剛才我們使用的是方式[2]。這將在沒有給定環(huán)境時,默認執(zhí)行?/bin/sh,但是當給定環(huán)境后,將運行?${SHELL} –i,即與環(huán)境相同的可交互的 shell。我們的目錄結構中并沒有包含sh,顯然清單 2中的 chroot 運行了?${SHELL} –i。當然我們也可以在進行切換時指定需要的命令,即使用方式[1]。

清單 4. chroot 另一種方式的使用

# chroot . /bin/ash

#

在清單 4 中,嘗試了在經過 chroot 后,執(zhí)行新目錄結構下的 ash shell。不得不說的是,如果新根下的目錄結構和文件準備的夠充分,那么一個新的簡單的 Linux 系統(tǒng)就可以使用了。其實更為常見的是在初始 RAM 磁盤 (initrd)中使用 chroot,以此來執(zhí)行系統(tǒng)的 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 處理機制和格式發(fā)生了變化,在 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 的全部內容以釋放空間,以及掛載新的根文件系統(tǒng)并進行切換。在 busybox 和 klibc中也有提供 chroot 命令,只是功能上與 Coreutils (GNU core utilities) 包含的 chroot 有稍許差異。?
編寫一個 chroot

上面介紹了 chroot 及其使用,但是編寫一個簡單的 chroot 并不復雜,下面我們就嘗試編寫chroot 以此來更好的認識 chroot 的處理過程,先編寫一個粗略的 chroot 然后再完善它的功能。chroot 的編寫涉及了2個函數(shù),chroot() 以及 chdir(),它們都包含在 unistd.h 頭文件中。

清單 7. 編寫 chroot 涉及的2個函數(shù)

#include <unistd.h> int chroot(const char *path); int chdir(const char *path);

chroot() 將切換參數(shù) path 所指位置為根目錄 (/),chdir() 用來將當前的工作目錄改變成以參數(shù)path 所指的目錄。以此我們可以編寫一個非常粗略的?chroot。

清單 8. 粗略的?chroot

#include <unistd.h>int main(int argc, char *argv[]) {chroot(".");chdir("/");char *arrays[]={"ash",NULL};execvp("ash", arrays);return 0; }

這個粗略的?chroot?僅能切換當前位置為根目錄,同時默認執(zhí)行 ash shell,不包含任何的錯誤處理及警告。編寫并保存代碼為 test.c。在清單 9 中,展示了這個粗略?chroot?的使用情況,成功的進行了根目錄的切換。

清單 9. 粗略?chroot?的使用

$ gcc -Wall test.c -o test# ./test # ls ash: ls: not found# busybox ls bin etc newhome test test.c

下面給出功能將近完整的 chroot ,加上了一些錯誤處理并新增了可執(zhí)行指定命令的功能。當在沒有給出 chroot 切換后要執(zhí)行的命令時,默認執(zhí)行?/bin/sh,同時檢測環(huán)境以確認使用何種 shell。

清單 10. 功能完整的 chroot

#include <stdio.h> #include <unistd.h> #include <stdlib.h>int main(int argc, char *argv[]) {if(argc<2){printf("Usage: chroot NEWROOT [COMMAND...] \n");return 1;}printf("newroot = %s\n", argv[1]);if(chroot(argv[1])) {perror("chroot");return 1;}if(chdir("/")) {perror("chdir");return 1;}if(argc == 2) {argv[0] = getenv("SHELL");if(!argv[0])argv[0] = (char *)"/bin/sh";argv[1] = (char *) "-i";argv[2] = NULL;} else {argv += 2;}execvp (argv[0], argv);printf("chroot: cannot run command `%s`\n", *argv);return 0; }

保存以上代碼為 newchroot.c 文件,編譯后運行測試其功能。最后要指出的是,本文中的?chroot?并沒有使用靜態(tài)編譯。如果有必要(如,在 initrd 中使用 chroot),chroot 應該使用靜態(tài)編譯,若是使用動態(tài)編譯,那么要拷貝相關的動態(tài)庫文件到相應目錄結構中。

清單 11.?newchroot?的測試

$ gcc -Wall newchroot.c -o newchroot# ./newchroot . /bin/ash newroot = . #

?

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的Linux chroot命令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。