This is a cache of https://blog.csdn.net/2401_82648291/article/details/150558511. It is a snapshot of the page as it appeared on 2025-08-24T04:18:31.313+0200.
从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路-CSDN博客

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

本篇摘要

本文围绕虚拟化与容器化技术展开,涵盖架构演进、Docker/K8S优势与挑战、namespace隔离实操(如主机名/PID隔离)、磁盘操作(dd/mkfs/df/mount)等,对比虚拟机与容器差异,阐明技术原理与架构选择逻辑,强调资源隔离与弹性伸缩的核心价值。

在这里插入图片描述

欢迎拜访: 点击进入博主主页

本篇主题: Docker演进+namespace操作详解

制作日期: 2025.08.22

隶属专栏: 点击进入所属Docker专栏

一.技术架构

由于这里过多与对redis之前的演进相似就不重复了如,见 点击速看架构演进,只不过这里多了个容器编排架构。

容器编排架构:

问题背景

  • 业务增长带来系统资源利用率不高的问题,大量资源用于应对短时高并发,平时闲置,需动态扩缩容但难以直接下线服务器。

  • 开发、测试、生产每套环境都需隔离,导致运维工作量大。

  • ​​部署与配置复杂且易错​​:微服务拆分细,导致部署工作量大,配置复杂,容易出错。

  • ​​扩缩容麻烦且易错​​:微服务数量多,扩缩容操作麻烦且容易出错,每次操作后可能需要重新配置环境参数。

  • ​​环境冲突与资源消耗​​:微服务间运行环境可能冲突,需要更多资源或修改配置来解决。

容器化技术及工具

  • 目前最流行的容器化技术是Docker,最流行的容器管理服务是Kubernetes(K8S)。
  • 应用/服务可打包为Docker镜像,通过K8S动态分发和部署镜像。
  • Docker镜像可理解为能运行应用/服务的最小操作系统,包含运行代码及设置好的运行环境。打包成镜像后可分发到相关机器,直接启动镜像即可运行服务,简化部署和运维。

K8S集群情况

  • 通常设有生产和研发K8S集群,一般不共用。
  • 研发集群通过命名空间完成应用隔离。
  • 不同公司划分集群方式不同,有的按研发目的分为研发和测试集群,有的按组织架构实现部门间资源复用 。

通过docker技术,直接降低了对应运维人员的苦恼,但是也增加了对应服务器的负担,于是就引入了云服务器购买等方案。

一张图形象理解docker技术:

在这里插入图片描述

如果我们把docker技术添加过去,发现它就就成了这样:

在这里插入图片描述

对应操作流程:
在这里插入图片描述

  • 发现和之前的微服务相比没多大变化,其实真正变化在的就是降低了运维难度,对环境的部署,复用,转移变得轻松了,但是需要的知识储备量就高了。

对应优缺点:

1.​​优点​​

  • ​​部署运维高效​​:部署、运维简单快速,一条命令可完成大量服务的部署或扩缩容。

  • ​​隔离性好​​:容器间文件系统、网络等互相隔离,避免环境冲突。

  • ​​支持滚动更新​​:版本切换可通过命令轻松完成升级或回滚。

2.​​缺点​​

  • 技术门槛高​​:技术栈多样,对研发团队要求较高。

  • ​​资源与成本问题​​:机器仍需公司自行管理,非高峰期也需预留大量机器资源应对高峰,导致机器成本和运维成本高,资源利用率低。(解决方案:可考虑使用云厂商服务器)

因此可以的出对应的技术构架演进图(由服务器到云服务器):

在这里插入图片描述

对应这些可能会有些疑问:

1. 如何决策要不要演进?

  • 业务需求:业务增长快、模式变化大时需演进架构。
  • 技术瓶颈:现有系统性能差、技术债务高时考虑演进。
  • 团队能力:团队有技术储备且能提升效率时可推进演进。

2. 架构必须这么演进么?

  • 非唯一解:有多种演进方案可选,非固定模式。
  • 成本考量:若优化成本低,可暂不大规模演进。
  • 创新可能:可探索新思路,不局限传统方向。

3. 架构必须是这么几个么?

  • 业务适配:不同业务需定制架构,无固定模式。
  • 技术多元:新兴技术带来更多架构选择。
  • 灵活组合:可创新组合多种技术形成独特架构。

