尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
容器虚拟化基础--NameSpace空间隔离详解
目录1. dd 命令详解2. mkfs 命令详解3. df 命令详解4. mount 命令详解5. unshare 命令详解6. 实战操作一PID隔离7. 实战操作二Mount隔离望读者能通过此文了解隔离能力并不是 docker提供的而是操作系统内核提供基本能力。正文开始1. dd 命令详解Linux dd命令用于读取、转换并输出数据。dd可从标准输入或文件中读取数据根据指定的格式来转换数据再输出到文件、设备或标准输出。语法dd OPTION参数1.if文件名输入文件名默认为标准输入。即指定源文件2.of文件名输出文件名默认为标准输出。即指定目的文件# 把一个文件复制成另一个文件 dd ifsource.txt ofbackup.txt 理解如下 if 和 of 是最基本的输入/输出指定这是 dd 最核心的用法从哪读、写到哪。 说明ifsource.txt输入文件是 source.txt从 source.txt 这个文件里读数据即我要复制的东西原来放在 source.txt 里。ofbackup.txt输出文件是 backup.txt把读到的数据写到 backup.txt 这个文件里。合起来看就是从 source.txt 里读数据然后写到 backup.txt 里。 如果不加 bs、count 等参数dd 会一直读到输入结束相当于一个“带转换功能的复制命令”。3. ibsbytes一次读入bytes个字节即指定一个块大小为bytes个字节。obsbytes一次输出bytes个字节即指定一个块大小为bytes个字节。bsbytes同时设置读入/输出的块大小为bytes个字节。# 用 1MB 块大小复制大文件 dd ifbigfile.iso ofcopy.iso bs1M 说明 bs 同时设置读入和输出的块大小。复制大文件时合理设置 bs 可以明显提高速度。 bs1M每次读/写 1MB比默认的 512 字节块大很多通常更快4. cbsbytes一次转换bytes个字节即指定转换缓冲区大小。5. skipblocks从输入文件开头跳过blocks个块后再开始复制。6. seekblocks从输出文件开头跳过blocks个块后再开始复制。# 跳过输入文件前 1MB再复制 1MB 到输出文件 dd ifbigfile.iso ofpart.iso bs1M skip1 count1 解释说明 skip 和 seek跳过输入/输出开头。这两个参数经常一起用来“定位”数据skipblocks从输入文件开头跳过若干块seekblocks从输出文件开头跳过若干块。 skip1跳过输入文件的前 1 块即前 1MB count1只复制 1 块即接下来 1MB 结果part.iso 是原文件第 1MB 到第 2MB 之间的内容 如果要从输出文件的某个位置开始写 dd ifdata.bin ofdisk.img bs1M seek10 convnotrunc 表示从输出文件的第 10MB 位置开始写入且不截断原文件。7. countblocks仅拷贝blocks个块块大小等于ibs指定的字节数。# 只读取文件的前 10MB dd ifbigfile.iso ofhead.iso bs1M count10 解释说明 count 控制“复制多少个块”块大小由 ibs 或 bs 决定。 bs1M每块 1MB count10只复制 10 块 结果head.iso 是原文件的前 10MB 这个用法常用于提取文件头部测试磁盘读写速度只复制一部分数据8.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字符补齐# 把一段数据写入磁盘镜像的指定位置不破坏后面内容 dd ifboot.bin ofdisk.img bs512 seek0 convnotrunc 解释说明 默认情况下dd 写入输出文件时可能截断原文件。 convnotrunc 表示不要截断输出文件保留后面原有内容。 ifboot.bin输入引导数据 ofdisk.img输出磁盘镜像 bs512每块 512 字节 seek0从输出文件开头写 convnotrunc不截断 disk.img 这个用法在制作启动盘、修改镜像、写引导扇区时非常常见。 补充理解如何理解引导数据 和 磁盘镜像这两个名词 1. 我们可以把“引导数据”理解成电脑开机时最先要读的一小段程序因为电脑刚开机时操作系统还没启动它需要先读一小段代码这段代码负责告诉电脑去哪里找操作系统怎么把系统启动起来。这段代码就叫 引导程序英文叫 bootloader而 boot.bin 就是一个保存了这段引导程序的文件。所以ifboot.bin 通俗说就是从 boot.bin 这个文件里读取开机引导程序的数据。 2. 可以把“磁盘镜像”理解成一个文件但它模拟的是一整块硬盘。平时硬盘是一个物理设备比如 /dev/sda。但有时候我们不想直接操作真实硬盘而是用一个文件来假装它是一块硬盘。这个“假装成硬盘的文件”就叫 磁盘镜像。比如disk.img 可以像硬盘一样被分区可以往里面写引导程序可以往里面装操作系统可以用虚拟机启动它。所以ofdisk.img 通俗说就是把数据写到 disk.img 这个磁盘镜像文件里 所以合起来完整的意思可以理解为从 boot.bin 里读取引导程序数据把它写到 disk.img 这个磁盘镜像的开头位置而且不截断 disk.img保留后面原有的内容。 该操作的应用场景 1. 制作启动盘若你有一个引导文件 boot.bin你想把它写进一个磁盘镜像 disk.img这样 disk.img 就能被虚拟机或电脑启动 2. 修复引导若硬盘引导坏了可以用 dd 把正确的 boot.bin 写回磁盘开头 3. 制作自定义系统镜像先把引导程序写进去再往里面装系统9. --help显示帮助信息10. --version显示版本信息2. mkfs 命令详解用于在设备上创建Linux文件系统俗称格式化比如我们使用U盘的时候可以格式化。语法mkfs [-V] [-t fstype] [fs-options] filesys [blocks]参数-t fstype指定要建立何种文件系统如 ext3ext4 filesys 指定要创建的文件系统对应的设备文件名 blocks指定文件系统的磁盘块数。 -V : 详细显示模式 fs-options:传递给具体的文件系统的参数实例# 语法mkfs -t fstype filesys #实例把 /dev/sdb1 格式化成 ext4 文件系统。 mkfs -t ext4 /dev/sdb1 # -t ext4指定文件系统类型为 ext4 # /dev/sdb1要格式化的设备 #将 sda6 分区格式化为 ext4 格式 mkfs -t ext4 /dev/sda6 # 显示详细过程 mkfs -V -t ext4 /dev/sda6 #格式化镜像文件为 ext4 mkfs -t ext4 ./fdimage.img #综合实例 mkfs -V -t ext4 -L mydata /dev/sdb1 102400 # 综合实例解释说明 mkfs 创建文件系统 -V 显示详细过程 -t ext4 指定文件系统类型为 ext4 -L mydata 设置卷标为 mydata这是传给 mkfs.ext4 的选项 /dev/sdb1 要格式化的设备文件名 102400 指定文件系统使用的磁盘块数 通俗理解把 /dev/sdb1 格式化成 ext4卷标设为 mydata使用 102400 个块并显示详细过程。如何理解 fs-options 的存在 fs-options 可以理解成mkfs 只是个“总调度”真正干活的另有其人。我们写的 fs-options其实是传给那个“真正干活的工具”的。 1. 先理解mkfs 不是一个人在战斗 当我们执行mkfs -t ext4 /dev/sdb1 看起来是 mkfs 在格式化但实际上mkfs 只是根据 -t ext4去调用 mkfs.ext4 这个具体工具 类似这样 mkfs -t ext4 /dev/sdb1 ↓ 实际执行的是 mkfs.ext4 /dev/sdb1 再比如 命令 实际调用的工具 mkfs -t ext4 ... mkfs.ext4 mkfs -t ext3 ... mkfs.ext3 mkfs -t xfs ... mkfs.xfs mkfs -t vfat ... mkfs.vfat 所以mkfs 就像一个“前台接待员”它根据你说要哪种文件系统把你领到对应的“专业师傅”那里。而 fs-options 就是你专门说给那个“专业师傅”听的参数。 2. 为什么要有 fs-options 因为不同的文件系统参数不一样。 比如 ext4 有 -L 设置卷标有 -b 设置块大小有 -N 设置 inode 数量 xfs 有 -f 强制格式化 有 -m 设置元数据相关参数 这些参数不是 mkfs 本身的而是各个文件系统工具自己的。所以mkfs 本身不认识这些参数它只是原样转发给对应的工具 3. 用实例理解 # 设置卷标 -L mkfs -t ext4 -L mydata /dev/sdb1 这里-t ext4告诉 mkfs 用 ext4-L mydata这是 fs-options传给 mkfs.ext4/dev/sdb1设备名。通俗理解mkfs 把 -L mydata 这个要求转交给 mkfs.ext4 去执行。 # 设置块大小 -b mkfs -t ext4 -b 4096 /dev/sdb1 这里 -b 4096是 fs-options传给 mkfs.ext4意思是块大小为 4096 字节。通俗理解告诉 ext4 的专业工具块大小设成 4KB。 # 设置 inode 数量 -N mkfs -t ext4 -N 100000 /dev/sdb1 通俗理解告诉 ext4 的专业工具inode 数量设成 100000。 # XFS 的强制格式化 -f mkfs -t xfs -f /dev/sdb1 这里-f是 fs-options意思是强制格式化即使已有文件系统。通俗理解告诉 XFS 的专业工具别管上面有没有旧文件系统直接强制格式化。3. df 命令详解Linux df英文全拼disk free 命令用于显示目前在Linux系统上的文件系统磁盘使用情况统计。语法df [OPTION]... [FILE]...常见参数-a, --all包含所有的具有0 Blocks的文件系统-h, --human-readable使用人类可读的格式(预设值是不加这个选项的...)-H, --si很像-h,但是用1000为单位而不是用1024-t, --typeTYPE限制列出文件系统的TYPE-T, --print-type显示文件系统的形式#查看磁盘使用情况 df -h #查看磁盘的系统类型 df -Th4. mount 命令详解mount命令用于加载文件系统到指定的加载点。此命令的也常用于挂载光盘使我们可以访问光盘中的数据因为你将光盘插入光驱中Linux并不会自动挂载必须使用 Linux mount 命令来手动完成挂载。Linux系统下不同目录可以挂载不同分区和磁盘设备它的目录和磁盘分区是分离的可以自由组合(通过挂载)不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。挂载的实质是为磁盘添加入口挂载点。mount常见用法mount [-l] mount [-t vfstype] [-o options] device dir 注[-o options] 为指定挂载选项如 rw、ro、noexecmount [-l] 的用法 # 1. 最基础用法直接 mount mount 说明不带任何参数列出当前系统所有已挂载的文件系统 输出类似 /dev/sda1 on / type ext4 (rw,relatime) tmpfs on /run type tmpfs (rw,nosuid,noexec) /dev/sdb1 on /data type xfs (rw,relatime) # 2. mount -l显示带卷标的挂载信息 -llist显示挂载信息时额外显示卷标。卷标就是给文件系统起的名字比如 mydata 输出类似 /dev/sda1 on / type ext4 (rw,relatime) /dev/sdb1 on /data type xfs (rw,relatime) [mydata] 注意最后的 [mydata]这就是卷标说明 /dev/sdb1 的卷标叫 mydata。常见参数1.-l显示已加载的文件系统列表2. -t:加载文件系统类型支持常见系统类型的ext3,ext4,iso9660,tmpfs,xfs等,大部分情况可以不指定mount可以自己识别3. -o options主要用来描述设备或档案的挂接方式loop用来把一个文件当成硬盘分区挂接上系统ro采用只读方式挂接设备rw采用读写方式挂接设备4.device:要挂接(mount)的设备。5.dir:挂载点的目录案例#将 /dev/hda1 挂在 /mnt 之下。 mount /dev/hda1 /mnt #将镜像挂载到/mnt/testext4 下面,需要确保挂载点也就是目录存在 mkdir -p /mnt/testext4 mount ./fdimage.img /mnt/testext4 # 只读挂载 -o ro mount -o ro /dev/sdb1 /mnt 说明-o roread-only只读挂载挂载后只能读不能写。可通俗理解为把 /dev/sdb1 挂到 /mnt但只能看不能改。适合修复数据时防止误写或挂载可能有问题的磁盘等场景 # 同时指定类型和选项 mount -t ext4 -o rw,noexec /dev/sdb1 /mnt 说明-o rw,noexec可读写但不允许执行里面的程序。通俗理解把 /dev/sdb1 按 ext4 挂到 /mnt可以读写但不让执行里面的程序。noexec 常用于安全考虑比如挂载 U 盘时防止运行恶意程序。 # 挂载 ISO 镜像文件 mount -t iso9660 -o loop disk.iso /mnt/iso 说明-t iso9660ISO 光盘镜像的文件系统类型-o loop把普通文件当作块设备来挂载disk.isoISO 文件/mnt/iso挂载点。通俗理解把 disk.img 这个磁盘镜像挂到 /mnt/img然后就能进去看里面的文件。5. 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-proc 执行子进程前将 proc 优先挂载过去案例#hostname 隔离 root139-159-150-152:~# unshare -u /bin/bash root139-159-150-152:~# hostname test1 root139-159-150-152:~# hostname test1 root139-159-150-152:~# exit exit root139-159-150-152:~# hostname 139-159-150-152 root139-159-150-152:6. 实战操作一PID隔离1.在主机上执行ps -ef,可以看到进程列表如下其中启动进程PID 1为init进程2.我们打开另外一个shell执行下面命令创建一个bash进程并且新建一个 PIDNamespace--fork新建了一个bash进程是因为如果不建新进程新的namespace会用 unshare的PID作为新的空间的父进程而这个unshare进程并不在新的namespace 中所以会报个错Cannot allocate memory--pid表示我们的进程隔离的是pid而其他命名空间没有隔离mount-proc是因为Linux下的每个进程都有一个对应的/proc/PID 目录该目录包含了大量的有关当前进程的信息。 对一个PID namespace而言/proc 目录只包含当前namespace和它所有子孙后代namespace里的进程的信息。创建一个新的 PID namespace后如果想让子进程中的top、ps等依赖/proc 文件系统的命令工作还需要挂载/proc文件系统。而文件系统隔离是mount namespace管理的所以 linux特意提供了一个选项--mount-proc 来解决这个问题。如果不带这个我们看到的进程还是系统的进程信息。unshare --fork --pid --mount-proc /bin/bash3.执行ps -ef 查看进程信息我们可以看到此时进程空间内的内容已经变了而且启动进程也变成了我们的bash 进程。说明我们已经看不到主机上的进程空间了我们的进程空间发生了隔离。4.执行exit退出进程exit7. 实战操作二Mount隔离1.打开第一个shell窗口A执行命令df -h ,查看主机默认命名空间的磁盘挂载情况root139-159-150-152:~# df -h Filesystem Size Used Avail Use% Mounted on udev 948M 0 948M 0% /dev tmpfs 199M 1.1M 198M 1% /run /dev/vda1 40G 8.0G 30G 22% / tmpfs 992M 0 992M 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 992M 0 992M 0% /sys/fs/cgroup tmpfs 199M 0 199M 0% /run/user/0 /dev/loop0 50M 50M 0 100% /snap/snapd/18357 /dev/loop1 56M 56M 0 100% /snap/core18/2697 /dev/loop2 55M 55M 0 100% /snap/erlang/101 /dev/loop3 56M 56M 0 100% /snap/core18/27082.打开一个新的shell窗口B执行Mount隔离命令# --mount 表示我们要隔离 Mount 命名空间了 # --fork 表示新建进程 unshare --mount --fork /bin/bash mkdir -p /data/tmpmount3.在窗口B中添加新的磁盘挂载dd if/dev/zero offdimage.img bs8k count10240 mkfs -t ext4 ./fdimage.img mount ./fdimage.img /data/tmpmount4.在窗口B挂载的磁盘中添加文件echo Hello world! /data/tmpmount/hello.txt5.查看窗口B中的磁盘挂载信息root139-159-150-152:/data/maxhou/mounttest# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G 23G 15G 61% / udev 948M 0 948M 0% /dev tmpfs 992M 0 992M 0% /dev/shm tmpfs 199M 2.4M 196M 2% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 199M 8.0K 199M 1% /run/user/1000 tmpfs 199M 0 199M 0% /run/user/1002 tmpfs 199M 0 199M 0% /run/user/1001 tmpfs 199M 0 199M 0% /run/user/0 tmpfs 992M 0 992M 0% /sys/fs/cgroup /dev/loop2 55M 55M 0 100% /snap/erlang/101 /dev/loop4 56M 56M 0 100% /snap/core18/2714 overlay 40G 23G 15G 61% /data/myworkdir/fs/merged /dev/loop1 50M 50M 0 100% /snap/snapd/18596 /dev/loop5 56M 56M 0 100% /snap/core18/2721 /dev/loop3 54M 54M 0 100% /snap/snapd/18933 overlay 40G 23G 15G 61% /data/var/lib/docker/overlay2/922af407c456f95d898fea95ca148b30607b 20ff6c3e7c3ff1b61cff3fae4cfd/merged overlay 40G 23G 15G 61% /data/var/lib/docker/overlay2/e0783839b4cf83c86574efa690a8d7f0ee3a b56cfc58932f61b7259a29169f2d/merged ...6.查看窗口A中的磁盘挂载信息root139-159-150-152:/data/tmpmount# df -h7.查看窗口B中的文件信息root139-159-150-152:~# ll /data/tmpmount/ total 8 drwxrwxrwt 2 root root 60 Mar 11 18:13 ./ drwx--x--x 4 root root 4096 Mar 11 17:59 ../ -rw-r--r-- 1 root root 13 Mar 11 18:13 hello.txt root139-159-150-152:~# cat /data/tmpfs/hello.txt Hello world!8.查看窗口A中的文件信息可以看到窗口B 中新建的文件和磁盘挂载在主机的窗口中并没有说明我们实现了文件系统隔离。root139-159-150-152:/data/tmpfs# ll /data/tmpmount total 8 drwxr-xr-x 2 root root 4096 Mar 11 17:59 ./ drwx--x--x 4 root root 4096 Mar 11 17:59 ../ root139-159-150-152:/data/tmpfs# cat /data/tmpmount/hello.txt cat: /data/tmpfs/hello.txt: No such file or directory9.窗口B执行exit退出exit
RELATED

