Docker-namespace

news2024/11/16 13:27:10

Docker-namespace

  • namespace
    • 基础命令
      • dd 命令
      • mkfs
      • df
      • mount
      • unshare
    • pid 隔离试验
    • mount 隔离

namespace

namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程相关资源指定在同一个 namespace 中。

Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前namespace 里的进程,对其他 namespace 中的进程没有影响。

Linux 提供了多个 API 用来操作 namespace,它们是 clone()、 setns() 和 unshare() 函数,为了确定隔离的到底是哪项 namespace,在使用这些 API 时,通常需要指定一些调用参数:CLONE_NEWIPC、 CLONE_NEWNET、 CLONE_NEWNS、CLONE_NEWPID、 CLONE_NEWUSER、 CLONE_NEWUTS 和 CLONE_NEWCGROUP。如果要同时隔离多个 namespace,可以使用 | (按位或)组合这些参数。

namespace系统调用参数被隔离的全局系统资源
UTSCLONE_NEWUTS主机名和域名
IPCCLONE_NEWIPC信号量、消息队列和共享内存
PIDCLONE_NEWPID进程编号
NetworkCLONE_NEWNET网络设备、网络栈、端口等
MountCLONE_NEWNS文件系统挂载点
UserCLONE_NEWUSER用户和用户组

以上命名空间在容器环境下的隔离效果:
UTS:每个容器能看到自己的 hostname,拥有独立的主机名和域名。
IPC:同一个 IPC namespace 的进程之间能互相通讯,不同的 IPC namespace 之间不能通信。
PID:每个 PID namespace 中的进程可以有其独立的 PID,每个容器可以有其 PID 为 1 的 root 进程。
Network:每个容器用有其独立的网络设备, IP 地址, IP 路由表, /proc/net 目录,端口号。
Mount:每个容器能看到不同的文件系统层次结构。
User:每个 container 可以有不同的 user 和 group id。

基础命令

dd 命令

dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。
语法:dd OPTION

参数如下:

  • if=文件名:输入文件名,默认为标准输入。即指定源文件。
  • of=文件名:输出文件名,默认为标准输出。即指定目的文件。
  • ibs=bytes:一次读入 bytes 个字节,即指定一个块大小为 bytes 个字节。obs=bytes:一次输出 bytes 个字节,即指定一个块大小为 bytes 个字节。bs=bytes:同时设置读入/输出的块大小为 bytes 个字节。
  • cbs=bytes:一次转换 bytes 个字节,即指定转换缓冲区大小。
  • skip=blocks:从输入文件开头跳过 blocks 个块后再开始复制。 seek=blocks:从输出文件开头跳过 blocks 个块后再开始复制。
  • count=blocks:仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
  • conv=<关键字>,关键字可以有以下 11 种:
    • conversion:用指定的参数转换文件。
    • ascii:转换 ebcdic 为 ascii
    • ebcdic:转换 ascii 为 ebcdic
    • ibm:转换 ascii 为 alternate ebcdic
    • block:把每一行转换为长度为 cbs,不足部分用空格填充
    • unblock:使每一行的长度都为 cbs,不足部分用空格填充
    • lcase:把大写字符转换为小写字符
    • ucase:把小写字符转换为大写字符
    • swap:交换输入的每对字节
    • noerror:出错时不停止
    • notrunc:不截短输出文件
    • sync:将每个输入块填充到 ibs 个字节,不足部分用空(NUL)字符补齐

示例:
从 /dev/zero 文件里一次读取8k大小的内容,总共读取1024次,并把每次读取到的数据写入到test1.img文件中。

在这里插入图片描述

mkfs

作用:用于在设备上创建 Linux 文件系统,俗称格式化,比如我们使用 U 盘的时候可以格式化。
语法:
mkfs [-V] [-t fstype] [fs-options] filesys [blocks]

常见参数:

  • -t fstype:指定要建立何种文件系统;如 ext3, ext4
  • filesys :指定要创建的文件系统对应的设备文件名;
  • blocks:指定文件系统的磁盘块数。
  • -V : 详细显示模式
  • fs-options:传递给具体的文件系统的参数。
    示例:
    mkfs -t ext4 test1.img // 格式化镜像文件为 ext4
    mkfs -t ext4 /dev/sda6 // 将sda6分区格式化为 ext4 格式

