
🚀 欢迎来到我的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
📌 收藏本文,下次需要时不迷路!
我们下期再见!💫 持续更新中......
悄悄说:点击主页有更多精彩内容哦~ 😊
