chroot

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

品牌如何长期占领小红书市场,小红书投放复盘怎么规划?

想要实现产品种草与品牌营销&#xff0c;达人投放成了很多品牌的选择。然而随着达人协助成本的水涨船高&#xff0c;提高达人投放结果&#xff0c;就变得迫在眉睫。今天我们将为大家分享下&#xff0c;品牌如何长期占领小红书市场&#xff0c;小红书投放复盘怎么规划&#xff1…

el-select 搜索无选项时 请求接口添加输入的值

el-select 搜索无选项时 请求接口添加输入的值 <template><div class"flex"><el-select class"w250" v-model"state.brand.id" placeholder"请选择" clearable filterable :filter-method"handleQu…

随时随地时时刻刻使用GPT类应用

疑问 很多人说GPT的广泛使用可能会使人们失业&#xff0c;会对一些互联网公司的存活造成挑战&#xff0c;那么这个说法是真的吗&#xff1f; 这个说法并不完全准确。虽然GPT等AI技术的广泛应用可能会对某些行业和职业产生影响&#xff0c;但并不意味着它会导致人们失业或互联网…

【Qt之事件过滤器】使用

介绍 事件过滤器是Qt中一种重要的机制&#xff0c;用于拦截并处理窗口和其他对象的事件。 它可以在不修改已有代码的情况下&#xff0c;动态地增加、删除一些处理事件的代码&#xff0c;并能够对特定对象的事件进行拦截和处理。 在Qt中&#xff0c;事件处理经过以下几个阶段&…

.NET Core 中插件式开发实现

在 .NET Framework 中&#xff0c;通过AppDomain实现动态加载和卸载程序集的效果&#xff1b;但是.NET Core 仅支持单个默认应用域&#xff0c;那么在.NET Core中如何实现【插件式】开发呢&#xff1f; 一、.NET Core 中 AssemblyLoadContext的使用 1、AssemblyLoadContext简…

CodeWhisperer 的安装及体验

文章作者&#xff1a;Pony CodeWhisperer 是亚马逊出品的一款基于机器学习的通用代码生成器&#xff0c;可实时提供代码建议。类似 Cursor 和 Github Copilot 编码工具。 官网&#xff1a;https://aws.amazon.com/cn/codewhisperer/?trkcndc-detail 在编写代码时&#xff0c…

pg14-sql基础(二)-排序与统计

排序 SELECT employee_id, first_name, last_name, hire_date, salary FROM employees ORDER BY first_name; --按字母&#xff0c;默认升序 ORDER BY hire_date ASC; --升序 ORDER BY hire_date DESC; --降序SELECT employee_id, first_name, last_name, hire_date, salary F…

chinese_llama_aplaca训练和代码分析

训练细节 ymcui/Chinese-LLaMA-Alpaca Wiki GitHub中文LLaMA&Alpaca大语言模型本地CPU/GPU训练部署 (Chinese LLaMA & Alpaca LLMs) - 训练细节 ymcui/Chinese-LLaMA-Alpaca Wikihttps://github.com/ymcui/Chinese-LLaMA-Alpaca/wiki/%E8%AE%AD%E7%BB%83%E7%BB%86%E…

【实战Flask API项目指南】之一 概述

实战Flask API项目指南之 概述 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握Flask在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 小菜是一个Python编程爱好者&#xff0c;他目前…

华为OD机试 - 高效的任务规划 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

挑战100天 AI In LeetCode Day02(1)

挑战100天 AI In LeetCode Day02&#xff08;1&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-32.1 题目2.2 题解 三、面试经典 150 题-33.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&#xff0c;面向程序…

Linux中的高级IO

文章目录 1.IO1.1基本介绍1.2基础io的低效性1.3如何提高IO效率1.4五种IO模型1.5非阻塞模式的设置 2.IO多路转接之Select2.1函数的基本了解2.2fd_set理解2.3完整例子代码&#xff08;会在代码中进行讲解&#xff09;2.4优缺点 3.多路转接之poll3.1poll函数的介绍3.2poll服务器3.…

4.网络之TCP

TCP协议(传输层) 文章目录 TCP协议(传输层)1. TCP报文格式2. TCP相关机制2.1 确认应答机制2.2 超时重传机制2.3 连接管理机制&#xff08;重点&#xff09;2.3.1 三次握手2.3.2 四次挥手 2.4 滑动窗口机制2.5 流量控制机制2.6 拥塞控制机制2.7 延迟应答机制2.8 捎带应答机制 3.…

Linux工具git版本控制器介绍

git介绍 ​ git就是一个版本控制器&#xff0c;是由Linux之父写的开源软件&#xff0c;功能就是保存每个版本的内容。将被管理的内容&#xff08;文本&#xff09;&#xff0c;按照变化来进行管理的软件&#xff0c;你需要哪一个变化的版本都可以找到。 git是一个软件&#x…

ATE新能源汽车充电桩自动负载测试系统

随着新能源汽车的普及&#xff0c;充电桩的需求也在不断增加&#xff0c;为了确保充电桩的性能和安全性&#xff0c;对其进行负载测试是非常重要的。ATE新能源汽车充电桩自动负载测试系统是一种专门用于检测充电桩性能的设备&#xff0c;它可以模拟各种实际使用场景&#xff0c…

打造高效运营底座,极智嘉一体化软件系统彰显科技威能

在仓储成本和物流需求日益增加的今天&#xff0c;创新且高效的物流机器人解决方案能够显著提升物流运营效率&#xff0c;降低物流成本&#xff0c;实现智能化、精益化、一体化的物流管理。全球仓储机器人引领者极智嘉(Geek)以「一套系统&#xff0c;天生全能」为准则&#xff0…

数据集:机器人理解世界的关键

原创 | 文 BFT机器人 传统的机器人和工业自动化解决方案已经颇有成效。在工厂中入驻自动化机器人可以快速地帮助工人们完成长时间重复劳动的任务。随着用工成本上涨、技能人才短缺、工作环境恶劣等问题的凸显&#xff0c;社会更迫切地需要采用自动化设备代替人工来完成该类操作…

又要报销了,还在手动下载整理发票吗?

大多数公司都是每个月定期提交报销&#xff0c;一般报销用的发票都是电子发票发到邮箱&#xff0c;每次要报销时都需要登录邮箱&#xff0c;点开邮件&#xff0c;一个个下载整理&#xff0c;工作量不大&#xff0c;但是发票多了也着实很烦。这个月终于下决心把这个过程自动化一…

《005.SpringBoot+vue之学生选课管理系统01》

《005.SpringBootvue之学生选课管理系统01》 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; 管理端 1…

BO(Business Object)是一种用于表示业务对象的设计模式

1、Service层 BO 1.1、FruitService接口 package com.csdn.fruit.service; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import com.csdn.fruit.pojo.Fruit; public interface FruitService {PageInfo<Fruit> getFruitPageInfo(Page…