df

作用:命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。
语法:
df [OPTION]... [FILE]...
常见参数:

  • -a, --all 包含所有的具有 0 Blocks 的文件系统

  • -h, --human-readable 使用人类可读的格式(预设值是不加这个选项的…)

  • -H, --si 很像 -h, 但是用 1000 为单位而不是用 1024

  • -t, --type=TYPE 添加过滤条件,只列出文件系统是 TYPE

  • -T, --print-type 显示文件系统的形式

mount

作用:mount 命令用于加载文件系统到指定的加载点。此命令的也常用于挂载光盘,使我们可以访问光盘中的数据,因为你将光盘插入光驱中, Linux 并不会自动挂载,必须使用 Linux mount 命令来手动完成挂载。
Linux 系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的, 可以自由组合(通过挂载)
不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。
挂载的实质是为磁盘添加入口(挂载点)。

常见用法:

mount [-l]
mount [-t vfstype] [-o options] device dir

常见参数:

  • -l:显示已加载的文件系统列表;

  • -t: 加载文件系统类型支持常见系统类型的 ext3,ext4,iso9660,tmpfs,xfs 等,大部分情况
    可以不指定, mount 可以自己识别

  • -o options 主要用来描述设备或档案的挂接方式。

    • loop:用来把一个文件当成硬盘分区挂接上系统

    • ro:采用只读方式挂接设备

    • rw:采用读写方式挂接设备

  • device: 要挂接(mount)的设备。

  • dir: 挂载点的目录

示例:

// 将 /dev/hda1 挂在 /mnt 之下。 
mount /dev/hda1 /mnt 
// 将镜像挂载到/mnt/testext4 下面,需要确保挂载点也就是目录存在 
mkdir -p /mnt/testext4 
mount ./fdimage.img /mnt/testext4

unshare

作用:unshare 主要能力是使用与父程序不共享的名称空间运行程序。

语法:

unshare [options] program [arguments]

常用参数:

参数含义
-i, --ipc不共享 IPC 空间
-m, --mount不共享 Mount 空间
-n, --net不共享 Net 空间
-p, --pid不共享 PID 空间
-u, --uts不共享 UTS空间
-U, --user不共享用户
-V,–version版本查看
–fork执行 unshare 的进程 fork 一个新的子进程,在子进程里执行unshare 传入的参数
–mount-prot执行子进程前,将 proc 有限挂载过去

示例:

hostname 隔离

[root@VM-0-11-centos ~]# unshare -u /bin/bash
[root@VM-0-11-centos ~]# hostname test
[root@VM-0-11-centos ~]# hostname
test
[root@VM-0-11-centos ~]# exit
exit
[root@VM-0-11-centos ~]# hostname
VM-0-11-centos

在这里插入图片描述

pid 隔离试验

在这里插入图片描述
出错是因为如果不建新进程,新的 namespace 会用执行 unshare 命令的进程 的 PID 作为新的空间的父进程,而这个 unshare 进程并不在新的 namespace 中,所以会报个错 Cannot allocate memory。

加上 --fork选项后,还是不能满足要求,通过ps -ef还是可以查看到其他进程的信息
请添加图片描述
可以通过加上 mount-proc选项, 加上 mount-proc选项是因为 Linux 下的每个进程都有一个对应的 /proc/PID 目录,该目录包含了大量的有关当前进程的信息。 对一个 PID namespace 而言, /proc 目录只包含当前 namespace 和它所有子孙后代 namespace 里的进程的信息。创建一个新的 PID namespace 后,如果想让子进程中的 top、 ps 等依赖 /proc 文件系统的命令工作,还需要挂载 /proc 文件系统。而文件系统隔离是 mount namespace 管理的,所以 linux特意提供了一个选项
–mount-proc 来解决这个问题。如果不带这个我们看到的进程还是系统的进程信息。

执行 ps -ef 查看进程信息,我们可以看到此时进程空间内的内容已经变了,而且启动进程也变成了我们的 bash 进程。说明我们已经看不到主机上的进程空间了,我们的进程空间发生了隔离。
在这里插入图片描述
完整pid隔离示例:
unshare --fork --pid --mount-proc /bin/bash

