Linux中chroot与pivot_root的区别

Linux命令-chroot命令(把根目录换成指定的目的目录) 这样就能够正确运行a.out了,因为a.out使用到了其他的动态连接库,所以需要将库拷贝到newRoot中,如果没有其他库那么直接拷贝a.out就能运行。在 linux 系统中,系统默认的目录结构都是以 / ,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 / 位置。这样运行的是target中。了动态连接的库,需要用ldd查看a.out需要那些动态库,将这些库拷贝到新根的对应路径下才能执。的ls(不是本机的 /bin/ls ),然后返回立即本机的目录环境。 阅读详情
1. chroot: 在指定的root目录运行命令
参考"info root"中的例子,我把/bin/ls拷贝至~/myroot后,
运行"$ sudo chroot ~/myroot /ls -Rl /", 结果得到下面的错误结果:
“chroot: cannot run command `/ls': No such file or directory”.

事实上,"info root"中提到,如果执行的命令属于动态链接可执行文件,需要把依赖的共享库文件拷贝到新的root相关目录中。
运行,"$ ldd ~/myroot/ls",发现依赖于以下库:
“
    linux-gate.so.1 =>  (0x00795000)
    librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x00e7a000)
    libselinux.so.1 => /lib/libselinux.so.1 (0x00748000)
    libacl.so.1 => /lib/libacl.so.1 (0x00fbf000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x0053d000)
    /lib/ld-linux.so.2 (0x003ba000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x002f5000)
    libattr.so.1 => /lib/libattr.so.1 (0x00255000)
”
在myroot下建立lib目录,然后把上诉库文件拷贝至该目录。重新运行chroot,成功。

chroot通常用于运行一些不可靠的程序,这样比较安全。
chroot也通常用于手动建立一个linux系统,属于LFS项目的重要部分。LFS项目(Linux from Scratch),提供方法和建议来建立自己定制的linux系统,包括全部通过源代码。

LFS用于学习linux系统以及定制小的系统非常有帮助。

2. exec命令在当前shell执行一个命令,同时结束该shell。exec可以用于用一种新的shell替换原来的shell,比如 "$exec ksh"。

3. pivot_root: 改变root文件系统
   用法:pivot_root new_root put_old
   描述:pivot_root把当前进程的root文件系统放到put_old目录,而使new_root成为新的root文件系统。
例子:
   从127.0.0.1:/home/qianjiang/nfsroot挂载新的文件系统并且运行init
   a. 拷贝sh,ls至nfsroot/bin,以及相关的共享库至nfsroot/lib
   b. 在nfsroot下面建立目录old_root
   c. mount -o ro 127.0.0.1:/home/qianjiang/nfsroot /mnt
   d. cd /mnt
   e. pivot_root . old_root

“这个时候,会发现比如"ls /"显示的是nfsroot下面的文件;"ls old_root"显示的是之前文件系统root下面的文件。”
   
   f. exec chroot . sh -c "umount /old_root; exec /sbin/init' \
         <dev/console >dev/console 2>&1

pivot_root和chroot的主要区别是,pivot_root主要是把整个系统切换到一个新的root目录,而移除对之前root文件系统的依赖,这样你就能够umount原先的root文件系统。而chroot是针对某个进程,而系统的其它部分依旧运行于老的root目录。
Linux系统之chroot命令详解 chroot(Change Root)是一个用于改变进程根目录的命令,使进程及其子进程只能访问指定目录(NEWROOT)下的文件和目录,而无法看到或访问原系统的根目录(/)。它常用于安全隔离、系统恢复、软件测试等场景。 阅读详情

相关推荐

Linux 中的 chroot 命令及示例

让我们在“home”目录中创建一个“jail”目录,这将是我们的新根目录。在此类修改的环境中运行的进程/命令无法访问根目录之外的文件。chroot [选项] /path/to/new/root /path/to/server。cp -v 库/显示/by/above/命令 $HOME/jail/lib64。同样,将ls命令的库复制到$HOME/jail/lib64位置。Linux/Unix系统中的chroot命令用于更改根目录。chroot /路径/到/新/根/路径/到/服务器。显示帮助信息,然后退出。

wly476923083的博客 1301

chroot命令

当然我们也可以拷贝旧系统的下的命令到新的目录结构中使用,但是那些命令通常是动态编译的,这就意味着我们不得不拷贝相关的动态库文件到相应的目录结构中。但是由于在经过chroot之后,系统读取到的bin/等与系统相关目录将不再是旧系统根目录下的,而是切换后新根下的目录结构和文件,因此我们有必要准备一些目录结构以及必要的文件。chroot的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始RAM磁盘(initrd)切换系统的根位置并执行真正的init。...

szembed的博客 1万+

Matlab:常见涡旋光束仿真

代码: clc clear all close all %% 环形涡旋光束 N = 200; lambda = 632e-9; %波长为632nm k = 2*pi/lambda; %波数 w0 = 3; %束腰半径 x = linspace(-10,10,N); y = linspace(-10,10,N); [X,Y] = meshgrid(x,y); [t...

zzz997的博客 3万+

linux chroot 命令

chroot 是一个很有意思的命令,我们可以用它来简单的实现文件系统的隔离。但在一个容器技术繁荣的时代,用 chroot 来进行资源的隔离实在是 low 了点。所以 chroot 的主要用途还是集中在系统救援、维护等一些特殊的场景中。理解 chrootLinux – RedHat7 / CentOS 7 忘记root密码修改sparkdevsparkdev - 博客园本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Chocolate的博客 3905

用MATLAB从零实现六足机器人步态仿真:交替三角与波动步态保姆级教程

本文详细介绍了如何使用MATLAB从零实现六足机器人的两种经典步态仿真:交替三角支撑步态和波动步态。通过参数定义、相位设置、运动轨迹生成和三维可视化等步骤,帮助读者掌握六足机器人步态规划的核心技术。教程包含完整代码和详细解析,适合机器人爱好者和相关专业学生学习实践。

weixin_26765363的博客 226

SAP VF01开票报错:出口贸易数据不完整

找了半天资料,最后发现是没有维护凭证抬头的数据;由于我不是SD模块顾问,整体流程使用的是原本环境里面的数据,用新建工厂引用,所以也不知道为啥会出发这个贸易业务。正常传到FICO模块,生成会计凭证、获利分析、利润中心及CO凭证。需要维护这三个字段后才能正常转到FI生成会计凭证。VF01开票报错:出口贸易数据不完整。

MaiKouBei的博客 1538

pivot_root:原理、用途及最简单 Demo

pivot_root是 Linux 系统中的一个系统调用(和对应的命令行工具),用于更改进程的根文件系统。与chroot类似,pivot_root将一个指定目录设置为进程的新根目录(),但它比chroot更灵活,特别适合容器环境。它的核心功能是将当前根文件系统(旧根)移动到另一个位置,并将新目录设置为根文件系统。pivot_root是一种强大的根文件系统切换工具,通过将新目录设为根并移动旧根,实现比chroot更彻底的隔离,常用于容器初始化。结合 Mount Namespace 和nsenter。

小诸葛的博客 1109

Ansys口腔正畸有限元分析:从几何处理到接触设定的全流程解析

本文详细解析了Ansys在口腔正畸有限元分析中的全流程应用,从几何处理到接触设定,帮助医生精准预测牙齿移动趋势。通过有限元建模技术,可同时观察牙齿-牙周膜-牙槽骨的力学响应,显著提升矫治效果预测准确率。文章还分享了实用技巧和参数设置建议,适用于正畸医生和工程师。

weixin_30897233的博客 346

chroot, exec, pivot_root

1. chroot: 在指定的root目录运行命令 参考"info root"中的例子,我把/bin/ls拷贝至~/myroot后, 运行"$ sudo chroot ~/myroot /ls -Rl /", 结果得到下面的错误结果: “chroot: cannot run command `/ls': No such file or directory”. 事实...

