第 36 节 一些疑问


❤️💕💕新时代拥抱云原生,云原生具有环境统一、按需付费、即开即用、稳定性强特点。Myblog:http://nsddd.topopen in new window


[TOC]

Cgroups 介绍

Cgroups(简称控制组)是 Linux 内核的一项功能,允许管理员将资源(如 CPU 时间,内存和磁盘 I/O)分配给进程组。这允许管理员优先处理某些进程,限制其他进程的可用资源,并监视每个组中进程的资源使用情况。

Cgroups按层次组织,每个组都分配了特定的资源。一个组可以包含多个进程,一个进程也可以是多个组的成员。这允许管理员创建组的层次结构,并以灵活,细粒度的方式为每个组分配资源。

Cgroups使用虚拟文件系统实现,每个组在文件系统中以目录的形式表示。每个组的资源限制和使用情况都以相应目录中的文件的形式暴露。这允许用户空间程序通过读写这些文件查询和控制每个组的资源分配。

Cgroups在基于Linux的系统中常用于管理资源分配,尤其是在容器的情况下。它们也用于其他场景,如限制特定用户或应用程序的可用资源,或用于监视和调试目的。

sys 目录

在 Linux 操作系统中,/sys 目录是一个虚拟文件系统,它提供了内核数据结构的视图。它包含有关系统硬件、设备和设备驱动程序的信息。 sys 目录是 sysfs 文件系统的一部分,它是作为将内核信息导出到用户空间的一种方式引入 Linux 内核的。它允许用户空间程序向内核查询有关系统硬件的信息,包括硬件的配置和状态。 /sys 目录包含许多子目录和文件,它们提供有关系统各个方面的信息。例如,

  • /sys/class 目录包含有关系统设备类的信息,
  • /sys/block 目录包含有关系统块设备的信息。

对于需要收集有关系统硬件和设备信息的系统管理员和开发人员来说,/sys 目录是一个有用的资源。它也可以被用户空间程序用来访问和控制系统硬件和设备的某些方面。

fs 目录

Linux 操作系统默认目录结构中不存在“/fs”目录。您可能引用的是/sys 目录,该目录是一个虚拟文件系统,提供了查看内核数据结构的视图。 /sys 目录是 sysfs 文件系统的一部分,它是在 Linux 内核中引入的,用于将内核信息导出到用户空间。它允许用户空间程序查询内核以获得有关系统硬件的信息,包括硬件的配置和状态。 或者,您可能会引用/proc/fs 目录,其中包含有关当前挂载在系统上的文件系统的信息。/proc/fs 目录包含许多文件和子目录,它们提供有关文件系统的信息,包括它们的类型、挂载点和其他相关详细信息。也有可能您指的是/var/fs 目录,该目录在 Linux 操作系统中默认不存在。这个目录可能用于存储与文件系统相关的文件,但它的用途取决于在特定系统上如何配置和使用它。

目录

root@cubmaster01:/sys/fs/cgroup/cpu# mkdir container
root@cubmaster01:/sys/fs/cgroup/cpu# ls container/
cgroup.clone_children  cpuacct.usage         cpuacct.usage_percpu_sys   cpuacct.usage_user  cpu.shares      cpu.uclamp.min
cgroup.procs           cpuacct.usage_all     cpuacct.usage_percpu_user  cpu.cfs_period_us   cpu.stat        notify_on_release
cpuacct.stat           cpuacct.usage_percpu  cpuacct.usage_sys          cpu.cfs_quota_us    cpu.uclamp.max  tasks
root@cubmaster01:/sys/fs/cgroup/cpu# ls -al container/
total 0
drwxr-xr-x 2 root root 0 Dec 31 04:26 .
dr-xr-xr-x 5 root root 0 Dec 30 08:09 ..
-rw-r--r-- 1 root root 0 Dec 31 04:26 cgroup.clone_children
-rw-r--r-- 1 root root 0 Dec 31 04:26 cgroup.procs
-r--r--r-- 1 root root 0 Dec 31 04:26 cpuacct.stat
-rw-r--r-- 1 root root 0 Dec 31 04:26 cpuacct.usage
-r--r--r-- 1 root root 0 Dec 31 04:26 cpuacct.usage_all
-r--r--r-- 1 root root 0 Dec 31 04:26 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 Dec 31 04:26 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 Dec 31 04:26 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 Dec 31 04:26 cpuacct.usage_sys
-r--r--r-- 1 root root 0 Dec 31 04:26 cpuacct.usage_user
-rw-r--r-- 1 root root 0 Dec 31 04:26 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Dec 31 04:26 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Dec 31 04:26 cpu.shares
-r--r--r-- 1 root root 0 Dec 31 04:26 cpu.stat
-rw-r--r-- 1 root root 0 Dec 31 04:26 cpu.uclamp.max
-rw-r--r-- 1 root root 0 Dec 31 04:26 cpu.uclamp.min
-rw-r--r-- 1 root root 0 Dec 31 04:26 notify_on_release
-rw-r--r-- 1 root root 0 Dec 31 04:26 tasks
root@cubmaster01:/sys/fs/cgroup/cpu# time

real    0m0.000s
user    0m0.000s
sys     0m0.000s
root@cubmaster01:/sys/fs/cgroup/cpu# date
Sat 31 Dec 2022 04:26:34 AM UTC

pivot_root 和 chroot

pivot_root 和 chroot 是两个类 unix 操作系统函数,用于更改进程的根文件系统。然而,它们有一些重要的区别:

Pivot_root用于修改整个系统的根文件系统,chroot用于修改单个进程的根文件系统。

Pivot_root要求新的根文件系统是当前根文件系统的子目录,而chroot可以将根文件系统更改为系统上的任何目录。

Pivot_root通常在引导过程中使用,而chroot通常用于在包含的环境中运行程序。

Pivot_root需要比chroot更多的权限,因为它涉及更改整个系统的根文件系统。

总而言之,pivot_root用于更改整个系统的根文件系统,而chroot用于更改单个进程的根文件系统。Pivot_root通常在引导过程中使用,而chroot通常用于在包含的环境中运行程序。

Copy-on-Write

Docker 使用的是一种叫做 “写时拷贝”(Copy-on-Write,简称 COW)的技术来管理容器的存储。

在 COW 机制下,Docker 在创建一个容器时,并不会真正地复制镜像中的文件和数据到容器中。相反,它会在容器中创建一个新的文件系统层,并将它挂载在镜像的最底层(即 init 层)之上。这样,当容器中的进程尝试修改镜像中的文件或数据时,Docker 会自动将修改的数据复制到容器的文件系统层中,而不会直接修改镜像本身。

这种 COW 机制的好处在于,可以在保证容器隔离性的同时,大大降低了容器存储的空间占用。因为容器只保存对镜像做出的修改,所以容器的存储空间只需要保留这些修改的数据即可。这对于在大量容器中运行相同的应用程序,或者使用较小的存储设备来运行容器都是非常有用的。

Docker 中的 init 层是一个特殊的层,它位于镜像的最底层。它负责在容器启动时执行初始化操作,如初始化进程管理器、运行容器的入口点程序等。

在不同的 Docker 镜像中,init 层的具体实现可能略有不同。例如,在基于 Alpine Linux 的镜像中,init 层通常是 busybox 程序,它可以提供一组基本的 Unix 工具。在基于 Ubuntu 的镜像中,init 层可能是 systemd 程序,它可以提供更加复杂的进程管理功能。

总的来说,init 层是 Docker 容器启动过程中不可或缺的一部分,它负责在容器内部初始化基础环境,为后续的应用程序提供运行条件。

END 链接