91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux chroot命令詳解

發布時間:2020-09-14 09:56:12 來源:腳本之家 閱讀:161 作者:sparkdev 欄目:服務器

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

linux chroot命令詳解

萬事俱備,讓我們開始吧!

執行 chroot 后的 ls 命令

$ sudo chroot rootfs /bin/ls

linux chroot命令詳解

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

運行 chroot 后的 pwd 命令

$ sudo chroot rootfs /bin/pwd

linux chroot命令詳解

哈,pwd 命令真把 rootfs 目錄當根目錄了!

不帶命令執行 chroot

$ sudo chroot rootfs

linux chroot命令詳解

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

既然 busybox 中沒有 bash,我們只好指定 /bin/sh 來執行 shell 了。

$ sudo chroot rootfs /bin/sh

linux chroot命令詳解

運行 sh 是沒有問題的,并且我們打印出了當前進程的 PID。

檢查程序是否運行在 chroot 環境下

雖然我們做了好幾個實驗,但是肯定會有朋友心存疑問,怎么能證明我們運行的命令就是在 chroot 目錄后的路徑中呢?
其實,我們可以通過 /proc 目錄下的文件檢查進程的中的根目錄,比如我們可以通過下面的代碼檢查上面運行的 /bin/sh 命令的根目錄(請在另外一個 shell 中執行):

$ pid=$(pidof -s sh)
$ sudo ls -ld /proc/$pid/root

linux chroot命令詳解

輸出中的內容明確的指出 PID 為 46644 的進程的根目錄被映射到了 /tmp/rootfs 目錄。

通過代碼理解 chroot 命令

下面我們嘗試自己實現一個 chroot 程序,代碼中涉及到兩個函數,分別是 chroot() 函數和 chdir() 函數,其實真正的 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;
  }

  if(chroot(argv[1])) {
    perror("chroot");
    return 1;
  }
 
  if(chdir("/")) {
    perror("chdir");
    return 1;
  }
 
  if(argc == 2) {
    // hardcode /bin/sh for my busybox tools.
    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;
}

把上面的代碼保存到文件 mychroot.c 文件中,并執行下面的命令進行編譯:

$ gcc -Wall mychroot.c -o mychroot

mychroot 的用法和 chroot 基本相同:

$ sudo ./mychroot ./rootfs

linux chroot命令詳解

特別之處是我們的 mychroot 在沒有傳遞命令的情況下執行了 /bin/sh,原因當然是為了支持我們的 busybox 工具集,筆者在代碼中 hardcode 了默認的 shell:

argv[0] = (char *)"/bin/sh";

從代碼中我們也可以看到,實現 chroot 命令的核心邏輯其實并不復雜。

實例:通過 chroot 重新設置 root 密碼

忘記了 root 密碼該怎么辦?接下來的 demo 將演示如何通過 chroot 命令重新設置 centos7 中被忘記了的 root 密碼。
systemd 的管理機制中,rescure 模式和 emeryency 模式是無法直接取得 root 權限的,需要使用 root 密碼才能進入 rescure 和 emeryency 環境。所以我們需要通過其他方式來設置 root 密碼。我們可以為內核的啟動指定 "rd.break" 參數,從而讓系統在啟動的早期停下來,此時我們可以通過使用 root 權限并結合 chroot 命令完成設置 root 密碼的操作。下面我們一起來看具體的操作過程。

在系統啟動過程中進入開機菜單時按下字母鍵 e 進程開機菜單的編輯模式:

linux chroot命令詳解

這就是系統的開機菜單,按下 e 后進入編輯界面:

linux chroot命令詳解

找到以 "linux16 /vmlinuz-" 開頭的行。如果默認沒有看到該行,需要按向下鍵把它滾動出來。
然后定位到該行結尾處,輸入一個空格和字符串 "rd.break",如下圖所示:

linux chroot命令詳解

接著按下 ctrl + x 以該設置繼續啟動,啟動過程中操作系統會停下來,這是系統啟動過程中的一個非常早的時間點:

linux chroot命令詳解

所以系統的根目錄還掛載在 RAM disk 上(就是內存中的一個文件系統),我們可以通過 mount 命令檢查系統當前掛載的文件系統,下面是我們比較關心的兩條:

linux chroot命令詳解

上圖中 mount 命令輸出的第一行說明此時的根目錄在一個 RAM disk 中, 即 rootfs。
圖中輸出的第二行說明我們的文件系統此時被掛載到了 /sysroot 目錄,并且是只讀的模式:

復制代碼 代碼如下:
/dev/mapper/centos-root on /sysroot type xfs (ro,relatime,attr2,inode64,noquota)

而在我們正常登陸系統的情況下,系統根目錄的掛載情況如下:

復制代碼 代碼如下:
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

該時間點的最大優勢是我們具有 root 權限!所以讓我們開始設置新的 root 密碼吧。

先通過下面的命令把 /sysroot 重新掛載為可讀寫的模式:

switch_root:/# mount -o remount,rw /sysroot

然后用下面 chroot 命令把根目錄切換到我們原來的環境中:

switch_root:/# chroot /sysroot

此時可以理解為:我們以 root 權限登錄了原來的系統,修改密碼就很容易了!用下面的命令為 root 用戶設置新的密碼:

sh-4.2# echo "new_root_pw" | passwd --stdin root

接下來還要處理 SELinux 相關的問題。由于當前的環境中 SELinux 并未啟動,所以我們對文件的修改可能造成文件的 context 不正確。為了確保開機時重新設定 SELinux context,必須在根目錄下添加隱藏文件 .autorelabel:

sh-4.2# touch /.autorelabel

最后從 chroot 中退出,并重啟系統:

sh-4.2# exit
switch_root:/# reboot

重新進入登陸界面時就可以使用剛才設置的密碼以 root 登陸了!

總結

chroot 是一個很有意思的命令,我們可以用它來簡單的實現文件系統的隔離。但在一個容器技術繁榮的時代,用 chroot 來進行資源的隔離實在是 low 了點。所以 chroot 的主要用途還是集中在系統救援、維護等一些特殊的場景中。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

天津市| 耿马| 逊克县| 西吉县| 北票市| 宁南县| 阿瓦提县| 珲春市| 黑水县| 冕宁县| 来凤县| 宁德市| 西丰县| 高尔夫| 蓬溪县| 淄博市| 崇信县| 寻乌县| 乳源| 丹巴县| 怀柔区| 临澧县| 禄劝| 乐陵市| 屏山县| 麦盖提县| 长宁区| 临邑县| 眉山市| 芒康县| 华阴市| 股票| 手游| 五寨县| 延边| 海晏县| 留坝县| 连州市| 秭归县| 龙海市| 大洼县|