weixin_34383618的博客 500

华为防火墙USG6000V---内网访问外网---外网访问内网服务器(NAT服务器)示例配置

华为防火墙USG6000V示例配置,展示了访问防火墙、内网服务器、外网和外网访问内网服务器(NAT服务器)的配置。

lehe99的专栏 2万+

基于ESP32的智能停车场管理系统开发

智能停车场管理系统通过引入物联网(IoT)技术,实现对停车场内车辆的实时监控、空闲车位的管理、车辆的入场与出场控制等功能,大大提高了停车场的利用率和管理效率。通过集成物联网技术、云平台以及先进的传感器和执行器,系统不仅能实时监控停车场的车位状态,还能提供更好的用户体验。本文将介绍如何基于ESP32开发一个智能停车场管理系统,涵盖系统架构、硬件选择、软件开发以及最新技术的应用,帮助开发者实现高效的智能停车管理。ESP32的代码主要负责处理车位传感器的数据,控制LED指示灯的状态,以及与云平台进行数据交互。

2201_76125393的博客 911

pivot_root 核心原理

pivot_root是Linux系统调用,用于将当前进程的根文件系统切换到新路径,同时将原根挂载到新根下的指定目录。与chroot仅修改进程视图不同,pivot_root实现了物理级别的文件系统切换,是容器技术实现根隔离的核心机制。其内核实现通过重排挂载树结构,将新根提升为全局根目录,并将原根挂载到指定子路径。关键特性包括:严格的权限检查、原子性操作、引用计数管理,且操作仅影响当前挂载命名空间,不会干扰主机系统。这种基于命名空间的隔离机制使其成为容器文件系统隔离的基础。

