首页 > 其他分享 >理解 Overlay2 的基本原理和使用方法

理解 Overlay2 的基本原理和使用方法

时间:2025-01-07 20:56:24浏览次数:1  
标签:bin lower 基本原理 文件系统 理解 Overlay2 bash rootfs

1. 介绍 Overlay2 的基本原理

Overlay2 是一种联合文件系统(Union Filesystem),它允许将多个目录(称为层)合并成一个统一的视图。Overlay2 的主要用途是在容器技术中,用于构建容器的文件系统。它的核心思想是通过将多个只读层和一个可写层叠加在一起,形成一个单一的文件系统视图。

Overlay2 的组成

  • Lowerdir(下层目录):只读层,通常包含基础镜像的文件系统。
  • Upperdir(上层目录):可写层,用于存储对文件系统的修改。
  • Workdir(工作目录):用于 Overlay2 内部操作的工作目录。
  • Merged(合并目录):最终呈现的统一视图,用户通过这个目录访问文件系统。

Overlay2 的工作原理

  • 文件读取:当用户访问 merged 目录时,Overlay2 会优先从 upperdir 查找文件。如果文件不存在,则从 lowerdir 查找。
  • 文件写入:当用户修改文件时,Overlay2 会将修改写入 upperdir,而不会影响 lowerdir 的内容。
  • 文件删除:删除文件时,Overlay2 会在 upperdir 中创建一个“白名单”文件,标记该文件已被删除。

2. 介绍 Overlay2 的使用方法

2.1 创建目录结构

首先,创建一个包含 lowerupperworkmerged 的目录结构:

root@compute01:~# mkdir -p rootfs/{lower,upper,work,merged}
root@compute01:~# mkdir -p rootfs/lower/{bin,lib,lib64,proc}

2.2 准备 Lowerdir

lower 目录中放置基础文件系统。例如,复制 bash 及其依赖库:

root@compute01:~# cp /bin/bash rootfs/lower/bin/

查看程序是静态连接还是动态连接:

root@compute01:~# file /bin/bash
/bin/bash: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=7a6408ba82a2d86dd98f1f75ac8edcb695f6fd60, for GNU/Linux 3.2.0, stripped
dynamically linked   动态连接,依赖系统的动态链接库

查看动态链接库的依赖:

root@compute01:~# ldd  /bin/bash 
        linux-vdso.so.1 (0x00007ffec584f000)
        libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f5110bcf000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f51109a6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f5110d6e000)

2.3 使用脚本复制依赖库

创建脚本 create_container_bin.sh,用于检测可执行文件的依赖库,自动移动到对应的目录:

#!/bin/bash
# ./create_container_bin.sh shell命令
# example:./create_container_bin.sh bash

# 检查是否提供了命令参数
if [ -z "$1" ]; then
  echo "Usage: $0 <command>"
  exit 1
fi

# 获取命令的绝对路径
command_path=$(which $1)

# 检查命令是否存在
if [ ! -f "$command_path" ]; then
  echo "Command $1 not found"
  exit 1
fi

# 创建目标目录
lowdir_target_dir="rootfs/lower"
bindir_target_dir="rootfs/lower/bin"
mkdir -p $lowdir_target_dir
mkdir -p $bindir_target_dir

# 获取命令的依赖库并复制到目标目录
ldd $command_path | egrep -o '/lib[^\ ]*' | while read lib; do
  # 检查库文件是否存在,防止某些库文件可能丢失或不存在
  if [ -f "$lib" ]; then
    cp --parents $lib $lowdir_target_dir
  else
    echo "Library $lib not found, skipping."
  fi
done

# 复制命令到rootfs/bin目录
cp $command_path $bindir_target_dir

echo "All dependencies copied to $lowdir_target_dir"
echo "Command $1 copied to $bindir_target_dir"

复制 bash 环境到 rootfs 目录:

root@compute01:~# ./create_container_bin.sh bash
All dependencies copied to rootfs/lower
Command bash copied to rootfs/lower/bin

查看 rootfs/lower 目录结构:

