iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >linux chroot命令详解
  • 611
分享到

linux chroot命令详解

linuxchroot命令 2022-06-04 22:06:56 611人浏览 安东尼
摘要

chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 /,即以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以

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

万事俱备,让我们开始吧!

执行 chroot 后的 ls 命令


$ sudo chroot rootfs /bin/ls

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

运行 chroot 后的 pwd 命令


$ sudo chroot rootfs /bin/pwd

哈,pwd 命令真把 rootfs 目录当根目录了!

不带命令执行 chroot


$ sudo chroot rootfs

这次出错了,因为找不到 /bin/bash。我们知道 busybox 中是不包含 bash 的,但是 chroot 命令为什么会找 bash 命令呢? 原来,如果不给 chroot 指定执行的命令,默认它会执行 '${shell} -i',而我的系统中 ${SHELL} 为 /bin/bash。

既然 busybox 中没有 bash,我们只好指定 /bin/sh 来执行 shell 了。


$ sudo chroot rootfs /bin/sh

运行 sh 是没有问题的,并且我们打印出了当前进程的 PID。

检查程序是否运行在 chroot 环境下

虽然我们做了好几个实验,但是肯定会有朋友心存疑问,怎么能证明我们运行的命令就是在 chroot 目录后的路径中呢?
其实,我们可以通过 /proc 目录下的文件检查进程的中的根目录,比如我们可以通过下面的代码检查上面运行的 /bin/sh 命令的根目录(请在另外一个 shell 中执行):


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

输出中的内容明确的指出 PID 为 46644 的进程的根目录被tjsSxbusT映射到了 /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

特别之处是我们的 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 进程开机菜单的编辑模式:

这就是系统的开机菜单,按下 e 后进入编辑界面:

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

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

所以系统的根目录还挂载在 RAM disk 上(就是内存中的一个文件系统),我们可以通过 mount 命令检查系统当前挂载的文件系统,下面是我们比较关心的两条:

上图中 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 的主要用途还是集中在系统救援、维护等一些特殊的场景中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

--结束END--

本文标题: linux chroot命令详解