tangzhangyin的专栏 934

Python爬虫实战:基于最新技术爬取国家企业信用信息公示系统数据

本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的国家企业信用信息公示系统爬虫。我们将从爬虫基础知识讲起,逐步深入到反爬机制应对、数据解析与存储等高级话题,最终实现一个完整的爬虫系统。文章包含大量实战代码示例,适合中高级Python开发者学习参考。网络爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析和商业情报收集等领域。通用爬虫:如搜索引擎爬虫,广泛抓取互联网公开信息聚焦爬虫:针对特定领域或网站的数据采集增量式爬虫:只抓取更新内容,减少资源消耗。

2201_76125261的博客 2405

inode、chroot、pivot_root

一、inode:储存文件元信息包含: 文件的字节数 文件拥有者的User ID Group ID 文件的读、写、执行权限 文件时间戳,ctime☞iNode上次变动的时间,mtime☞文件内容上次变动的时间,atime指文件上一次打开的时间 链接数,有多少文件名指向这个inode 文件数据block的位置stat filename 指令查看inode信息。...

weixin_30296405的博客 280

华为OD机试真题2025双机位A卷 Java&Go 实现【采购订单】

在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。

MISAYAONE的博客 1257

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pivot_root系统调用及示例

pivot_root是Linux系统中用于切换根文件系统的关键系统调用。它通过交换当前根文件系统与另一个挂载的文件系统(new_root),并将旧根文件系统移动到指定目录(put_old)来实现系统环境的完全切换。与chroot不同,pivot_root影响整个系统的所有进程。该调用主要用于系统启动过程(如从initramfs切换到真实根文件系统)、系统恢复和容器技术。使用时需满足严格条件:new_root必须是已挂载的文件系统,put_old必须位于新根文件系统内,且调用进程需具有CAP_SYS_ADMI

悟空看八戒烤熟了没的专栏c)4Upqt4SeVk 879

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux复杂的命令,linux的一些复杂命令

用与改变root目录可以用pivot_root和chroot命令,但是这两者之间是有区别的pivot_root :直接将整个文件系统的root目录改为指定目录chroot :对于运行的指令以目标目录作为root目录,只影响单个进程.exec :用于结束当前执行的进程并继承其上下文,开始一个新的进程.PID不会改变. 和souse命令的不同之处在于exec会结束当前进程而souse不会.如果不想结束...

weixin_31038719的博客 465

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

pivot_root:容器隔离与initramfs切换根的关键系统调用