mount 隔离

首先先执行 unshare --mount --fork /bin/bash 或者直接 unshare --mount即可
–fork 选项用于在创建新的命名空间时将新的子进程创建在新的命名空间中。
如果你想要在新的命名空间中执行一些任务,那么使用 --fork 选项可能是有用的。
但是,如果你只是想创建一个新的 mount 命名空间,而不需要在其中运行新的进程,你可以不使用
–fork 选项。
并使用 dd命令创建一个新文件
dd if=/dev/zero of=test.img bs=8k count=10240
并创建一个文件挂载点文件夹
mkdir testmount
最后将镜像挂载到新创建的文件夹下面
mount -t ext4 ./test.img ./testmount
最后通过查看新创建的bash和开启mount中的bash可以发现是存在mount隔离的
在这里插入图片描述

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

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

相关文章

D3JS简介

D3JS 什么是D3js D3.js是一个流行的JavaScript数据可视化库&#xff0c;它提供了一系列的API和工具&#xff0c;用于创建交互式的数据图表、地图等可视化效果。以下是一些D3.js的特点和用途&#xff1a; 数据驱动&#xff1a;D3.js基于数据驱动的思想&#xff0c;将数据和视觉…

科教兴国 | 拓世集团携手中国航天广电集团,打造《AI+教育平台》

在这个时代&#xff0c;人工智能的奇迹交织成一片璀璨的星河。在这片星河中&#xff0c;各大企业如同星辰&#xff0c;闪烁着探索的光芒&#xff0c;寻找着那些志同道合的伙伴。我们并肩飞翔&#xff0c;穿越信息的海洋&#xff0c;共同描绘出未来的蓝图。每一次合作&#xff0…

麒麟信安主办openEuler嵌入式Meetup:打造湖南大学openEuler技术小组,大咖齐聚共探技术前沿

9月8日&#xff0c;由开放原子基金会指导&#xff0c;openEuler社区、麒麟信安、湖南欧拉生态创新中心以及湖南大学联合主办的openEuler嵌入式Meetup在湖南大学成功举办。这一技术盛会汇聚了业内顶尖专家和开发者&#xff0c;旨在为嵌入式技术领域注入新的活力和创新。 活动现场…

巴州阳光志愿者服务协会党支部开展 第十一季“衣旧情深”爱心 活动

为了让捐赠真正回归公益慈善&#xff0c;奉行衣物回收“取之于民&#xff0c;用之于民”的理念&#xff0c;2023年9月10日&#xff0c;巴州阳光志愿者服务协会党支部书记李晓红组织志愿者们去普惠乡开展第十一季“衣旧情深”爱心活动。 本次活动是以“99公益日”活动为契机&…

Mysql5.7(Docker环境)实现主从复制

文章目录 前言一、MySQL主从数据库同步如何实现&#xff1f;(理论)1.1 为什么要使用数据库主从1.2 数据库主从实现原理是什么&#xff1f; 二、Docker环境配置MySQL5.7主从(实践)2.1 配置安装Master2.2 配置安装Slave 前言 本文章将以MySQL5.7版本来讲诉MySQL主从复制的原理以…

Android Jetpack Compose之状态持久化与恢复

目录 1.概述2.实例解析4. Compose提供的MapSaver和ListSaver4.1 mapServer4.2 ListSaver 1.概述 在之前的文章中&#xff0c;我们提到了remember&#xff0c;我们都知道remember可以缓存创建状态&#xff0c;避免因为重组而丢失。使用remember缓存的状态虽然可以跨越重组&…

软件测试之功能测试

一、测试项目启动与研读需求文档 &#xff08;一&#xff09; 组建测试团队 1.测试团队中的角色 2.测试团队的基本责任 尽早地发现软件程序、系统或产品中所有的问题。 督促和协助开发人员尽快地解决程序中的缺陷。 帮助项目管理人员制定合理的开发和测试计划。 对缺陷进行跟…

芯科蓝牙BG27开发笔记3-修改第一个程序

提问&#xff1a; 如何实现连续发送通知消息&#xff1f; 蓝牙无线射频信号在时间轴不是连续不断地存在&#xff0c;为了实现大数量的传输&#xff0c;需要额外的机制保证设备可以在下一次启动射频后可以接着发送之前没有发完的消息&#xff0c;nordic是可以使用队列&#xf…