本文链接: https://www.lsjlt.com/news/19393.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • linux chroot命令详解
    chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 /,即以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以...
    99+
    2022-06-04
    linux chroot命令
  • Linux中的chroot命令怎么用
    这篇文章主要介绍Linux中的chroot命令怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!chroot命令 用来在指定的根目录下运行指令。chroot,即 change root directory (更改 ...
    99+
    2023-06-28
  • Linux的chroot命令有什么用
    这篇文章主要介绍“Linux的chroot命令有什么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux的chroot命令有什么用”文章能帮助大家解决问题。Linux常用命令chroot (英...
    99+
    2023-06-28
  • Linux系统chroot命令该如何使用
    本篇文章给大家分享的是有关Linux系统chroot命令该如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。chroot简介:chroot,既是Linux的一条命令,也是它...
    99+
    2023-06-28
  • chroot命令怎么在Linux系统中使用
    这篇文章给大家介绍chroot命令怎么在Linux系统中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。chroot命令 chroot命令用来在指定的根目录下运行指令。chroot,即 change root dir...
    99+
    2023-06-12
  • Linux命令详解(14)useradd命令
    useradd用于添加一个linux账户。adduser跟本命令等价。 useradd同样属于不复杂但很重要的命令。 --help获得帮助信息。 -b选项,制定家目录的根  -c选项,给新用户添加说明信息 -d选项,给新用户设置家目录 ...
    99+
    2023-08-31
    linux 运维 服务器
  • Linux 命令之rsync命令详解
    rsync命令 rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的...
    99+
    2022-06-04
    命令 详解 Linux
  • Linux命令详解(15)lsof命令
    lsof 是 linux 下的一个非常实用的系统级的监控、诊断工具。它是 List Open Files的缩写。 使用 lsof,你可以获取任何被打开文件的各种信息,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身...
    99+
    2023-09-02
    服务器 运维 lsof
  • Linux awk命令详解
    awk 文章目录 awkLinux三剑客grep 查找与匹配文本sed 文本编辑,处理匹配到的文本内容awk 格式化文本文件,对文本文件进行更复杂的加工处理分析 输出第二列内容输出多...
    99+
    2023-09-11
    linux 服务器 运维
  • Linux ping命令详解
    1.命令介绍 ping命令的功能是用于测试主机间网络连通性,发送出基于ICMP传输协议的数据包,要求对方主机予以回复,若对方主机的网络功能没有问题且防火墙放行流量,则就会回复该信息,我们也就可得知对方主机系统在线并运行正...
    99+
    2023-09-25
    网络 linux 服务器
  • Linux ssh 命令详解
    文章目录 ssh补充说明语法选项参数实例背后故事将 SSH 协议端口号设为 22 的故事如何更改 SSH 服务的端口号配置 SSH 协议穿越防火墙出站的 SSH 连接反向通道是有风险的入站的 ...
    99+
    2023-09-18
    ssh 服务器 运维
  • 详解Linux ln 命令
    linux 中的文件分为 Hard Link 和 Symbolic Link 两种。Hard Link 文件又被称为硬链接文件、实体链接文件,Symbolic Link 文件则常被称为符号链接、软链接文件。 ln 命令用...
    99+
    2022-06-04
    linux ln 命令
  • linux shutdown命令详解
    shutdown命令用来系统关机命令。shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作。 语法 shutdown(选项)(参数) 选项 -c:当执行“shutdo...
    99+
    2022-06-04
    详解 命令 linux
  • linux mkdir命令详解
    mkdir命令用来创建目录。该命令创建由dirname命名的目录。如果在目录名的前面没有加任何路径名,则在当前目录下创建由dirname指定的目录;如果给出了一个已经存在的路径,将会在该目录下创建一个指定的...
    99+
    2022-06-04
    详解 命令 linux
  • Linux命令unzip详解
    目录一、unzip命令1.1 语法QGwJgQxc1.2 选项二、示列一、unzip命令 unzip命令用于解压缩由zip命令压缩的“.zip”压缩包。 1.1 语法 unzip(选项)(参数) 1.2 选项 ...
    99+
    2022-06-04
    linuxunzip解压 linux解压unzip命令 linuxunzip命令
  • 详解Linux iptables 命令
    iptables 是 linux 管理员用来设置 IPv4 数据包过滤条件和 NAT 的命令行工具。iptables 工具运行在用户态,主要是设置各种规则。而 netfilter 则运行在内核态,执行那些设置好的规则。 ...
    99+
    2022-06-04
    linux iptables 命令 linux iptables
  • Linux cut 命令详解
    cut 命令在Linux和Unix中的作用是从文件中的每一行中截取出一些部分,并输出到标准输出中。我们可以使用 cut 命令从一行字符串中于以字节,字符,字段(分隔符)等单位截取一部分内容出来。 在本文中,我们通过一...
    99+
    2022-06-03
    Linux cut 命令 Linux cut 命令详解
  • linux systemctl命令详解
    笔者在前文中概要的介绍了 systemd 的基本概念和主要特点。由于 systemd 相关的绝大多数任务都是通过 systemctl 命令管理的,所以本文将集中的介绍 systemctl 命令的用法。注意,本文以 ubu...
    99+
    2022-06-04
    linux systemctl命令
  • Linux top命令详解
    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 top参数详解 第一行,任务队列信息,同 uptime 命令...
    99+
    2022-11-13
    Linux top命令 Linux 命令
  • 【Linux】ping命令详解
    目录 一、ping概述 二、Ping用法 三、ping参数详解 四、使用 五、Wireshark抓取ICMP请求应答消息 一、ping概述 ping 命令用于测试与目标主机之间的连接。它向目标主机发送一个ICMP(Internet ...
    99+
    2023-10-06
    linux 服务器 ping 请求应答 wireshark ping用法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作