在Linux系统中,文件系统的挂载点决定了进程所能看到的目录树边界。当需要将整个系统的根文件系统从内存中的initramfs切换到磁盘上的真实根分区时,或者为容器构建一个与宿主机隔离的根环境时,仅仅依赖chroot是远远不够的。chroot只改变进程的根目录指针,挂载树结构并未变化,存在路径逃逸风险。而pivot_root系统调用则从挂载命名空间层面整体切换根挂载点,将旧根摘下并挂到新根的子目录中,从结构上杜绝了通过路径返回旧根的可能。这一机制是容器运行时runc实现安全隔离的关键步骤,也是initramf

weixin_29231725的博客 279

switch_root原理与实操:Linux启动流程中的根文件系统切换

操作系统启动时,内核需要先挂载一个临时的根文件系统来加载驱动、准备设备,这就是initramfs。它承担了从引导到真实系统之间的过渡职责。而switch_root正是负责从initramfs切换到最终根文件系统的关键工具,其原理涉及挂载点迁移、旧根清理与init进程替换。理解这一机制,不仅能帮助开发者高效排查启动故障,还能优化嵌入式设备的内存占用。在定制Linux发行版、构建嵌入式系统或排查开机异常时,掌握switch_root的用法和前置条件,是打通启动链路的必备技能。本文从initramfs的概念出发,

weixin_29164497的博客 311

深入理解pivot_root:容器与initramfs的换根机制

容器与宿主机共享内核,却拥有独立的文件系统视图,这种隔离如何实现?核心在于Linux系统调用pivot_root,它能让进程的根目录从宿主挂载树整体切换到新的rootfs。早期chroot只能路径级换根,无法隔离挂载点,这是容器选择pivot_root的关键。本文将解析挂载点移动原理、mount namespace配合方式,以及挂载传播导致的常见陷阱。结合busybox实际演练,你会看到容器运行时和initramfs场景下,换根操作的真实处理流程。

weixin_33290540的博客 241

Linux容器文件系统隔离:pivot_root机制详解

在Linux容器技术中,文件系统隔离是实现资源隔离的核心机制。通过命名空间和挂载点管理,操作系统可以为每个容器提供独立的文件系统视图。pivot_root作为系统调用层面的关键技术,相比传统的chroot实现了更彻底的隔离,它通过交换整个挂载命名空间中的根文件系统,确保容器无法访问宿主机的文件系统。这种机制在Docker等容器运行时中被广泛应用,为容器提供了安全可靠的运行环境。理解pivot_root的工作原理对于排查容器启动失败、文件系统隔离异常等问题至关重要,特别是在处理挂载点准备、旧根清理等关键步骤时

weixin_31421613的博客 280

pivot_root 深度解析:从 initramfs 到容器运行时换根实战

在 Linux 系统中,根文件系统的切换是启动流程与容器隔离的关键技术。系统调用 pivot_root 提供了一种在运行中替换根挂载的能力,它将当前根目录整体迁移到新的挂载点,并保留旧根以便后续清理。与 chroot 仅改变路径起点不同,pivot_root 直接作用于挂载命名空间,确保临时根文件系统可被彻底卸载,从而释放内存资源。这一机制广泛应用于 initramfs 向磁盘真实根的过渡,以及 runc 等容器运行时构建独立 rootfs 的过程。理解挂载点、命名空间与动态链接依赖,是掌握换根操作的核心。

weixin_26800111的博客 284

chroot,pivot_root和switch_root 区别

一. chroot chroot 机制目的 为了进一步提高系统的安全性,linux引入了chroot机制,chroot是一个系统调用,可以更改一个进程所能看到的根目录。 类似创建一个沙盒,进程运行在沙盒之内,进程运行正常与否,并不会影响这个台器的其他进程。 chroot(change to root) 改变根目录,也就是改变一个程序运行时参考的根目录位置。例如...

u012385733的专栏 1万+

chroot , pivot_root与switch_root

详解chroot , pivot_root与switch_root的作用

tangzhangyin的专栏 1510

chroot与pivot_root总结 完整的chroot与pivot_root使用例子

chroot与pivot_root 完整使用例子

liuyij3430448的博客 3926
上一篇: AMD双显卡笔记本Windows 8/8.1/2012/2012 R2使用VMware Workstation无法开启3D加速
下一篇: LXC部分重要配置文件及文件夹分析
linuxchyu
博客等级 码龄17年 28粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值