相关推荐

Java多线程八股文:核心知识点与高频面试题解析

Java多线程八股文:核心知识点与高频面试题解析

1. 线程与进程的基本概念进程是操作系统进行资源分配和调度的基本单位,拥有独立的地址空间;线程是进程内的执行单元,共享进程的堆和方法区,但每个线程拥有独立的虚拟机栈和程序计数器。Java 中创建线程主要有三种方式:…

📅 2026/10/21 2:25:45
OpenHarmony上Flutter勋章模块实战:从数据模型到多机型适配

OpenHarmony上Flutter勋章模块实战:从数据模型到多机型适配

社团管理App在OpenHarmony设备上正式上线前,最让我头疼的不是登录、不是通讯录,而是这个看起来人畜无害的荣誉勋章模块。项目需求文档里只有一句话——"给表现积极的同学发个勋章"。我当时天真地以为这就是画个圆形图标、存个发放记录&#xf…

📅 2026/10/21 2:25:45
海康工业相机C++二次开发实战:从Demo到产线级上位机集成

海康工业相机C++二次开发实战:从Demo到产线级上位机集成

简介:这份资源是海康工业相机SDK的C版Demo源代码,面向机器视觉工程师与C开发者,帮助其快速理解并调用海康相机API,完成图像采集、参数配置与设备控制。Demo基于Qt构建简洁界面,可实时显示相机画面,并通过按…

