做家居商城网站,网络整合推广营销,档案馆网站安全建设,站长工具在线前言
Linux Namespace 隔离进程的视图#xff0c;使每个容器看起来像是独立的系统。常见的命名空间包括进程ID、网络、挂载点、UTS、IPC等。
Linux cgroup 控制和限制容器使用的资源#xff0c;如CPU、内存、磁盘I/O等#xff0c;确保容器之间的资源隔离和公平分配。
目前…前言
Linux Namespace 隔离进程的视图使每个容器看起来像是独立的系统。常见的命名空间包括进程ID、网络、挂载点、UTS、IPC等。
Linux cgroup 控制和限制容器使用的资源如CPU、内存、磁盘I/O等确保容器之间的资源隔离和公平分配。
目前为止容器还差一个跟宿主机隔离的独立的文件系统环境pivot_root 解决了这一问题。
pivot_root 介绍
pivot_root 是 Linux 内核中的一个系统调用主要用于改变当前进程的根文件系统。它的诞生背景与容器技术和系统引导过程中的需求密切相关。
系统引导在系统启动过程中内核需要从一个初始的根文件系统通常是 initrd 或 initramfs切换到实际的根文件系统。pivot_root 可以在这个过程中帮助完成根文件系统的切换。
容器技术随着容器化技术的发展需要在同一台主机上运行多个隔离的用户空间实例。每个容器需要有自己独立的根文件系统而 pivot_root 可以帮助实现这种隔离。
pivot_root 使用
pivot_root 使用的基本流程
准备一个新的根文件系统必须包含必要的文件和依赖库挂载到宿主机的某个目录执行 pivot_root 切换当前进程的根文件系统cd / 切换到新的根文件系统卸载旧根文件系统
pivot_root 需要 root 权限且新根文件系统必须是一个挂载点旧根必须挂载到新根的子目录下。
实操一下
宿主机的 /container 目录下有两个文件 ls /container
image.tar change_rootfs.shimage.tar 基于 BusyBox 构建的 Linux 环境一个 4M 大小的根文件系统change_rootfs.sh 切换根文件系统的脚本
核心在于 change_rootfs.sh 脚本主要是解压新根文件系统然后挂载到宿主机然后切到新根下。
#!/bin/bash
# 确保新根目录不存在
rm -rf /container/rootfs# 开启新的 mount 命名空间
unshare --mount --fork -- bash -c
# 创建新根目录
mkdir -p /container/rootfs
# 挂载
mount -t tmpfs rootfs /container/rootfs
# 解压根文件系统到新根目录确保新根文件系统有必要的文件
tar -xf /container/image.tar -C /container/rootfs
# 创建旧根目录
mkdir -p /container/rootfs/old_rootfs
# 切换到新根同时挂载旧根到/container/rootfs/old_rootfs
pivot_root /container/rootfs /container/rootfs/old_rootfs
cd /
exec /bin/sh执行脚本会发现当前终端的根目录已经切到/container/rootfs 下。根目录下是一个基于 BusyBox 构建的极简 Linux 环境实现了进程的根文件系统隔离在这个系统下随意操作都不会影响宿主机。 ./change_rootfs.sh
/ # ls /
bin etc lib old_rootfs root tmp var
dev home lib64 proc sys usr另外会发现/old_rootfs 挂载的是旧根通过它还是可以访问宿主机文件系统卸载它即可。
新开一个终端是看不到 rootfs 这个挂载点的因为它运行在独立的命名空间里。同样地也看不到 /container/rootfs 下的任何文件。
# 宿主机环境下mount | grep rootfs
# 无任何输出ls /container/rootfs
# 无任何输出但是在命名空间内是可以看到 rootfs 挂载点的 mount | grep rootfs on
rootfs on / type tmpfs (rw,relatime,inode64)exit 退出命名空间会回到宿主机同时命名空间内的资源会被释放对于宿主机来说rootfs 依然是空的。
尾巴
pivot_root 是 Linux 中用于更改当前根文件系统的系统调用它通常用于容器和虚拟化环境中以隔离应用程序的文件系统环境。通过使用 pivot_root可以实现更高效的系统管理和资源隔离。