chroot

news2024/11/24 12:12:07

1.chroot技术

在Linux系统中,系统默认的目录结构都是以/,即根(root)开始的。而在使用chroot之后,进程的系统目录结构将以指定的位置作为根(/)位置。chroot实际作用就是将进程描述符中struct fs_struct中的root的值设置为选定的目录。

在经过chroot之后,进程读取到的目录和文件将不再是系统根目录下的,而是指定的新根目录下的目录和文件。为什么需要chroot呢?因为其带来以下3个好处。

(1)限制了用户进程访问文件系统的范围,增加了系统的安全性。

在经过chroot之后,在新根下将访问不到系统的根目录,这样就增强了系统的安全性。一般是在登录(login)前使用chroot,以此达到用户不能访问一些特定文件的目的。

(2)建立一个与原系统隔离的虚拟系统目录结构,方便用户的开发和测试。

使用chroot后,系统读取的是新根下的目录和文件,它是用原系统根目录下的子目录作为新的根目录。在这个新根目录下,可以用来为被测软件提供一个独立于当前系统根目录结构的独立开发和测试环境。

(3)通过切换系统的根目录位置,协助引导Linux系统的启动过程、切换到特定的应急急救系统等。

chroot的作用就是切换系统的根目录位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始RAM磁盘(initrd)切换系统的根位置并执行真正的init。另外,当系统出现一些问题时,还可以使用chroot切换到一个临时的应急急救系统。

chroot命令的基本使用方式如下。

 sudo chroot newroot [command]

注意:执行chroot命令需要root权限,而且command是新根目录(newroot)下的可执行命令,一般需要在新根目录下放一个根文件系统,简单的做法是可以放一个静态编译的可执行文件。

以下面的实际命令为例,其中hello是一个静态编译的可执行文件,它存储在新根目录(即/home/mengning/container)中的bin目录下。

 $ sudo chroot /home/mengning/container /bin/hello

第一个参数是存放容器根文件系统的目录,第二个参数是可执行文件的路径,这个路径是相对于第一个参数而言的,原系统的绝对路径为/home/mengning/container/bin/hello。如果要执行的可执行文件不是静态编译的,此时在指定的根文件系统目录中必须包含标准C 库、动态链接器等相关依赖,自行管理依赖比较烦琐,所以用一个小型的、自包含的Linux 发行版比较好。因为发行版包含实用程序、依赖库和系统配置文件,可以作为一个完整的系统在容器中运行。

2.minirootfs创建

使用chroot创建一个私有的根文件目录。

首先在个人目录下建立container目录,这里使用Alpine Linux作为根文件系统。

​
$ mkdir container

$ wget https://dl-cdn.alpinelinux.org/alpine/v3.15/releases/x86_64/alpine-

minirootfs-3.15.1-x86_64.tar.gz

到阿里云开源镜像站下载

alpine-v3.15-releases-x86_64安装包下载_开源镜像站-阿里云

$ cd container

$ tar -zxvf ../alpine-minirootfs-3.15.0-x86_64.tar.gz

$ ls

bin dev etc home lib media mnt opt proc root run sbin srv sys

tmp usr var

$ cd ..

$ sudo chown -R root:root container/

​

$ wget https://dl-cdn.alpinelinux.org/alpine/v3.15/releases/x86_64/alpine-

minirootfs-3.15.1-x86_64.tar.gz

到阿里云开源镜像站下载

alpine-v3.15-releases-x86_64安装包下载_开源镜像站-阿里云

此时在container目录下已经得到一个小型但可用的Linux根文件系统。执行chroot命令如下。

$ sudo chroot /home/mengning/container /bin/sh -l

这条指令可以执行container目录下的sh并以-l(login)的方式得到一个Shell进程。此时在Shell下使用ps命令查看进程列表,结果显示为空,因为当前系统目录下的/dev和/proc都是空目录,没有挂载主机系统的/dev和/proc文件系统。

chroot命令只是修改了进程的根目录进行了文件系统的隔离,pid、hostname、net等并没有进行隔离。

chroot命令实际上只是通过调用chroot系统调用修改当前进程的根目录位置,然后调用execve系统调用加载可执行程序,这样当前运行的程序能够读取的范围就仅限于指定的新根目录范围内。chroot系统调用和execve系统调用的库函数原型如下。

#include <unistd.h>

int chroot(const char *path);

int execve(const char *filename, char *const argv[],char *const envp[]);

Linux-5.4.34内核中的chroot系统调用的内核处理函数见fs/open.c。

SYSCALL_DEFINE1(chroot, const char __user *, filename)

{
    return ksys_chroot(filename);
}

其中ksys_chroot()函数如下。

int ksys_chroot(const char __user *filename)

