Linux chroot命令
什么是 chroot?
chroot,即 change root directory (更改 root 目錄)。在 linux 系統(tǒng)中,系統(tǒng)默認(rèn)的目錄結(jié)構(gòu)都是以?/,即是以根 (root) 開(kāi)始的。而在使用 chroot 之后,系統(tǒng)的目錄結(jié)構(gòu)將以指定的位置作為?/?位置。
圖 1. Linux 系統(tǒng)的目錄結(jié)構(gòu)?
為何使用 chroot?
在經(jīng)過(guò) chroot 之后,系統(tǒng)讀取到的目錄和文件將不在是舊系統(tǒng)根下的而是新根下(即被指定的新的位置)的目錄結(jié)構(gòu)和文件,因此它帶來(lái)的好處大致有以下3個(gè):
A. 增加了系統(tǒng)的安全性,限制了用戶的權(quán)力;?
在經(jīng)過(guò) chroot 之后,在新根下將訪問(wèn)不到舊系統(tǒng)的根目錄結(jié)構(gòu)和文件,這樣就增強(qiáng)了系統(tǒng)的安全性。這個(gè)一般是在登錄 (login) 前使用 chroot,以此達(dá)到用戶不能訪問(wèn)一些特定的文件。
B. 建立一個(gè)與原系統(tǒng)隔離的系統(tǒng)目錄結(jié)構(gòu),方便用戶的開(kāi)發(fā);?
使用 chroot 后,系統(tǒng)讀取的是新根下的目錄和文件,這是一個(gè)與原系統(tǒng)根下文件不相關(guān)的目錄結(jié)構(gòu)。在這個(gè)新的環(huán)境中,可以用來(lái)測(cè)試軟件的靜態(tài)編譯以及一些與系統(tǒng)不相關(guān)的獨(dú)立開(kāi)發(fā)。
C. 切換系統(tǒng)的根目錄位置,引導(dǎo) Linux 系統(tǒng)啟動(dòng)以及急救系統(tǒng)等。?
chroot 的作用就是切換系統(tǒng)的根位置,而這個(gè)作用最為明顯的是在系統(tǒng)初始引導(dǎo)磁盤(pán)的處理過(guò)程中使用,從初始 RAM 磁盤(pán) (initrd) 切換系統(tǒng)的根位置并執(zhí)行真正的 init。另外,當(dāng)系統(tǒng)出現(xiàn)一些問(wèn)題時(shí),我們也可以使用 chroot 來(lái)切換到一個(gè)臨時(shí)的系統(tǒng)。
chroot 的使用?
為了更好的理解 chroot 發(fā)揮的作用,我們將嘗試指定一個(gè)特定的位置進(jìn)行根目錄切換。但是由于在經(jīng)過(guò) chroot 之后,系統(tǒng)讀取到的 bin/ 等與系統(tǒng)相關(guān)目錄將不再是舊系統(tǒng)根目錄下的,而是切換后新根下的目錄結(jié)構(gòu)和文件,因此我們有必要準(zhǔn)備一些目錄結(jié)構(gòu)以及必要的文件。
清單 1. 準(zhǔn)備切換的目錄結(jié)構(gòu)
$ pwd
/home/wstone/Build/work
$ tree .
.
|-- bin
| |-- ash -> busybox
| |-- bash
| `-- busybox
|-- etc
`-- newhome
這里使用了靜態(tài)編譯后的 busybox 來(lái)提供必要的命令,使用靜態(tài)編譯僅是為了避免動(dòng)態(tài)庫(kù)文件的拷貝。當(dāng)然我們也可以拷貝舊系統(tǒng)的下的命令到新的目錄結(jié)構(gòu)中使用,但是那些命令通常是動(dòng)態(tài)編譯的,這就意味著我們不得不拷貝相關(guān)的動(dòng)態(tài)庫(kù)文件到相應(yīng)的目錄結(jié)構(gòu)中。同時(shí)這里的 bash 也非真正的 Bourne Again shell,而是一個(gè)執(zhí)行 ash 的 shell 腳本。在清單 2中,展示了位于舊系統(tǒng)中的 chroot 命令的使用。需要注意的是在使用 chroot 時(shí),要求擁有相關(guān)的操作權(quán)限。
在/home/wstone/Build/work 目錄下建立一個(gè)文件,名為”bash”,內(nèi)容就兩行如下:
#!/bin/ash
ash
然后給與這個(gè)”bash”文件可執(zhí)行權(quán)利?
chmod +x ./bin/bash
這個(gè)腳本的第一句表示解析該腳本的解釋器( interpreter)所在位置。chroot缺省執(zhí)行/bin/bash命令。為了要在新的chroot環(huán)境下使用ash,所以建立/bin/bash這個(gè)用來(lái)執(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
我們可以看到當(dāng)前路徑(/home/wstone/Build/work/),在經(jīng)過(guò) chroot 后轉(zhuǎn)變成了?/?目錄,同時(shí)從新根下讀取了與系統(tǒng)相關(guān)的目錄結(jié)構(gòu)。使用 ls 命令失敗是由于我們創(chuàng)建的測(cè)試目錄結(jié)構(gòu)中并沒(méi)有包含命令 ls,但是我們成功的使用了 busybox 中的 ls。以上看到的只是 chroot 的一種使用方式,其實(shí)標(biāo)準(zhǔn)的 chroot (Coreutils - GNU core utilities 提供的 chroot)使用方式有2種:
清單 3. 標(biāo)準(zhǔn) chroot 的2種使用方式
[1] chroot NEWROOT [COMMAND...]
[2] chroot OPTION
剛才我們使用的是方式[2]。這將在沒(méi)有給定環(huán)境時(shí),默認(rèn)執(zhí)行?/bin/sh,但是當(dāng)給定環(huán)境后,將運(yùn)行?${SHELL} –i,即與環(huán)境相同的可交互的 shell。我們的目錄結(jié)構(gòu)中并沒(méi)有包含sh,顯然清單 2中的 chroot 運(yùn)行了?${SHELL} –i。當(dāng)然我們也可以在進(jìn)行切換時(shí)指定需要的命令,即使用方式[1]。
清單 4. chroot 另一種方式的使用
# chroot . /bin/ash
#
在清單 4 中,嘗試了在經(jīng)過(guò) chroot 后,執(zhí)行新目錄結(jié)構(gòu)下的 ash shell。不得不說(shuō)的是,如果新根下的目錄結(jié)構(gòu)和文件準(zhǔn)備的夠充分,那么一個(gè)新的簡(jiǎn)單的 Linux 系統(tǒng)就可以使用了。其實(shí)更為常見(jiàn)的是在初始 RAM 磁盤(pán) (initrd)中使用 chroot,以此來(lái)執(zhí)行系統(tǒng)的 init。清單 5 中,展示的是在 Linux 2.4 內(nèi)核 initrd 中使用 chroot。
清單 5. 在 Linux 2.4 內(nèi)核 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 內(nèi)核的升級(jí),initrd 處理機(jī)制和格式發(fā)生了變化,在 Linux 2.6 內(nèi)核 initrd 中不能再使用 pivot_root,因此一般也不再使用 chroot,而是選擇使用 busybox 提供的 switch_root 或者 klibc 提供的 run-init 進(jìn)行根目錄的切換。(這并不是說(shuō)不能在 Linux 2.6內(nèi)核 initrd 中使用 chroot,選擇 switch_root 或 run-init 僅是出于習(xí)慣和方便的考慮。)但是實(shí)質(zhì)上,它們僅是將 chroot 的功能進(jìn)行了封裝,以此更加方便簡(jiǎn)單的切換根目錄。
清單 6. 在 Linux 2.6 內(nèi)核 initrd 中 chroot 的使用
[1] find -xdev / -exec rm '{}' ';
[2] cd /newmount; mount --move . /; chroot .
switch_root 和 run-init 完成了類(lèi)似清單 6中的功能,刪除 rootfs 的全部?jī)?nèi)容以釋放空間,以及掛載新的根文件系統(tǒng)并進(jìn)行切換。在 busybox 和 klibc中也有提供 chroot 命令,只是功能上與 Coreutils (GNU core utilities) 包含的 chroot 有稍許差異。?
編寫(xiě)一個(gè) chroot
上面介紹了 chroot 及其使用,但是編寫(xiě)一個(gè)簡(jiǎn)單的 chroot 并不復(fù)雜,下面我們就嘗試編寫(xiě)chroot 以此來(lái)更好的認(rèn)識(shí) chroot 的處理過(guò)程,先編寫(xiě)一個(gè)粗略的 chroot 然后再完善它的功能。chroot 的編寫(xiě)涉及了2個(gè)函數(shù),chroot() 以及 chdir(),它們都包含在 unistd.h 頭文件中。
清單 7. 編寫(xiě) chroot 涉及的2個(gè)函數(shù)
#include <unistd.h> int chroot(const char *path); int chdir(const char *path);chroot() 將切換參數(shù) path 所指位置為根目錄 (/),chdir() 用來(lái)將當(dāng)前的工作目錄改變成以參數(shù)path 所指的目錄。以此我們可以編寫(xiě)一個(gè)非常粗略的?chroot。
清單 8. 粗略的?chroot
#include <unistd.h>int main(int argc, char *argv[]) {chroot(".");chdir("/");char *arrays[]={"ash",NULL};execvp("ash", arrays);return 0; }這個(gè)粗略的?chroot?僅能切換當(dāng)前位置為根目錄,同時(shí)默認(rèn)執(zhí)行 ash shell,不包含任何的錯(cuò)誤處理及警告。編寫(xiě)并保存代碼為 test.c。在清單 9 中,展示了這個(gè)粗略?chroot?的使用情況,成功的進(jìn)行了根目錄的切換。
清單 9. 粗略?chroot?的使用
$ gcc -Wall test.c -o test# ./test # ls ash: ls: not found# busybox ls bin etc newhome test test.c下面給出功能將近完整的 chroot ,加上了一些錯(cuò)誤處理并新增了可執(zhí)行指定命令的功能。當(dāng)在沒(méi)有給出 chroot 切換后要執(zhí)行的命令時(shí),默認(rèn)執(zhí)行?/bin/sh,同時(shí)檢測(cè)環(huán)境以確認(rè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 文件,編譯后運(yùn)行測(cè)試其功能。最后要指出的是,本文中的?chroot?并沒(méi)有使用靜態(tài)編譯。如果有必要(如,在 initrd 中使用 chroot),chroot 應(yīng)該使用靜態(tài)編譯,若是使用動(dòng)態(tài)編譯,那么要拷貝相關(guān)的動(dòng)態(tài)庫(kù)文件到相應(yīng)目錄結(jié)構(gòu)中。
清單 11.?newchroot?的測(cè)試
$ gcc -Wall newchroot.c -o newchroot# ./newchroot . /bin/ash newroot = . #?
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的Linux chroot命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网络请求中常见的加密机制和加密算法理解
- 下一篇: 西门子S7comm-plus通信过程及重