【Docker入门】namespace 空间隔离

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生
🔥Redis系列 从数据类型到核心特性解析 项目必备

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

基础命令

namespace是Linux内核用来隔离内核资源的方法 。通过命名空间可以让一些进程只能看到与自己相关的一部分资源,而另外一些进行也只能看到与它们自己相关的进行资源。

具体的实现方式是把一个或者多个进程的相关资源指定在同一个namespace中。所以 Linux namespace是对全局资源的一种封装隔离,可以使不同namespace 的进程拥有独立的全局系统资源,不同namespace 的进程无法影响其他进程。

dd

作用:可从标准输入或文件中读取数据,根据指定格式来转换数据,再输出到文件、设备或标准输出

powershell 复制代码
# 语法
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=<关键字> ,具体的关键字可以前往官网查看,此处不一一展示

  • --help :显示帮助信息

  • --version:显示版本信息

mkfs

作用:用于在设备上创建Linux文件系统,也就是格式化。

powershell 复制代码
mkfs [V] [-t fstype] [fs-options] filesys [blocks]

参数:

  • -t fstype :指定要建立何种文件系统(管理磁盘上文件存储和检索的机制)
  • filesys :指定要创建的文件系统对应的设备文件名
  • blocks :指定文件系统的磁盘块数
  • -V:详细显示模式
  • fs-options:传递给具体的文件系统的参数

df

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

powershell 复制代码
df [option]...  [file]...

参数:

  • -a( - - all) :包含所有的具有0 blocks 的文件系统

  • -h( - - human-readable) :使用人类可读格式(KB、GB)

  • -H( - - si) :使用1000为单位,而不是1024

  • -t( - - type=TYPE) :限制列出文件系统的TYPE

  • -T( - - print-type) :显示文件系统的形式

不使用任何参数:显示所有已挂载文件系统的磁盘使用情况

mount

作用:用于加载文件系统到指定的挂载点(指定一个入口)。
挂载:把U盘插入到电脑上,文件资源管理器中弹出来一个新的磁盘E: 。如果没有这个E: ,我们就无法访问这个U盘。本质上挂载是为磁盘添加一个入口(挂载点)

windows系统 上,会自动完成挂载;但是Linux系统不会自动挂载,需要Linux mount 命令来手动完成挂载。

powershell 复制代码
mount [-l]
mount [-t vfstype] [-o options] [device] dir

参数:

  • -l :显示已加载的文件系统列表(遍历)

  • -t:指定加载文件系统类型,支持常见系统类型,可以不指定,mount可以自己识别
    *-o options:主要用来描述设备或档案的挂载方式
        loop:用来把一个文件当成硬盘分区挂载到系统
        ro:采用只读方式挂接设备
        rw:采用读写方式挂接设备

  • device:要挂载(mount)的设备(U盘)

  • dir:挂载点的目录

整个过程就是:mkfs创建一个文件系统,mount挂载成一个磁盘,现在可以正常在这个"磁盘"中进行读写

unshare

作用:使用与父程序不共享的名称空间运行程序(隔离命名空间)

powershell 复制代码
unshare [options] program [arguments]

参数:

  • -i( - -ipc):不共享IPC空间

  • -m( - -mount):不共享Mount空间

  • -n( - -net):不共享Net空间

  • -p( - -pid):不共享PID空间

  • -u( - -user):不共享UTS空间

  • -v(- -version):查看版本

  • --fork:执行unshare的进程fork一个新的子进程,在子进程里执行unshare传入的参数

  • -- mount-proc:执行子线程前,将proc优先挂载过去

PID隔离

powershell 复制代码
unshare -p /bin/bash 

要解决这个报错也很简单,使用- - fork参数,unshare先 fork一个子进程,然后在这个子进程中执行指定的程序。不使用参数则是在unshare的进程下执行指定程序。

打开另一个shell,查看进程,发现两个shell的进程完全一样,显然我们的-p 进程隔离失败了。

-pid表示我们的进程隔离的是PID ,其他命名空间没有隔离;而mount-proc 是因为Linux下的每个进程都有一个对应的 /proc/PID 目录,该目录包含了大量有关当前进程的信息。

为了实现PID隔离,要先把 /proc 挂载过去,新的 /proc 只包含当前PID命名空间的进程信息,否则 /proc 还是父进程的进程信息。

Mount隔离

创建mount隔离进程

powershell 复制代码
unshare --mount --fork /bin/bash

创建空白文件

powershell 复制代码
dd if=/dev/zero of=data2.img bs=8k count=10240


把data2.img转换为一个挂载点,先进行格式化mkfs -t

powershell 复制代码
mkfs -t ext4 ./data2.img

执行df -h命令,查看主机默认命名空间的磁盘挂载情况。要进行挂载先要创建一个目录,挂载到目录。

powershell 复制代码
mkdir -p /data/maxhou/data2mount
mount -t ext4 ./data2.img /data/maxhou/data2mount


隔离成功。

创建一个mount沙箱,挂载只在沙箱内部能看到,在沙箱外面肯定是看不到的。退出沙箱,说明沙箱被销毁,里面的挂载自然也被销毁。

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......


悄悄说:点击主页有更多精彩内容哦~ 😊

相关推荐
骇客野人2 小时前
Linux通过自动脚本自动化推送k8s Docker镜像
linux·kubernetes·自动化
探序基因2 小时前
CentOS Stream release 9的Rstudio安装
linux·运维·centos
萧曵 丶2 小时前
Kubernetes(k8s)搭建指南
云原生·容器·kubernetes
HABuo2 小时前
【linux进程控制(二)】进程等待-->死亡的子进程是如何被父进程等待回收的?
linux·运维·服务器·c语言·c++·ubuntu·centos
wheeldown2 小时前
【Linux网络基础】Linux 网络基础与 TCP 协议
linux·网络·tcp/ip
上海云盾商务经理杨杨2 小时前
2026服务器保卫战:构建攻不垮的业务连续性体系
运维·服务器
杜子不疼.3 小时前
进程控制(四):自主Shell命令行解释器
linux·c语言·人工智能
橘颂TA3 小时前
【Linux 网络】深入理解 UDP
linux·运维·服务器·网络·网络协议
乱蜂朝王10 小时前
Ubuntu 20.04安装CUDA 11.8
linux·运维·ubuntu