linux chroot 命令

前端之家收集整理的这篇文章主要介绍了linux chroot 命令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

@H_404_3@

用法请参考本文的 demo。

@H_404_3@

增加了系统的安全性,限制了用户的权力:文件,这样就增强了系统的安全性。一般会在用户登录前应用 chroot,把用户的访问能力控制在一定的范围之内。

用户的开发:文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。

用法。

@H_404_3@Box 工具

Box 包含了丰富的工具,我们可以把这些工具放置在一个目录下,然后通过 chroot 构造出一个 mini 系统。简单起见我们直接使用 docker 的 busyBox 镜像打包的文件系统。先在当前目录下创建一个目录 rootfs:

$ rootfs

Box 镜像中的文件释放到这个目录中:

$ (docker export $(docker create busyBox) | -C rootfs -xvf -)

文件夹下的内容

$ rootfs

$ rootfs /bin/

403b05a3468e1d462027d63.png" alt="">

输出结果与刚才执行的 ls rootfs 命令形同,但是这次运行的命令却是 rootfs/bin/ls。

$ rootfs /bin/

$ rootfs

Box 中是不包含 bash 的,但是 chroot 命令为什么会找 bash 命令呢? 原来,如果不给 chroot 指定执行的命令,默认它会执行 '${SHELL} -i',而我的系统中 ${SHELL} 为 /bin/bash。Box 中没有 bash,我们只好指定 /bin/sh 来执行 shell 了。

$ rootfs /bin/

4030f17beb722092e4e0a9bda.png" alt="">

@H_404_3@

文件检查进程的中的根目录,比如我们可以通过下面的代码检查上面运行的 /bin/sh 命令的根目录(请在另外一个 shell 中执行):

$ pid=$( -s - /proc/$pid/root

输出中的内容明确的指出 PID 为 46644 的进程的根目录被映射到了 /tmp/rootfs 目录。

@H_404_3@代码理解 chroot 命令

代码中涉及到两个函数,分别是 chroot() 函数和 chdir() 函数,其实真正的 chroot 命令也是通过调用它们实现的:

#include

<span style="color: #0000ff">int main(<span style="color: #0000ff">int argc,<span style="color: #0000ff">char *<span style="color: #000000">argv[])
{
<span style="color: #0000ff">if(argc<<span style="color: #800080">2<span style="color: #000000">){
printf(<span style="color: #800000">"<span style="color: #800000">Usage: chroot NEWROOT [COMMAND...] \n<span style="color: #800000">"<span style="color: #000000">);
return <span style="color: #800080">1<span style="color: #000000">;
}

</span><span style="color: #0000ff"&gt;if</span>(<span style="color: #0000ff"&gt;chroot</span>(argv[<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;])) {
    perror(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;chroot</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
    return </span><span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;;
}

</span><span style="color: #0000ff"&gt;if</span>(chdir(<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;/</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;)) {
    perror(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;chdir</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
    return </span><span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;;
}

</span><span style="color: #0000ff"&gt;if</span>(argc == <span style="color: #800080"&gt;2</span><span style="color: #000000"&gt;) {
    </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; hardcode /bin/sh for my busy<a href="https://www.jb51.cc/tag/Box/" target="_blank" class="keywords">Box</a> tools.</span>
    argv[<span style="color: #800080"&gt;0</span>] = (<span style="color: #0000ff"&gt;char</span> *)<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;/bin/sh</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;;

    argv[</span><span style="color: #800080"&gt;1</span>] = (<span style="color: #0000ff"&gt;char</span> *) <span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;-i</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;;
    argv[</span><span style="color: #800080"&gt;2</span>] =<span style="color: #000000"&gt; NULL;
} </span><span style="color: #0000ff"&gt;else</span><span style="color: #000000"&gt; {
    argv </span>+= <span style="color: #800080"&gt;2</span><span style="color: #000000"&gt;;
}

execvp (argv[</span><span style="color: #800080"&gt;0</span><span style="color: #000000"&gt;],argv);
printf(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;chroot: cannot run command `%s`\n</span><span style="color: #800000"&gt;"</span>,*<span style="color: #000000"&gt;argv);

return </span><span style="color: #800080"&gt;0</span><span style="color: #000000"&gt;;

}

代码保存到文件 mychroot.c 文件中,并执行下面的命令进行编译:

$ -Wall mychroot.c -o mychroot

用法和 chroot 基本相同:

$ ./mychroot ./rootfs

支持我们的 busyBox 工具集,笔者在代码中 hardcode 了默认的 shell:

argv[] = ( *);

代码中我们也可以看到,实现 chroot 命令的核心逻辑其实并不复杂。

@H_404_3@

菜单时按下字母键 e 进程开机菜单的编辑模式:

菜单,按下 e 后进入编辑界面:

找到以 "linux16 /vmlinuz-" 开头的行。如果默认没有看到该行,需要按向下键把它滚动出来。然后定位到该行结尾处,输入一个空格和字符串 "rd.break",如下图所示:

接着按下 ctrl + x 以该设置继续启动,启动过程中操作系统会停下来,这是系统启动过程中的一个非常早的时间点:

文件系统),我们可以通过 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,seclabel,noquota)

switch_root:/# -o remount,rw /sysroot

switch_root:/# /sysroot

登录了原来的系统,修改密码就很容易了!用下面的命令为 root 用户设置新的密码:

-# | --stdin root

接下来还要处理 SELinux 相关的问题。由于当前的环境中 SELinux 并未启动,所以我们对文件修改可能造成文件的 context 不正确。为了确保开机时重新设定 SELinux context,必須在根目录下添加隐藏文件 .autorelabel:

-# /.autorelabel

退出,并重启系统:

-/# reboot

@H_404_3@

文件系统的隔离。但在一个容器技术繁荣的时代,用 chroot 来进行资源的隔离实在是 low 了点。所以 chroot 的主要用途还是集中在系统救援、维护等一些特殊的场景中。

原文链接:/systemd/71458.html

猜你在找的sysTemd相关文章