news 2026/10/21 2:25:31

容器虚拟化基础--NameSpace空间隔离详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
容器虚拟化基础--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 if=source.txt of=backup.txt 理解如下: if= 和 of= 是最基本的输入/输出指定,这是 dd 最核心的用法:从哪读、写到哪。 说明:if=source.txt:输入文件是 source.txt(从 source.txt 这个文件里读数据,即我要复制的东西,原来放在 source.txt 里。);of=backup.txt:输出文件是 backup.txt(把读到的数据写到 backup.txt 这个文件里,)。合起来看就是从 source.txt 里读数据,然后写到 backup.txt 里。 如果不加 bs、count 等参数,dd 会一直读到输入结束,相当于一个“带转换功能的复制命令”。

3. ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。

obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。

bs=bytes:同时设置读入/输出的块大小为bytes个字节。

# 用 1MB 块大小复制大文件 dd if=bigfile.iso of=copy.iso bs=1M 说明: bs 同时设置读入和输出的块大小。复制大文件时,合理设置 bs 可以明显提高速度。 bs=1M:每次读/写 1MB,比默认的 512 字节块大很多,通常更快

4. cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。

5. skip=blocks:从输入文件开头跳过blocks个块后再开始复制。

6. seek=blocks:从输出文件开头跳过blocks个块后再开始复制。

# 跳过输入文件前 1MB,再复制 1MB 到输出文件 dd if=bigfile.iso of=part.iso bs=1M skip=1 count=1 解释说明: skip= 和 seek=:跳过输入/输出开头。这两个参数经常一起用来“定位”数据:skip=blocks:从输入文件开头跳过若干块;seek=blocks:从输出文件开头跳过若干块。 skip=1:跳过输入文件的前 1 块,即前 1MB count=1:只复制 1 块,即接下来 1MB 结果:part.iso 是原文件第 1MB 到第 2MB 之间的内容 如果要从输出文件的某个位置开始写: dd if=data.bin of=disk.img bs=1M seek=10 conv=notrunc 表示从输出文件的第 10MB 位置开始写入,且不截断原文件。

7. count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。

# 只读取文件的前 10MB dd if=bigfile.iso of=head.iso bs=1M count=10 解释说明: count 控制“复制多少个块”,块大小由 ibs 或 bs 决定。 bs=1M:每块 1MB count=10:只复制 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 if=boot.bin of=disk.img bs=512 seek=0 conv=notrunc 解释说明: 默认情况下,dd 写入输出文件时可能截断原文件。 conv=notrunc 表示:不要截断输出文件,保留后面原有内容。 if=boot.bin:输入引导数据 of=disk.img:输出磁盘镜像 bs=512:每块 512 字节 seek=0:从输出文件开头写 conv=notrunc:不截断 disk.img 这个用法在制作启动盘、修改镜像、写引导扇区时非常常见。 补充理解:如何理解引导数据 和 磁盘镜像这两个名词 1. 我们可以把“引导数据”理解成:电脑开机时,最先要读的一小段程序,因为电脑刚开机时,操作系统还没启动,它需要先读一小段代码,这段代码负责告诉电脑:去哪里找操作系统,怎么把系统启动起来。这段代码就叫 引导程序,英文叫 bootloader,而 boot.bin 就是一个保存了这段引导程序的文件。所以,if=boot.bin 通俗说就是:从 boot.bin 这个文件里,读取开机引导程序的数据。 2. 可以把“磁盘镜像”理解成:一个文件,但它模拟的是一整块硬盘。平时硬盘是一个物理设备,比如 /dev/sda。但有时候我们不想直接操作真实硬盘,而是用一个文件来假装它是一块硬盘。这个“假装成硬盘的文件”,就叫 磁盘镜像。比如:disk.img 可以像硬盘一样被分区,可以往里面写引导程序,可以往里面装操作系统,可以用虚拟机启动它。所以:of=disk.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:指定要建立何种文件系统;如 ext3,ext4 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, --type=TYPE限制列出文件系统的TYPE

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

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

4. mount 命令详解

mount命令用于加载文件系统到指定的加载点。此命令的也常用于挂载光盘,使我们可以访问光盘中的数据,因为你将光盘插入光驱中,Linux并不会自动挂载,必须使用 Linux mount 命令来手动完成挂载。

Linux系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的,可以自由组合(通过挂载)

不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。

挂载的实质是为磁盘添加入口(挂载点)。