4. Docker 的核心作用?

  • 环境一致:打包应用及依赖,保证多环境运行一致。
  • 资源隔离:容器独立运行,避免相互干扰。
  • 快速部署:提升应用部署和迁移效率。

虚拟化+容器化

  1. 物理机:实际的服务器或计算机,为虚拟机提供硬件环境,也叫“寄主”或“宿主”。
  2. 虚拟化:利用虚拟化技术把一台计算机虚拟为多台逻辑计算机,这些逻辑计算机可运行不同操作系统,应用程序在独立空间运行互不影响,提升工作效率。
  3. 容器化
    • 属于虚拟化技术,即操作系统层虚拟化。
    • 将操作系统内核虚拟化,把用户空间软件实例分割成多个独立单元在内核中运行。
    • 这些软件实例就是容器,对使用者而言像专用服务器程序。
    • 容器技术是虚拟化的一种,Docker是现今容器技术的事实标准。

如图:

在这里插入图片描述

  • 容器A与B内部看不到,但是又共用同一个操纵系统的内核。

那么为什么要进行容器化与虚拟化:

  • 让利用唯一资源完成更多任务。
  • 通过类似docker技术打包容器化,保证不会出现机器变化等导致的问题出现异常。
  • 弹性资源伸缩:可以随时操作简单的增多与减少。
  • 差异化环境提供:即随时轻松切换环境(如ubuntu centos)
  • docker容器化后启动极快,无需虚拟内核。
  • 沙箱安全:每个容器自己在自己的范围操作,不会影响外部。
  • 易拓展:拓展镜像,拓展功能非常轻松。

虚拟机与容器

在这里插入图片描述

  1. 虚拟机(Virtual Machine, VM)

    • 层级:硬件层与操作系统层之间。
    • 原理:模拟完整硬件接口,运行独立操作系统(如Windows上运行Android系统)。
    • 特点:功能完整但资源占用高,适合跨平台环境隔离。
  2. 容器(Container)

    • 层级:操作系统层与函数库层之间。
    • 原理:模拟操作系统接口(如Docker利用Namespace/Cgroup),隔离应用及依赖。
    • 特点:轻量(共享宿主机内核)、启动快、资源占用少,属应用级虚拟化。

如何实现?

虚拟机:

在这里插入图片描述

  1. Type 1 Hypervisor(裸机虚拟化)

    • 架构:直接运行在物理硬件(HARDWARE)上,无宿主操作系统。
    • 特点:高性能、低延迟,直接管理硬件资源。
    • 典型代表:Xen、VMware ESXi。
  2. Type 2 Hypervisor(托管虚拟化)

    • 架构:运行在宿主操作系统(HOST OS)之上,依赖宿主OS管理硬件。
    • 特点:部署灵活,但性能略低(需经过宿主OS层)。
    • 典型代表:VirtualBox、VMware Workstation。
  3. 核心区别

    • Type 1:硬件→Hypervisor→Guest OS(高效,适合企业级)。
    • Type 2:硬件→Host OS→Hypervisor→Guest OS(易用,适合开发/测试)。

容器化:

  • 容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过 namespace 进行各程序的隔离,加上 cgroups 进行资源的控制,以此来进行虚拟化。

二.空间命名隔离(namespace)

dd命令

  • 全称:Data Description 。
  • 作用:是一个在 Unix 和类 Unix 系统(如 linux)上用于复制和转换文件的命令。它可以对磁盘、分区等进行低级别的操作,比如制作磁盘镜像、从镜像恢复数据、创建空文件等。例如,使用 dd if=/dev/zero of=test.img bs=1M count=100 可以创建一个大小为100MB的全零文件 test.img ,这里 if 表示输入文件(/dev/zero 是一个特殊的设备文件,会不断输出空),of 表示输出文件,bs 指定块大小,count 指定块的数量。

如下:

在这里插入图片描述

  • 无法查看以为全0,不可打印,故出现卡死假象。

dd 命令核心参数速查表