📅 2026/10/21 2:25:44
MORE NEWS

更多资讯

📰

NVFP4:让大模型从零预训练跑在4位浮点上

训练大模型最怕的从来不是模型推不动,而是显存和带宽在物理上先投降。我最近读了一篇硬核的预训练论文,标题是“Pretraining Large Language Models with NVFP4”,核心就一句话:让大语言模型从零预训练阶段,前向、反向…

📰

MX Linux 25.1双Init并存:SysVinit与systemd自由切换

一提到“你的发行版到底该用哪套init”,Linux社区的讨论经常就变成立场之争。systemd派觉得日志、依赖、资源控制统统内置才是现代系统该有的样子;传统派则认为一个脚本一个脚本顺序执行、每步都可预期的SysVinit才叫优雅。大多数发行版早就不纠结这个问…

📰

SheerID-Verification-Tool部署指南:从本地到生产环境的无缝迁移

SheerID-Verification-Tool部署指南:从本地到生产环境的无缝迁移 SheerID-Verification-Tool是一款轻量级工具,专为集成和测试SheerID验证工作流设计,能简化API请求、处理响应并支持学生等项目的资格检查。本指南将帮助你实现从本地开发到生…

📰

NVFP4预训练大模型:从量化训练到部署的全面解析

最近把这篇《Pretraining Large Language Models with NVFP4》翻来覆去读了几遍,越读越觉得它不只是“又一篇4位精度论文”,更像是给整个量化生态指了一个新方向。过去大家默认FP4只能做推理阶段的压缩,谁在预训练里碰4位精度,谁就…

📰

统一API架构下GPT-5.2与DeepSeek-V3.2模型选型与路由降级实战

最近在做模型网关项目时,我需要在同一个系统里同时接入GPT-5.2和DeepSeek-V3.2。如果你也正在搞Agent应用、企业内部知识库或者面向C端的智能助手,大概率会和我遇到同一类麻烦:模型各有各的强项,但应用层总不能为每一个模型单独写…

📰

AI驱动流程自动化实战:架构师视角的拆解与落地要点

这两年我听到最多的一个词就是“AI驱动流程自动化”,不少做架构的朋友都在琢磨怎么靠它往上走一档。作为AI应用架构师,很多人觉得我们干的就是接几个大模型接口、写点提示词,但真正深入做过端到端自动化的人才会明白,这套东西的难…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