kernel namespaces và cgroups

kernel namespaces và cgroups

09/05/2022 Off By devk2x

Linux Kernel

Namespaces là một chức năng mang tính trừu tượng của Linux Kernel , nó chia các kernel resource và phân bổ cho các tiến trình cho các resource đó, khi nói tới namespace thì có nghĩa là các tài nguyên đi kèm là riêng biệt mặc dù tài nguyên đó cũng có thể được sử dụng ở các namespace khác như: ID Process, Host Name, User’s ID, … và một số khác liên quan đến quyền truy cập mạng và giao tiếp giữ các tiến trình với nhau.
Không gian tên là một khía cạnh cơ bản của Container trên Linux (linux namespaces cho phép chúng ta cách ly tài nguyên hệ thống giữa các tiến trình một cách độc lập).
Docker là một trong những khuôn khổ được xây dựng dựa trên Cgroup và Namespace.

Không gian tên được phân loại thành nhiều nhóm, như chúng ta thấy bên dưới (Hiện tại tôi chưa có nhu cầu tìm hiểu nên đang copy nguyên bản tiếng anh trong cuốn sách Linux Kernel Development).

Mount namespaces

Traditionally, mount and unmount operations will change the filesystem view as seen by all processes in the system; in other words, there is one global mount namespace seen by all processes. The mount namespaces confine the set of filesystem mount points visible within a process namespace, enabling one process group in a mount namespace to have an exclusive view of the filesystem list compared to another process.

UTS namespaces

These enable isolating the system’s host and domain name within a uts namespace. This makes initialization and configuration scripts able to be guided based on the respective namespaces.

IPC namespaces

These demarcate processes from using System V and POSIX message queues. This prevents one process from an ipc namespace accessing the resources of another.

PID namespaces

Traditionally, *nix kernels (including Linux) spawn the init process with PID 1 during system boot, which in turn starts other user-mode processes and is considered the root of the process tree (all the other processes start below this process in the tree). The PID namespace allows a process to spin off a new tree of processes under it with its own root process (PID 1 process). PID namespaces isolate process ID numbers, and allow duplication of PID numbers across different PID namespaces, which means that processes in different PID namespaces can have the same process ID. The process IDs within a PID namespace are unique, and are assigned sequentially starting with PID 1.

PID namespaces are used in containers (lightweight virtualization solution) to migrate a container with a process tree, onto a different host system without any changes to PIDs.

Network namespaces

This type of namespace provides abstraction and virtualization of network protocol services and interfaces. Each network namespace will have its own network device instances that can be configured with individual network addresses. Isolation is enabled for other network services: routing table, port number, and so on.

User namespaces

User namespaces allow a process to use unique user and group IDs within and outside a namespace. This means that a process can use privileged user and group IDs (zero) within a user namespace and continue with non-zero user and group IDs outside the namespace.

Cgroup namespaces

A cgroup namespace virtualizes the contents of the /proc/self/cgroup file. Processes inside a cgroup namespace are only able to view paths relative to their namespace root.

Control groups (cgroups)

Cgroups are kernel mechanisms to restrict and measure resource allocations to each process group. Using cgroups, you can allocate resources such as CPU time, network, and memory.

Cgroups là cơ chế đặc biệt được cung cấp bởi kernel Linux cho phép chúng ta cấp phát các kiểu tài nguyên như processor time, số processes cho mỗi group, lượng memory cho mỗi group hay kết hợp các tài nguyên đó cho một process hoặc một tập các processes. Cgroups được tổ chức theo dạng phân cấp và cơ chế này cũng tương tự như các process thông thường, vì chúng cũng được tổ chức theo dạng phân cấp và các child cgroups (hay còn được gọi là cgroups con) kế thừa một tập các tham số nhất định từ parent cgroup (cgroups cha). Nhưng thực sự thì chúng không giống nhau. Sự khác biệt chính giữa cgroups và các process thông thường đó là có rất nhiều phân cấp khác nhau của controls groups có thể tồn tại đồng thời tại một thời điểm, trong khi tree các process thông thường luôn chỉ có một phân cấp duy nhất. Phân cấp này không phải ngẫu nhiên vì mỗi phân cấp của control group đều được gắn vào tập các control group subsystems.


Nguồn: Mastering Linux Kernel Development
https://en.wikipedia.org/wiki/Linux_namespaces