mount常见用法:

mount [-l] mount [-t vfstype] [-o options] device dir 注:[-o options] 为指定挂载选项,如 rw、ro、noexec
mount [-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:显示带卷标的挂载信息 -l:list,显示挂载信息时,额外显示卷标。卷标就是给文件系统起的名字,比如 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 ro:read-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 iso9660:ISO 光盘镜像的文件系统类型;-o loop:把普通文件当作块设备来挂载;disk.iso:ISO 文件;/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 隔离 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:

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/bash

3.执行ps -ef 查看进程信息,我们可以看到此时进程空间内的内容已经变了,而且启动进程也变成了我们的bash 进程。说明我们已经看不到主机上的进程空间了,我们的进程空间发生了隔离。

4.执行exit退出进程

exit

7. 实战操作二(Mount隔离)

1.打开第一个shell窗口A,执行命令,df -h ,查看主机默认命名空间的磁盘挂载情况

root@139-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/2708

2.打开一个新的shell窗口B,执行Mount隔离命令

# --mount 表示我们要隔离 Mount 命名空间了 # --fork 表示新建进程 unshare --mount --fork /bin/bash mkdir -p /data/tmpmount

3.在窗口B中添加新的磁盘挂载

dd if=/dev/zero of=fdimage.img bs=8k count=10240 mkfs -t ext4 ./fdimage.img mount ./fdimage.img /data/tmpmount

4.在窗口B挂载的磁盘中添加文件

echo "Hello world!" > /data/tmpmount/hello.txt

5.查看窗口B中的磁盘挂载信息

root@139-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中的磁盘挂载信息

root@139-159-150-152:/data/tmpmount# df -h

7.查看窗口B中的文件信息

root@139-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 root@139-159-150-152:~# cat /data/tmpfs/hello.txt Hello world!

8.查看窗口A中的文件信息,可以看到窗口B 中新建的文件和磁盘挂载在主机的窗口中并没有,说明我们实现了文件系统隔离。

root@139-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 ../ root@139-159-150-152:/data/tmpfs# cat /data/tmpmount/hello.txt cat: /data/tmpfs/hello.txt: No such file or directory

9.窗口B执行exit,退出

exit
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 2:25:15

微软发布 Sysinternals 重大更新:Autoruns 14.2、ProcDump 12.0、ZoomIt 12.0 等

最近,微软在 5 月 7 日发布了一次重要的 Sysinternals 套件更新,为旗下多款最常用的 Windows 诊断与排障工具带来了新功能,同时扩展了对 Linux 发行版的支持。 本次更新覆盖 Autoruns、ProcDump、ZoomIt、DebugView、NotMyFault、Process Explorer、Process Monitor 以及多…

作者头像 李华
网站建设 2026/10/21 2:24:56

Mac怎么显示桌面歌词?Apple Music和Spotify也能开

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 2:23:23

AI降重润色实操指南:从大白话到学术腔的写作进阶

1. 为什么“大白话”论文总被导师打回&#xff1f;先聊聊学术写作的隐性门槛先说个自己写论文时踩过的坑。某次把文献综述的初稿发给导师&#xff0c;自认为逻辑完整、数据详实&#xff0c;结果反馈意见就一句话&#xff1a;“语言太像聊天记录了&#xff0c;学术味道不足。”当…

作者头像 李华
网站建设 2026/10/21 2:22:56

centos 8 使用 kafka_2.13-4.3.1.tgz 安装kafka

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 2:22:35

旧电脑变身家庭影音服务器:NAS搭建、硬盘挂载与局域网优化全攻略

抱歉&#xff0c;我这边没有收到有效的项目信息。你填写的项目标题、正文、关键词和摘要描述均为空&#xff0c;我无法凭空判断你要写的领域、主题和核心技术点&#xff0c;硬写只会变成一篇泛泛而谈的空文&#xff0c;这既浪费你的时间&#xff0c;也不符合我做内容一贯的标准…

作者头像 李华
网站建设 2026/10/21 2:22:28

CSS(盒子模型)

1.盒子模型1.1组成以及边框设置1.1.1盒子类型&#xff1a;区块盒子&#xff08;块级盒子&#xff09;和行内盒子&#xff08;内联盒子&#xff09;1.1.1盒子类型区块盒子&#xff08;块级盒子&#xff09;和行内盒子&#xff08;内联盒子&#xff09;注意&#xff1a;区块盒子一…

作者头像 李华