root@compute01:~# tree rootfs/lower/
rootfs/lower/
├── bin
│   ├── bash
│   ├── ls
│   ├── mount
│   ├── ps
│   └── umount
├── lib
│   └── x86_64-linux-gnu
│       ├── libblkid.so.1
│       ├── libc.so.6
│       ├── libcap.so.2
│       ├── libgcrypt.so.20
│       ├── libgpg-error.so.0
│       ├── liblz4.so.1
│       ├── liblzma.so.5
│       ├── libmount.so.1
│       ├── libpcre2-8.so.0
│       ├── libprocps.so.8
│       ├── libselinux.so.1
│       ├── libsystemd.so.0
│       ├── libtinfo.so.6
│       └── libzstd.so.1
└── lib64
    └── ld-linux-x86-64.so.2

4 directories, 20 files

2.4 挂载 Overlay2 文件系统

使用 mount 命令挂载 Overlay2 文件系统:

root@compute01:~# mount -t overlay overlay -o lowerdir=./rootfs/lower,upperdir=./rootfs/upper,workdir=./rootfs/work ./rootfs/merged/

2.5 创建命名空间并切换根文件系统

使用 unshare 创建新的命名空间,并通过 chroot 切换到 merged 目录:

root@compute01:~# unshare --fork --pid --mount  --uts --ipc --net --user --map-root-user chroot rootfs/merged /bin/bash
bash-5.1#

2.6 挂载虚拟文件系统

在新的命名空间中挂载 /proc 文件系统:

bash-5.1# mount -t proc proc /proc

2.7 验证环境

运行 ps 命令查看进程信息,验证环境是否正常工作:

bash-5.1# ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
0              1  0.0  0.0   8160  4240 ?        S    12:14   0:00 /bin/bash
0              8  0.0  0.0   4604  3724 ?        S    12:14   0:00 /bin/bash
0             14  0.0  0.0   7064  2384 ?        R+   12:15   0:00 ps -aux

查看 /proc 目录:

bash-5.1# ls proc/
1           cgroups    dma            interrupts  keys         mdstat   pagetypeinfo  softirqs       timer_list         zoneinfo
13          cmdline    driver         iomem       kmsg         meminfo  partitions    stat           tty
8           consoles   dynamic_debug  ioports     kpagecgroup  misc     pressure      swaps          uptime
acpi        cpuinfo    execdomains    irq         kpagecount   modules  schedstat     sys            version
bootconfig  crypto     fb             kallsyms    kpageflags   mounts   scsi          sysrq-trigger  version_signature
buddyinfo   devices    filesystems    kcore       loadavg      mtrr     self          sysvipc        vmallocinfo
bus         diskstats  fs             key-users   locks        net      slabinfo      thread-self    vmstat

2.8 退出并清理

退出容器环境并卸载 Overlay2 文件系统:

bash-5.1# exit
exit
root@compute01:~# umount /root/rootfs/merged

3. 结合实验过程说明 Overlay2 的使用方法

在实验中,我们通过以下步骤完成了 Overlay2 的使用:

  1. 创建了 rootfs 目录结构,包括 lowerupperworkmerged
  2. 使用 create_container_bin.sh 脚本复制 bash 及其依赖库到 lower 目录。
  3. 挂载 Overlay2 文件系统,将 lowerupper 目录合并到 merged 目录。
  4. 使用 unshare 创建新的命名空间,并通过 chroot 切换到 merged 目录。
  5. 挂载 /proc 文件系统,验证容器环境。
  6. 退出容器并卸载 Overlay2 文件系统。

4. 总结 Overlay2 的优点和缺点

优点

  • 高效的文件系统管理:通过只读层和可写层的分离,减少了文件系统的冗余。
  • 快速启动:容器可以共享基础镜像的只读层,减少了启动时间。
  • 节省存储空间:多个容器可以共享同一个基础镜像,减少了存储开销。

缺点

  • 复杂性:Overlay2 的实现较为复杂,调试和维护需要一定的技术能力。
  • 性能开销:在频繁修改文件的情况下,upperdir 可能会成为性能瓶颈。
  • 依赖底层文件系统:Overlay2 的性能和稳定性依赖于底层文件系统(如 ext4、xfs 等)。

Overlay2 在容器技术中扮演了重要角色,为容器的文件系统管理提供了高效、灵活的解决方案。希望这篇博客能帮助你更好地理解 Overlay2!

