当前位置: 首页 > java >正文

[docker基础二]NameSpace隔离实战

目录

一  实战目的

二  基础知识

1)dd 命令详解

2)mkfs命令详解

3)df命令详解

4)mount 命令详解

5)unshare命令详解

三  实战操作一(PID隔离)

四  实战操作二(MOunt隔离)

1)创建 Mount 隔离进程

2)在新进程里边,创建空白文件,把它挂载为一个磁盘,从而完成挂载点的创建

3)在外边看下能否看到挂载,复制ssh渠道再开个窗口即可

4)创建文件等,验证下

5)总结


一  实战目的

了解隔离能力并不是 docker 提供的,而是操作系统内核提供基本能力。

二  基础知识

1)dd 命令详解

作用:Linux 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)字符补齐。

○ --help:显示帮助信息

○ --version:显示版本信息

# 生成 1 个镜像文件
dd if=/dev/zero of=fdimage.img bs=8k count=10240
#将 testfile 文件中的所有英文字母转换为大写,然后转成为 testfile_1 文件
dd if=testfile_2 of=testfile_1 conv=ucase 

2)mkfs命令详解

作用:用于在设备上创建 Linux 文件系统,俗称格式化,比如我们使用 U 盘的时候可以格式化。

语法:

mkfs [-V] [-t fstype] [fs-options] filesys [blocks]

参数:

-t fstype:指定要建立何种文件系统;如 ext3,ext4

filesys :指定要创建的文件系统对应的设备文件名;

blocks:指定文件系统的磁盘块数。

-V : 详细显示模式

fs-options:传递给具体的文件系统的参数

 实例:

#将 sda6 分区格式化为 ext4 格式
mkfs -t ext4 /dev/sda6 
#格式化镜像文件为 ext4
mkfs -t ext4 ./fdimage.img

3)df命令详解

作用:Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使 用情况统计。

语法:

df [OPTION]... [FILE]...

常见参数:

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

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

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

○ -t, --type=TYPE 限制列出文件系统的 TYPE

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

案例:

Shell
#查看磁盘使用情况
df -h
#查看磁盘的系统类型
df -Th

4)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

5)unshare命令详解

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

语法:

unshare [options] program [arguments]

 常用参数及含义:

 案例:

#hostname 隔离
root@139-159-150-152:~# unshare -u /bin/bash
root@139-159-150-152:~# hostname test1
root@139-159-150-152:~# hostname
test1
root@139-159-150-152:~# exit
exit
root@139-159-150-152:~# hostname
139-159-150-152
root@139-159-150-152:

三  实战操作一(PID隔离)

使用 unshare 命令隔离进程pid

 错误原因:父进程是外部的shell,隔离以后,新进程(/bin/bash)看不到外边的PID信息,启动的时候/bin/bash没有自己的父进程就报错

解决方案:添加参数 --fork 创建一个全新的进程,让创建的新进程和外部的shell没有什么关系

然后使用 ps -ef 命令查看shell与新进程的进程列表

发现竟然一样没有变化

原因:

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

 使用如下命令:

root@VM-8-9-ubuntu:/home/dq/docker_code# unshare -p  --fork --mount-proc /bin/bash

 再次使用 ps -ef命令查看发现:我们可以看到此时进程空间内的内容已经变了,而且 启动进程也变成了我们的 bash 进程。说明我们已经看不到主机上的进程空间了,我们的进程空间发生了隔离。

四  实战操作二(MOunt隔离)

1)创建 Mount 隔离进程

使用命令

root@VM-8-9-ubuntu:/home/dq/docker_code# unshare --mount --fork /bin/bash

2)在新进程里边,创建空白文件,把它挂载为一个磁盘,从而完成挂载点的创建

使用 dd 命令创建空白文件

转化为挂载点,要先格式化

完成挂载:

3)在外边看下能否看到挂载,复制ssh渠道再开个窗口即可

发现是看不到这一栏,说明已经发生文件系统隔离

4)创建文件等,验证下

在新进程中

在shell中查看,查看不到

5)总结

借助 mount 隔离把挂载点完成了一个隔离,挂载点一旦隔离,想象一下在每个 mount 出来的目录下放入应用程序需要的所有程序,再放入所需要的操作系统所需要的文件,完成了一个操作系统隔离的最简单的沙箱

http://www.xdnf.cn/news/4995.html

相关文章:

  • 对于Redis集群部署模式的不同实现
  • Vulfocus靶场-文件上传-2
  • 【速通RAG实战:检索】7.RAG混合检索与重排序技术
  • 【优选算法】二分查找
  • Windows 下 dll转换成lib
  • djinn: 3靶场渗透
  • 城市客运安全员备考练习题
  • 4.3java工具类Objects,Arrays
  • PMIC电源管理模块的PCB设计
  • 124549-23-1,PBFI AM,测定细胞内区隔的钾离子水平变化
  • 全球实物文件粉碎服务市场洞察:合规驱动下的安全经济与绿色转型
  • 2022-2025年全国路网数据分享
  • C++AVL树
  • 计算机二级(C语言)已过
  • HarmonyOS开发-组件市场
  • 提升研发运维效能:Pacvue 泊客电商的 GenAI 技术实践
  • 从0开始学linux韦东山教程第一三章问题小结(1)
  • wsl - install RabbiqMQ
  • 2025数维杯数学建模C题完整分析参考论文(共36页)(含模型、可运行代码、数据)
  • 【Python】超全常用 conda 命令整理
  • 【深度学习新浪潮】智能追焦技术全解析:从算法到设备应用
  • MATLAB制作柱状图与条图:数据可视化的基础利器
  • Android 项目中配置了多个 maven 仓库,但依赖还是下载失败,除了使用代理,还有其他方法吗?
  • LLM 推理加速:深度解析 Prefilling 与 Decoding 阶段的优化秘籍
  • YOLOv1模型架构、损失值、NMS极大值抑制
  • 从设计到开发,原型标注图全流程标准化
  • 学习DLT698进阶二,电表的事件
  • 基于 Ubuntu 24.04 部署 WebDAV
  • window 显示驱动开发-配置内存段类型
  • Jenkins linux安装