类别参数作用示例
基础操作if=file输入文件(默认标准输入)if=/dev/zero
of=file输出文件(默认标准输出)of=test.img
bs=size块大小(输入/输出统一,如 1Mbs=1M
count=n复制 n 个块count=100
skip=n跳过输入文件前 nskip=5(跳过前 5MB)
seek=n跳过输出文件前 nseek=5(跳过输出前 5MB)
转换选项conv=ascii转换 EBCDIC → ASCIIconv=ascii
conv=ebcdic转换 ASCII → EBCDICconv=ebcdic
conv=lcase小写转大写conv=lcase
conv=ucase大写转小写conv=ucase
conv=swab交换每对字节(AB→BA)conv=swab
conv=noerror出错时继续执行conv=noerror
conv=sync出错时用零填充对齐块conv=sync
状态控制status=none隐藏所有输出(静默模式)status=none
status=progress显示实时进度(需新版 ddstatus=progress

mkfs命令

  • 全称:Make File System 。
  • 作用:用于在指定设备(如硬盘分区)上创建文件系统。它是一个前端工具,会根据不同的参数调用具体的文件系统创建工具(如 mkfs.ext4 用于创建 ext4 文件系统,mkfs.xfs 用于创建 XFS 文件系统等)。例如,mkfs.ext4 /dev/sda1 会在 /dev/sda1 这个分区上创建 ext4 文件系统(可以理解成一个磁盘)

进行格式化(文件必须有大小可用dd命令):

在这里插入图片描述
检查下:

在这里插入图片描述

df命令

  • 全称:Disk Free 。
  • 作用:用于显示文件系统的磁盘空间使用情况,包括已用空间、可用空间、总空间以及挂载点等信息 。例如,执行 df -h-h 选项以人类可读的格式显示容量,如 KB、MB、GB 等)可以清晰地看到各个文件系统的磁盘空间使用概况。
    这张图片是关于 Shell 命令 df 的说明文档,主要内容如下:
1. 命令基本格式

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

2. 常见参数
  • -a, --all:包含所有的具有 0 Blocks 的文件系统
  • -h, --human-readable:使用人类可读的格式(预设值是不加这个选项的…)
  • -H, --si:很像 -h,但是用 1000 为单位而不是用 1024
  • -t, --type=TYPE:限制列出文件系统的 TYPE
  • -T, --print-type:显示文件系统的形式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

mount命令

  • 全称:Mount 。
  • 作用:用于将存储设备(如硬盘分区、光盘、U盘等)或文件系统挂载到 linux 文件系统的目录树中的某个挂载点上,使得用户可以访问设备中的数据。例如,mount ./test.img 会将 ./test.img 这个 USB 设备分区挂载到 mounttest 目录下,之后就可以通过访问 mounttest 来读写该设备中的内容。
命令基本格式
  • mount [-l]
  • mount [-t vfstype] [-o options] device dir
常见参数说明
  1. -l:显示已加载的文件系统列表。
  2. -t:指定加载的文件系统类型(如ext3、ext4、iso9660、tmpfs、xfs等),多数情况下可不指定,mount会自动识别。
  3. -o options:用于描述设备或文件的挂接方式,常见选项有:
    • loop:将文件当作硬盘分区挂接。
    • ro:以只读方式挂接设备。
    • rw:以读写方式挂接设备。

此外,还对device(要挂接的设备)和dir(挂载点目录)进行了简要说明。

用法:

这里之前使用了mkfs命令把对应有内容大小的文件然后格式化成对应文件系统(磁盘),因为linux对应的磁盘需要挂载才能使用,不像windows自己回挂载:

在这里插入图片描述

后面把它挂载到一个比如目录,接下就能访问这个目录实现对对应磁盘操作(进行挂载的磁盘或文件系统需要有大小)。

在这里插入图片描述

成功被挂载,然后进行使用:

在这里插入图片描述

unshare命令

  • 全称:Unshare 。
  • 作用:用于创建新的命名空间(namespace),并使当前进程及其子进程脱离原来的命名空间相关资源。命名空间是 linux 内核提供的一种隔离机制,可以隔离进程、网络、文件系统挂载等资源。比如,unshare --mount --map-root-user --pid --fork --mount-proc /bin/bash 可以创建一个新的挂载命名空间、新的 PID 命名空间等,并以根用户权限启动一个新的 bash shell 环境,在这个新环境中可以独立地进行文件系统挂载等操作,与原系统的资源相互隔离 。
核心功能

unshare 允许你在新的命名空间中运行程序,使得该程序在文件系统挂载、网络、进程 ID、主机名/域名、IPC(进程间通信)等层面与原系统环境“隔离”,常用于容器化、沙箱测试或资源隔离场景。

常用参数及功能
参数(短选项 + 长选项)核心作用
-i, --ipc启动新进程时,不与父进程共享 IPC 命名空间(即信号量、消息队列、共享内存等 IPC 资源相互隔离)。
-m, --mount启动新进程时,不与父进程共享 Mount 命名空间(文件系统挂载点彼此独立,可挂载/卸载而不影响原系统)。
-n, --net启动新进程时,不与父进程共享 Net 命名空间(网络设备、协议栈、端口等完全隔离,可配置独立网络环境)。
-p, --pid启动新进程时,不与父进程共享 PID 命名空间(新进程在自己的 PID 空间里,能看到“从 1 开始”的进程树)。
-u, --uts启动新进程时,不与父进程共享 UTS 命名空间(主机名、域名可独立设置,互不影响)。
-U, --user启动新进程时,不与父进程共享 User 命名空间(用户/用户组 ID 可以重新映射,实现权限隔离)。
-V, --version查看 unshare 命令自身的版本信息。
--forkunshare 先 fork 一个子进程,再在子进程里执行后续要运行的程序(常配合命名空间使用,规范进程层级)。
--mount-proc在进入新 Mount 命名空间后,自动挂载 proc 文件系统(让新进程能看到“自己视角”的 /proc,方便调试与管理)。
主机名隔离:

在这里插入图片描述

再开一台机器发现名字名字实现了隔离:

在这里插入图片描述

基于pid的隔离测试:

直接隔离:

在这里插入图片描述

因为新进程是重新创建的,和父进程无任何关系,自然不能干别的事。

需要--fork,然它继承一下父进程:

在这里插入图片描述

这里查看pid信息:ls /proc:

在这里插入图片描述
发现还能看到之前父进程的,这里因此需要进行重新挂载(--mount-proc)一下子进程的proc文件系统(也就是让它有个全新的):

在这里插入图片描述

  • exit退出当前环境。

在这里插入图片描述

  • 这里发现只有我们启动的那俩进程pid了。

在这里插入图片描述

  • 但是新开一个机器就不一样,成功隔离。

基于mount隔离测试:

首先先取消之前挂载的文件系统:

umount 被挂载目录

但是发现:
在这里插入图片描述

说明有进程还在访问,这里直接强行关闭:

umount -l 被挂载目录

在这里插入图片描述

  • 关闭成功。

然后进行挂载隔离发现:

在这里插入图片描述

  • 因为刚取消了这个目录对应挂载,结构发生变化,故需要退出重新执行unshare就行了:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 上面被隔离的子进程机器发现成功挂载,但是宿主机看不到,成功实现挂载隔离。

三.本篇小结

通过实践学习了虚拟化与容器化技术,用dd、mkfs等命令操作磁盘,理解了namespace隔离(如主机名、PID隔离)的原理;掌握了Docker/Kubernetes解决资源利用率低、环境冲突等问题的优势,也认识到其技术门槛与成本挑战,更清晰把握了从物理机到云服务器的架构演进逻辑。

<think>我们正在处理一个关于执行mkfs.ext4命令时出现符号查找错误的问题。错误信息是"undefined symbol: test_io_manager"。 这个错误通常发生在动态链接库中,当程序尝试调用一个函数(符号)但在链接的共享库中找不到该函数时发生。 具体来说,mkfs.ext4是e2fsprogs工具包的一部分,它依赖于libext2fs等库。错误提示的test_io_manager可能是libext2fs中的一个函数。 可能的原因: 1. 系统上安装的e2fsprogs版本与当前加载的libext2fs库版本不兼容。可能是由于部分升级或混合安装了不同来源的软件包。 2. 库文件损坏或路径配置问题,导致程序加载了错误版本的库。 解决步骤: 1. 确认e2fsprogs的安装版本: 可以通过以下命令查看安装的e2fsprogs版本: $ dpkg -l e2fsprogs # 对于Debian/Ubuntu 或 $ rpm -q e2fsprogs # 对于CentOS/RHEL 2. 检查libext2fs的版本: 找到libext2fs库的位置,并检查其版本: $ find /usr/lib* /lib* -name 'libext2fs.so*' -exec ls -l {} \; 然后使用ldd命令查看mkfs.ext4链接的库: $ ldd $(which mkfs.ext4) 3. 重新安装e2fsprogs: 如果版本不一致,尝试重新安装e2fsprogs来确保所有组件都是同一版本。 Debian/Ubuntu: $ sudo apt-get install --reinstall e2fsprogs CentOS/RHEL: $ sudo yum reinstall e2fsprogs 4. 更新系统: 确保系统所有软件包都是最新的,以避免版本冲突。 5. 手动指定库路径(临时): 如果问题仍然存在,可以尝试临时设置LD_LIBRARY_PATH环境变量指向正确的库路径: $ export LD_LIBRARY_PATH=/path/to/correct/lib:$LD_LIBRARY_PATH $ mkfs.ext4 ... 6. 检查是否有多个版本的库: 如果系统中存在多个版本的libext2fs,可能需要移除冲突的版本或更新链接(使用ldconfig)。 7. 报告bug: 如果以上方法都不能解决问题,可能是遇到了软件包本身的bug,可以向发行版护者报告。 注意:在执行文件系统操作之前,请确保备份重要数据。 参考:这个错误在类似情况下可能由于库的不匹配导致[^1]。 相关问题: 1. 如何检查linux系统中动态链接库的版本? 2. 如何解决linux中的动态链接库冲突? 3. 如何更新e2fsprogs到最新版本?</think>### 符号查找错误:mkfs.ext4 中未定义符号 test_io_manager #### 错误原因分析 当执行 `mkfs.ext4` 命令时出现 `symbol lookup error: undefined symbol: test_io_manager` 错误,通常与 **e2fsprogs 工具包**的库文件损坏或版本冲突有关: 1. **动态链接库问题** `test_io_manager` 是 `libext2fs` 库中的函数符号。该错误表明: - 系统加载的 `libext2fs.so` 版本与 `mkfs.ext4` 二进制文件不兼容 - 库文件可能因部分升级或安装中断而损坏 2. **版本冲突** 混合安装不同来源的软件包(如源码编译 + 包管理器安装)会导致库文件版本不一致[^1]。 --- #### 解决方案 按顺序执行以下步骤: ##### 1. 重新安装 e2fsprogs 工具包 ```bash # Debian/Ubuntu sudo apt-get install --reinstall e2fsprogs # CentOS/RHEL sudo yum reinstall e2fsprogs # Fedora sudo dnf reinstall e2fsprogs ``` ##### 2. 更新动态链接库缓存 ```bash sudo ldconfig ``` ##### 3. 检查库文件一致性 ```bash # 确认 mkfs.ext4 链接的库版本 ldd $(which mkfs.ext4) | grep libext2fs # 输出示例:应指向统一路径(如 /lib/x86_64-linux-gnu/libext2fs.so.2) ``` ##### 4. 手动修复库路径(若存在多版本) ```bash # 查找所有 libext2fs 文件 sudo find / -name 'libext2fs.so*' 2>/dev/null # 删除冲突的旧版本(谨慎操作!) sudo rm /path/to/old/libext2fs.so* # 重建库链接 sudo ldconfig ``` ##### 5. 验证修复结果 ```bash # 检查符号是否存在 nm -D $(ldd $(which mkfs.ext4) | grep libext2fs | awk '{print $3}') | grep test_io_manager # 正常应输出:T test_io_manager ``` --- #### 预防措施 1. **避免混合安装** 不要同时使用源码编译和包管理器安装 e2fsprogs。 2. **定期更新系统** ```bash sudo apt update && sudo apt upgrade # Debian/Ubuntu sudo yum update # CentOS/RHEL ``` 3. **关键操作前备份** 对磁盘分区操作前,务必备份数据。 > 若问题仍未解决,可能是内核或文件系统模块损坏,建议检查系统日志:`journalctl -xe` 或 `/var/log/syslog`[^2]。 --- ### 相关问题 1. 如何检查 linux 动态链接库的版本兼容性? 2. `ldconfig` 命令在 linux 系统中起什么作用? 3. 文件系统工具 e2fsprogs 包含哪些常用组件? [^1]: 动态链接库版本冲突常见于混合安装场景 [^2]: 系统日志可追踪底层库加载错误
评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羑悻的小杀马特.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值