标签:bin,lower,基本原理,文件系统,理解,Overlay2,bash,rootfs
From: https://www.cnblogs.com/menkeyi/p/18658360

相关文章

  • 自注意力self-attention理解(qkv计算、代码)
    1.自注意力的个人理解   self-attention中的核心便是qkv的计算,首先是将输入向量分别乘上三个可学习的的矩阵得到Query(查询)、Key(键)、Value(值);再将q和k点乘达到全局建模的作用,将qk结果进行softmax得到Attention分数;最后将Attention和v相乘这个操作我的理解是:可以把Val......
  • Vuex 理解
    1、index.jsimportVuefrom"vue";importVuexfrom"vuex"//使用VuexVue.use(Vuex)//准备actions对象--响应组件中的动作constactions={addOdd(context,value){if(context.state.sum%2){context.commit('ADD',......
  • 对于Lambda表达式的一些理解
    Lambda表达式一、Lambda表达式Lambda表达式的基本语法: [capture](parameters)->return_type{body}capture(捕获列表):定义了哪些外部变量会被捕获并在lambda表达式内部使用。它可以按值或按引用捕获。parameters(参数列表):与普通函数的参数列表相似,定义了传递给l......
  • 如何理解拟合模型之最小二乘法(线性回归)
    一、定义:一种用于拟合模型的数学方法,目标是找到一组模型参数,使得模型的预测值与真实值之间的误差平方和最小。二、核心思想:通过最小化误差,让模型尽可能接近训练数据三、应用场景:在回归分析中,最小二乘法广泛用于寻找数据点的最佳拟合直线或曲线。例如:在线性回归中,最小二乘......
  • 深入理解物联网的运行机制
    引言物联网(IoT)是一种通过网络将设备、传感器和系统连接起来的技术生态系统。通过这些连接,我们可以实现设备之间的数据交换、远程控制和自动化操作。本文将深入探讨物联网的核心运行机制,并通过高级案例和代码示例带领大家了解如何利用现代技术开发复杂的物联网应用。物联网......
  • 使用 WebGL 绘制一个简单的点和原理解析
    使用WebGL绘制一个简单的点,我们需要通过WebGL的管线来进行一系列的步骤。以下是实现的详细步骤和原理解析:WebGL绘制点的基本步骤初始化WebGL上下文首先,我们需要获取WebGL上下文,这样才能进行所有的绘图操作。通常,WebGL上下文是通过<canvas>元素获取的。编......
  • 一篇文章理解字典
    Python3字典详解字典(dict)是Python中的一种内置数据类型,用于存储键值对(key-valuepairs)。它是一个无序、可变且唯一的集合,键必须是不可变类型(如字符串、数字、元组),而值可以是任意类型。1.字典的基本特点无序性:从Python3.7起,字典的插入顺序被保留(即按照插入顺序遍历),......
  • 2025年测试用例管理看这一篇就够了 ----Codes 开源免费、全面的测试管理解决方案
    1、前言Codes是国内首款重新定义SaaS模式的开源项目管理平台,支持云端认证、本地部署、全部功能开放,并且对30人以下团队免费。它通过整合迭代、看板、度量和自动化等功能,简化测试协同工作,使敏捷测试更易于实施。并提供低成本的敏捷测试解决方案,如同步在线离线测试用例、流程......
  • FPGA技术的深度理解
    目录引言FPGA的基本原理结构组成工作原理FPGA的设计流程设计阶段编程阶段实现阶段FPGA的应用领域FPGA编程技巧和示例代码编程技巧示例代码结论引言FPGA(现场可编程门阵列)是一种可编程的集成电路,它允许用户根据自己的需求配置硬件逻辑。与传统的微处理器不同,FPG......
  • unshare 理解 Linux 命名空间
    1.什么是unshare?unshare是Linux中的一个命令,用于在新的命名空间中运行程序。命名空间是Linux内核提供的一种隔离机制,允许进程组拥有独立的系统资源视图,如进程ID、网络、挂载点等。unshare常用于容器技术的底层实现中,帮助创建隔离的环境。2.常见的命名空间类型Linux......