springboot jpa手动事务

创建springboot项目 搭建最简单的SpringBoot项目_Steven-Russell的博客-CSDN博客 引入jpa和数据据依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>…

yolov8 模型部署--TensorRT部署-c++服务化部署

写目录 yolov8 模型部署--TensorRT部署1、模型导出为onnx格式2、模型onnx格式转engine 部署 yolov8 模型部署–TensorRT部署 1、模型导出为onnx格式 如果要用TensorRT部署YOLOv8&#xff0c;需要先使用下面的命令将模型导出为onnx格式&#xff1a; yolo export modelyolov8n.p…

二维前缀和

导言 当我们需要求到某个矩阵的子矩阵的和时,就可以使用二维前缀和 这是一个矩阵, 就是左上角区域的所有数之和 ...... 如果要 求中间的子矩阵的和,(x,y)为左上角 ...... ...... ,(i,j)为右下角,那么只需要算 - - ------这一…

QT第五天

void Widget::on_show_clicked() { QString sql "select * from myTable" ; QSqlQuery querry; if(!querry.exec(sql)) { QMessageBox::information(this,"失败","展示失败"); return; } //此时&…

如何用 DAP 仿真器下载程序

1.仿真器简介 本书配套的仿真器为 Fire-Debugger&#xff0c;遵循 ARM 公司的 CMSIS-DAP 标准&#xff0c;支持所有基于 Cortex-M内核的单片机&#xff0c;常见的 M3、M4 和 M7 都可以完美支持。 Fire-Debugger 支持下载和在线仿真程序&#xff0c;支持XP/WIN7/WIN8/WIN10 这…

c++ day 4

1、仿照string类&#xff0c;完成myString 类 #include <iostream> #include<cstring>using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10…

JVM优化(OOM,内存溢出),查看线程快照,堆内存情况等问题

1&#xff1a;堆大小 新生代 老年代&#xff0c;新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ) 2&#xff1a;-Xmn参数总是应当小于-Xmx参数&#xff0c;否则就会触发OOM错误 3&#xff1a;jvm优化与查看gc回收情况&#x…

数据通信网络之OSPFv3基础

文章及资源归档至【AIShareLab】&#xff0c;回复 通信系统与网络 可获取。 文章目录 一、目的二、拓扑三、需求四、步骤 一、目的 掌握路由器的IPv6 基础配置。掌握OSPFv3&#xff08;单区域&#xff09;的基础配置。 二、拓扑 如图1 所示&#xff0c;三台路由器R1、R2 和R…

网络传输方式

1. 单播 1.1. 定义 单播是指一种向单个目标地址传送数据的方式&#xff0c;即单独的一对一通讯方式。 1.2. 可使用协议 UDP、TCP等协议 1.3. 常见的场景 发送电子邮件传输文件 2. 广播 2.1. 定义 一种向本地网络中所有设备发送数据的方式。 2.2. 常见的场景 电视和电…

仅做笔记用:Stable Diffusion 通过 ControlNet 扩展图片 / 扩图

发觉之前的 Outpainting 脚本效果仍旧不是很理想。这里又找了一下有没有效果更好的途径来扩图。于是就找到了通过 ControlNet 的方式来实现效果更好的扩图。这里临时记录一下在 Stable Diffusion 怎么使用 ControlNet 来扩展图片。 下载 control_v11p_sd15_inpaint_fp16.safet…

Sql注入详解(原理篇)

一、简介 SQL 注入漏洞非常复杂&#xff0c;区分各种数据库类型&#xff0c;提交方法&#xff0c;数据类型等注入&#xff0c;同样此类漏洞是WEB安全中严重的安全漏洞&#xff0c;学习如何利用&#xff0c;挖掘&#xff0c;修复也是很重要的 二、SQL注入原理 1、什么是SQL注…

嵌入式学习之链表

对于链表&#xff0c;要重点掌握链表和数组区别和实现&#xff0c;链表静态添加和动态遍历&#xff0c;链表中pointpoint-next,链表节点个数的查找&#xff0c;以及链表从指定节点后方插入新节点的知识。