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

news/2025/1/7 20:49:09/文章来源:https://www.cnblogs.com/menkeyi/p/18658360

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" ]; thenecho "Usage: $0 <command>"exit 1
fi# 获取命令的绝对路径
command_path=$(which $1)# 检查命令是否存在
if [ ! -f "$command_path" ]; thenecho "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" ]; thencp --parents $lib $lowdir_target_direlseecho "Library $lib not found, skipping."fi
done# 复制命令到rootfs/bin目录
cp $command_path $bindir_target_direcho "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.24 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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865525.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tcp_wrappers模块实现服务访问控制

介绍: 1、对有状态连接的特定服务进行安全检测并实现访问控制,所以只能用于tcp服务 2、判断进程是否接收tcp_wrappers的控制,取决于程序在编译时是否添加了libwrap库 3、类似防火墙的功能,但需要程序支持;对于一些访问控制可简单配置即可实现查询程序是否tcpwrap模块 存放…

linux PAM可插拔认证模块介绍

PAM(Pluggable Authentication Modules ) 介绍 通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开 使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段流程图说明:1、…

大三上加分细则

1、做液压项目 2、恋爱成功 3、通过软考中级

Head First 设计模式(中文版)PDF、EPUB免费下载

《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton,Command、Adapter、…

Java从入门到精通(第6版)PDF、EPUB免费下载

《Java从入门到精通(第6版)(软件开发视频大讲堂)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细讲解了使用Java语言进行程序开发需要掌握的知识。全书分为23章,内容包括初识Java,熟悉Eclipse开发工具,Java语言基础,流程控制,数组,类和对象,继承、多…

rust学习十五.5、引用循环和内存泄露

这个章节主要是为了引出弱引用这个奇怪的概念。 说实在,这个没有什么太好写的,因为内容比较晦涩难懂!在其它语言中,也常常存在所谓循环引用问题,和大部分问题一样,在其它语言中这些基本上都不是问题。但是在rust中,这是一个致命的问题。例如有a,b两个点,a指向b,b指向a…

腾讯云轻量服务器搭建彩虹聚合 DNS 聚合管理系统教程

彩虹聚合 DNS 管理系统具备诸多实用功能,其中包括 SSL 证书申请与自动部署功能,它能够从多个渠道申请 SSL 证书,像 Lets Encrypt 等,并自动将证书部署到各式各样的面板、云服务商以及服务器等环境中,同时还支持 CNAME 代理功能,为域名管理和安全访问提供了有力保障。 一、…

Django 3 Web应用开发实战PDF、EPUB免费下载

以DjangoWeb项目开发为主线,从源码的角度,深入剖析Django3企业级开发技术。适读人群 :适合有一定Python基础的Web开发人员阅读,也可用作培训机构和大中专院校相关专业的教学参考书。 以DjangoWeb项目开发为主线,从源码的角度,深入剖析Django3企业级开发技术。电子版仅供预…

网络流23题做题笔记

省流:我没意见link【模板】网络最大流 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; using ll=long long; const int N=1e5+5; const ll inf=1e16+5; int n,m,S,T,head[N],idx=1; struct edge{int t…

LAS点云如何转换为3DTiles格式?用这款免费工具轻松搞定!

概述 随着数字孪生和三维城市模型技术的迅速发展,点云数据的使用越来越广泛。而LAS格式作为常见的点云数据存储格式,因其精确度高、数据丰富,成为了地形测绘、建筑建模等领域的主流数据源。然而,如何将这些庞大的LAS点云数据转换成适用于Web端展示的3DTiles格式,成了许多开…

linux系统串口终端软件显示异常解决方法,触觉智能出品

分享linux系统串口终端软件显示异常解决方法,以xshell软件为例本文介绍linux系统串口终端软件显示异常解决方法,以xshell软件为例。使用触觉智能的Purple Pi R1双网口开发板演示,内置双核A7 1.2Ghz处理器,支持WiFi与丰富GPIO拓展,是嵌入式新人入门学习的高性价比开发板! …

SecureFX for Mac FTP/SSH传输工具

SecureFX for Mac FTP/SSH传输工具 SecureFX mac破解版是一款Mac平台的FTP/SSH传输工具。SecureFX for Mac支持三种文件传输协议:FTP、SFTP 和 FTP over SSH2。它可以提供安全文件传输。无论您连接的是任何一种操作系统的服务器,它都能提供安全的传输服务。它主要用于Linux操…