linux chroot命令详解
<p>chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 /,即以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 / 位置。</p>
<p>
<strong>基本语法</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_356321">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">chroot newroot [</code><code class="bash functions">command</code> <code class="bash plain">...]</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
具体用法请参考本文的 demo。</p>
<p>
<span><strong>为什么要使用 chroot 命令</strong></span></p>
<p>
<strong>增加了系统的安全性,限制了用户的权力:</strong></p>
<p>
在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。一般会在用户登录前应用 chroot,把用户的访问能力控制在一定的范围之内。</p>
<p>
<strong>建立一个与原系统隔离的系统目录结构,方便用户的开发:</strong></p>
<p>
使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。</p>
<p>
<strong>切换系统的根目录位置,引导 linux 系统启动以及急救系统等:</strong></p>
<p>
chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 ram 磁盘 (initrd) 切换系统的根位置并执行真正的 init,本文的最后一个 demo 会详细的介绍这种用法。</p>
<p>
<span><strong>通过 chroot 运行 busybox 工具</strong></span></p>
<p>
busybox 包含了丰富的工具,我们可以把这些工具放置在一个目录下,然后通过 chroot 构造出一个 mini 系统。简单起见我们直接使用 docker 的 busybox 镜像打包的文件系统。先在当前目录下创建一个目录 rootfs:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_969906">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ </code><code class="bash functions">mkdir</code> <code class="bash plain">rootfs</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
然后把 busybox 镜像中的文件释放到这个目录中:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_374842">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ (docker </code><code class="bash functions">export</code> <code class="bash plain">$(docker create busybox) | </code><code class="bash functions">tar</code> <code class="bash plain">-c rootfs -xvf -)</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
通过 ls 命令查看 rootfs 文件夹下的内容:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_22655">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ </code><code class="bash functions">ls</code> <code class="bash plain">rootfs</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/920f4ba35c89642bea1ca8b5a54c0008.jpg"></p>
<p>
万事俱备,让我们开始吧!</p>
<p>
执行 chroot 后的 ls 命令</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_796214">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ </code><code class="bash functions">sudo</code> <code class="bash plain">chroot rootfs </code><code class="bash plain">/bin/ls</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/b9cb94092a258e2103c6959ecb6f436b.jpg"></p>
<p>
虽然输出结果与刚才执行的 ls rootfs 命令形同,但是这次运行的命令却是 rootfs/bin/ls。</p>
<p>
<strong>运行 chroot 后的 pwd 命令</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_857540">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ </code><code class="bash functions">sudo</code> <code class="bash plain">chroot rootfs </code><code class="bash plain">/bin/pwd</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/e99e7a331d078a84733414e7a5666a6d.jpg"></p>
<p>
哈,pwd 命令真把 rootfs 目录当根目录了!</p>
<p>
<strong>不带命令执行 chroot</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_605640">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ </code><code class="bash functions">sudo</code> <code class="bash plain">chroot rootfs</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/52f5a9f579e71cb727d65ae112dfcf68.jpg"></p>
<p>
这次出错了,因为找不到 /bin/bash。我们知道 busybox 中是不包含 bash 的,但是 chroot 命令为什么会找 bash 命令呢? 原来,如果不给 chroot 指定执行的命令,默认它会执行 '${shell} -i',而我的系统中 ${shell} 为 /bin/bash。</p>
<p>
既然 busybox 中没有 bash,我们只好指定 /bin/sh 来执行 shell 了。</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_141283">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ </code><code class="bash functions">sudo</code> <code class="bash plain">chroot rootfs </code><code class="bash plain">/bin/sh</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/ae01513841404a1f7b78844b0e1a3a6e.jpg"></p>
<p>
运行 sh 是没有问题的,并且我们打印出了当前进程的 pid。</p>
<p>
<span><strong>检查程序是否运行在 chroot 环境下</strong></span></p>
<p>
虽然我们做了好几个实验,但是肯定会有朋友心存疑问,怎么能证明我们运行的命令就是在 chroot 目录后的路径中呢?<br>
其实,我们可以通过 /proc 目录下的文件检查进程的中的根目录,比如我们可以通过下面的代码检查上面运行的 /bin/sh 命令的根目录(请在另外一个 shell 中执行):</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_809459">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ pid=$(pidof -s sh)</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash plain">$ </code><code class="bash functions">sudo</code> <code class="bash functions">ls</code> <code class="bash plain">-ld </code><code class="bash plain">/proc/</code><code class="bash plain">$pid</code><code class="bash plain">/root</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/66cfb1ba9bcd3a7d17e703f2fb924de0.jpg"></p>
<p>
输出中的内容明确的指出 pid 为 46644 的进程的根目录被映射到了 /tmp/rootfs 目录。</p>
<p>
<strong>通过代码理解 chroot 命令</strong></p>
<p>
下面我们尝试自己实现一个 chroot 程序,代码中涉及到两个函数,分别是 chroot() 函数和 chdir() 函数,其实真正的 chroot 命令也是通过调用它们实现的:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_541158">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp preprocessor">#include <stdio.h></code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include <unistd.h></code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include <stdlib.h></code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">argc, </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*argv[])</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(argc<2){</code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"usage: chroot newroot \n"</code><code class="cpp plain">);</code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">1;</code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(chroot(argv)) {</code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"chroot"</code><code class="cpp plain">);</code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">1;</code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(chdir(</code><code class="cpp string">"/"</code><code class="cpp plain">)) {</code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"chdir"</code><code class="cpp plain">);</code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">1;</code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(argc == 2) {</code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">// hardcode /bin/sh for my busybox tools.</code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">argv = (</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*)</code><code class="cpp string">"/bin/sh"</code><code class="cpp plain">;</code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">argv = (</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*) </code><code class="cpp string">"-i"</code><code class="cpp plain">;</code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">argv = null;</code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code><code class="cpp keyword bold">else</code> <code class="cpp plain">{</code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">argv += 2;</code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number32 index31 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">execvp (argv, argv);</code>
</div>
<div class="line number33 index32 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"chroot: cannot run command `%s`\n"</code><code class="cpp plain">, *argv);</code>
</div>
<div class="line number34 index33 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number35 index34 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0;</code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
把上面的代码保存到文件 mychroot.c 文件中,并执行下面的命令进行编译:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_271841">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp plain">$ gcc -wall mychroot.c -o mychroot</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
mychroot 的用法和 chroot 基本相同:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_7957">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ </code><code class="bash functions">sudo</code> <code class="bash plain">.</code><code class="bash plain">/mychroot</code> <code class="bash plain">.</code><code class="bash plain">/rootfs</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/1c1b88038a56a401c5b61f77e058d417.jpg"></p>
<p>
特别之处是我们的 mychroot 在没有传递命令的情况下执行了 /bin/sh,原因当然是为了支持我们的 busybox 工具集,笔者在代码中 hardcode 了默认的 shell:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_118770">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp plain">argv = (</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*)</code><code class="cpp string">"/bin/sh"</code><code class="cpp plain">;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
从代码中我们也可以看到,实现 chroot 命令的核心逻辑其实并不复杂。</p>
<p>
<span><strong>实例:通过 chroot 重新设置 root 密码</strong></span></p>
<p>
忘记了 root 密码该怎么办?接下来的 demo 将演示如何通过 chroot 命令重新设置 centos7 中被忘记了的 root 密码。<br>
systemd 的管理机制中,rescure 模式和 emeryency 模式是无法直接取得 root 权限的,需要使用 root 密码才能进入 rescure 和 emeryency 环境。所以我们需要通过其他方式来设置 root 密码。我们可以为内核的启动指定 "rd.break" 参数,从而让系统在启动的早期停下来,此时我们可以通过使用 root 权限并结合 chroot 命令完成设置 root 密码的操作。下面我们一起来看具体的操作过程。</p>
<p>
在系统启动过程中进入开机菜单时按下字母键 e 进程开机菜单的编辑模式:</p>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/0eb3ed14105a43d36f9cf666277acec0.jpg"></p>
<p>
这就是系统的开机菜单,按下 e 后进入编辑界面:</p>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/c9d517761d9e847e2d5e45df035b2c96.jpg"></p>
<p>
找到以 "linux16 /vmlinuz-" 开头的行。如果默认没有看到该行,需要按向下键把它滚动出来。<br>
然后定位到该行结尾处,输入一个空格和字符串 "rd.break",如下图所示:</p>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/841bd5e0590eaaa5d0725ef3c126fac3.jpg"></p>
<p>
接着按下 ctrl + x 以该设置继续启动,启动过程中操作系统会停下来,这是系统启动过程中的一个非常早的时间点:</p>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/8aa6def061fd47178e8e86bf9753ad09.jpg"></p>
<p>
所以系统的根目录还挂载在 ram disk 上(就是内存中的一个文件系统),我们可以通过 mount 命令检查系统当前挂载的文件系统,下面是我们比较关心的两条:</p>
<p>
<img title="linux chroot命令详解" alt="linux chroot命令详解" src="https://zhuji.jb51.net/uploads/img/202305/92450568a8f6586e1b39a293e68bb772.jpg"></p>
<p>
上图中 mount 命令输出的第一行说明此时的根目录在一个 ram disk 中, 即 rootfs。<br>
图中输出的第二行说明我们的文件系统此时被挂载到了 /sysroot 目录,并且是只读的模式:</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code9473">
/dev/mapper/centos-root on /sysroot type xfs (ro,relatime,attr2,inode64,noquota)</div>
<p>
</p>
<p>
而在我们正常登陆系统的情况下,系统根目录的挂载情况如下:</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code1187">
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)</div>
<p>
</p>
<p>
该时间点的最大优势是我们具有 root 权限!所以让我们开始设置新的 root 密码吧。</p>
<p>
<strong>先通过下面的命令把 /sysroot 重新挂载为可读写的模式:</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_138040">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">switch_root:/</code><code class="bash comments"># mount -o remount,rw /sysroot</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
然后用下面 chroot 命令把根目录切换到我们原来的环境中:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_858999">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">switch_root:/</code><code class="bash comments"># chroot /sysroot</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
此时可以理解为:我们以 root 权限登录了原来的系统,修改密码就很容易了!用下面的命令为 root 用户设置新的密码:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_362947">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">sh-4.2</code><code class="bash comments"># echo "new_root_pw" | passwd --stdin root</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
接下来还要处理 selinux 相关的问题。由于当前的环境中 selinux 并未启动,所以我们对文件的修改可能造成文件的 context 不正确。为了确保开机时重新设定 selinux context,必須在根目录下添加隐藏文件 .autorelabel:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_61247">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">sh-4.2</code><code class="bash comments"># touch /.autorelabel</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
最后从 chroot 中退出,并重启系统:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_625712">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">sh-4.2</code><code class="bash comments"># exit</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash plain">switch_root:/</code><code class="bash comments"># reboot</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
重新进入登陆界面时就可以使用刚才设置的密码以 root 登陆了!</p>
<p>
<strong>总结</strong></p>
<p>
chroot 是一个很有意思的命令,我们可以用它来简单的实现文件系统的隔离。但在一个容器技术繁荣的时代,用 chroot 来进行资源的隔离实在是 low 了点。所以 chroot 的主要用途还是集中在系统救援、维护等一些特殊的场景中。</p>
<p>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
原文链接:http://www.cnblogs.com/sparkdev/p/8556075.html</p>
頁:
[1]