{

    struct path path;

    int error;

    unsigned int lookup_flags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY;

retry:

    error = user_path_at(AT_FDCWD, filename, lookup_flags, &path);

    if (error)

        goto out;



    error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);

    if (error)

        goto dput_and_out;


    error = -EPERM;

    if (!ns_capable(current_user_ns(), CAP_SYS_chroot))

        goto dput_and_out;

    error = security_path_chroot(&path);

    if (error)

        goto dput_and_out;



    set_fs_root(current->fs, &path);

    error = 0;

dput_and_out:

    path_put(&path);

    if (retry_estale(error, lookup_flags)) {

        lookup_flags |= LOOKUP_REVAL;

        goto retry;

    }

out:

    return error;

}

其中为当前进程调用了set_fs_root(),参见fs/fs_struct.c文件。

/*

 * Replace the fs->{rootmnt,root} with {mnt,dentry}. Put the old values.

 * It can block.

 */

void set_fs_root(struct fs_struct *fs, const struct path *path)

{

    struct path old_root;



    path_get(path);

    spin_lock(&fs->lock);

    write_seqcount_begin(&fs->seq);

    old_root = fs->root;

    fs->root = *path;

    write_seqcount_end(&fs->seq);

    spin_unlock(&fs->lock);

    if (old_root.dentry)

        path_put(&old_root);

}

此处改变了当前进程的根目录fs->root。显然chroot技术只能改变进程描述符struct task_struct相关的struct fs_struct中的root,影响的是路径查找(path lookup)的起始点,是一种非常简单的隔离进程对文件系统访问范围的方法,Mount namespace则可以隔离进程的整个mount树,11.2.3节中再详细讨论。

3.测试用例

ubuntu@ubuntu:~/book/paodingjieniu/container/minirootfs$ sudo tar -zxvf ../../download/alpine-minirootfs-3.15.1-x86_64.tar.gz

ubuntu@ubuntu:~/book/paodingjieniu/container/minirootfs$ cd ..

ubuntu@ubuntu:~/book/paodingjieniu/container$ sudo chown -R root:root minirootfs/

ubuntu@ubuntu:~/book/paodingjieniu/container$ sudo chroot /home/ubuntu/book/paodingjieniu/container/minirootfs/ /bin/sh -l
ubuntu:/# uname -a

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习之基于Yolov5人体姿态摔倒识别分析报警系统(GUI界面)

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 系统设计概述&#xff1a; 传感器采集&#xff1a;通过在场景中布置摄像头或红外传感器等设备&#xff0c;采集人体…

latex自定义缩写

Latex 写文章可能常用到一些缩写&#xff0c;如&#xff1a; .e.g.i.e.cf.etc.w.r.t.i.i.d.et al. 其中有些要斜体&#xff0c;如果每次都要用 \textit{...}、{\it ...} 弄斜&#xff0c;有点麻烦。CVPR 模板中有定义一些命令&#xff0c;可以更方便地输入这些缩写。这里记录…

openebs

1. 简介 OpenEBS是一款使用Go语言编写的基于容器的块存储开源软件。OpenEBS使得在容器中运行关键性任务和需要数据持久化的负载变得更可靠。 OpenEBS是一组存储引擎&#xff0c;允许您为有状态工作负载(StatefulSet)和Kubernetes平台类型选择正确的存储解决方案。 在高层次上…

CCF-CSP真题《202309-4 阴阳龙》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202309-4试题名称&#xff1a;阴阳龙时间限制&#xff1a;2.0s内存限制&#xff1a;1.0GB问题描述&#xff1a; 问题描述 西西艾弗岛的下方是一个庞大的遗迹群&#xff0c;神…

项目实战:优化Servlet,把所有围绕Fruit操作的Servlet封装成一个Servlet

1、FruitServlet 这些Servlet都是围绕着Fruit进行的把所有对水果增删改查的Servlet放到一个Servlet里面&#xff0c;让tomcat实例化一个Servlet对象 package com.csdn.fruit.servlet; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import c…

Go语言文本处理:正则表达式与字符串操作

大家好&#xff0c;我是[lincyang]。 今天&#xff0c;我们将一起探讨Go语言在文本处理方面的强大功能&#xff0c;特别是正则表达式和字符串操作。 Go语言以其简洁和高效而闻名&#xff0c;这些特性在文本处理上也得到了很好的体现。 接下来&#xff0c;我将通过丰富的案例…

FPGA的元素组件

注意&#xff1a;关于FPGA的元素这一块儿内容&#xff0c;稍有出入。例如&#xff1a;吉姆莱丁 著&#xff0c;陈会翔 译&#xff0c;由清华大学出版社出版的《构建高性能嵌入式系统》中提到&#xff1a;FPGA通常由查找表、触发器、块RAM、DSP切片、及其他功能元件等元素组成。…

C语言----每日五道选择题Day1

