怎么看网站是asp还是php免费产品推广网站
前言
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.sh
- image.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
,可以实现更高效的系统管理和资源隔离。