1.第一题 1、指出下列代码的缺陷&#xff08; &#xff09;【多选】 float f[10]; // 假设这里有对f进行初始化的代码 for(int i 0; i < 10;) {if(f[i] 0)break; } A: for(int i 0; i < 10;)这一行写错了 B: f是float型数据直接做相等判断有风险 C: f[i]应该是…

C++初阶--类与对象--const成员和日期类的实现

文章目录 const 成员对一个日期类的实现源码解析构造函数的验证运算符的重复利用前置与后置其他运算符的验证 const 成员 将const修饰的成员函数称之为const成员函数。 在一个成员函数里面&#xff0c;对于this指针指向的对象&#xff0c;是隐藏式的&#xff0c;没有办法用常规…

B-DS二叉树_输出所有目标路径

Description 给定二叉树和一个整数目标targetSum&#xff0c;输出所有从根结点到叶子结点的路径总和等于targetSun的路径。 Input 第一行输入t&#xff0c;表示有t个测试样例。 第二行起&#xff0c;每一行首先输入一个整数targetSum&#xff0c;接着输入n&#xff0c;接着输…

带你拿捏链表

本专栏内容为&#xff1a;数据结构学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握数据结构。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;数据结构 &#x1f69a;代码仓库&#xff1a;小小u…

Mega Sales购物季营销,掌握流量密码不是事

“Mega Sales”购物季是东南亚地区“双十一、双十二”的两个重要节点&#xff0c;在年末即将来临之际&#xff0c;全球电商市场都正进入激动人心的备货大卖时期。面对这样的重要节目&#xff0c;商家应该如何做好营销铺垫&#xff0c;全面备战大促的不同阶段&#xff1f; 作为…

C生万物 | 从浅入深理解指针【第三部分】(qsort的使用和模拟实现)

C生万物 | 从浅入深理解指针【第四部分】&#xff08;qsort的使用和模拟实现&#xff09; 文章目录 C生万物 | 从浅入深理解指针【第四部分】&#xff08;qsort的使用和模拟实现&#xff09;回调函数是什么&#xff1f;qsort使用举例qsort函数的模拟实现 回调函数是什么&#x…

网络层:控制平面

路由选择算法 路由选择算法就是为了在端到端的数据传输中&#xff0c;选择路径上路由器的最好的路径。通常&#xff0c;一条好的路径指具有最低开销的路径。最低开销路径是指源和目的地之间具有最低开销的一条路。 根据集中式还是分散式来划分 集中式路由选择算法&#xff1a…

从UEFI如何启动到系统

从UEFI如何启动到系统 文章目录 从UEFI如何启动到系统UEFI须知1. 进入UEFI setup界面2. Setup界面3. BootManager界面4. Shell下操作4.1. 显示启动设备4.2. 进入设备及查看文件4.3. UEFI下的其他操作4.4. UEFI下的一些Shell命令 5. UEFI下更新固件方法GRUBGRUB界面1. 编辑GRUB选…

为什么搭建自己的帮助中心很重要?

在当今数字化和信息爆炸的时代&#xff0c;用户对产品和服务的期望越来越高。他们希望能够快速找到解决问题的方法和答案&#xff0c;而不是在不尽其穷的文档和论坛中浪费时间。在这样的背景下&#xff0c;建立一个完善的帮助中心成为了企业提供优质客户支持的关键。帮助中心不…

VSCode 连接不上 debian 的问题

之前一台笔记本上安装了 debian12&#xff0c;当时用 vscode 是可以连接上的&#xff0c;但今天连接突然就失败了&#xff0c;失败信息是这样的&#xff1a; 查看失败信息 因为 debian 是自动获取 ip 地址的&#xff0c;以前能连接上时&#xff0c;ip 地址是 104&#xff0c;然…

【免费生产力工具】CodeGeeX: AI代码自动补齐、对话、自动注释

CodeGeeX - A Multilingual Code Generation Tool - CodeGeeX 这个是官网&#xff0c;工程好像是开源的&#xff0c;生态不错。清华校友确实强&#xff0c;我是菜菜。 我是在vscode里面装的插件&#xff0c;直接搜索就行。 多的就不bb了&#xff0c;大家试试吧&#xff0c;确…

[强网杯 2019]随便注1

打开题目 输入1 输入1&#xff0c;页面报错&#xff0c;输入1 #页面正常 说明1为注入点且注入方式为字符型的单引号注入 判断列名 输入 1 order by 2 # 页面正常 1 order by 3 #页面报错 说明列名字段数为2 接下来我们尝试用联合注入的方式爆出数据显示位 输入1 union s…

Java生成word文档

一 前言 Java编程生成word文档这种操作一般是常规操作比较常见&#xff0c;主要采用Apache的POI Word 这个库操作的比较多&#xff0c;还有的用Spire.Doc&#xff0c;但是这个库有些稍微难点的功能要收费&#xff0c;看了下费用还不低&#xff0c;周末朋友问起是否有用java操作…