文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在 Linux中,Namespace 和 Cgroups 是如何实现资源隔离?

2024-11-29 19:38

关注

一、Namespace 详解

Namespace(命名空间,也称名称空间)是 Linux 内核用于隔离系统资源,使得不同的进程组可以拥有各自独立的资源视图。Namespace 的核心思想是通过将系统资源划分为不同的命名空间,进而实现资源的隔离。

Namespace通常包含以下几种类型:

1. PID Namespace

PID Namespace 用于隔离进程 ID 空间。每个 PID Namespace 都有自己独立的进程 ID 号,父 Namespace 可以查看和管理子 Namespace 中的进程,但反之则不行。这种机制使得在容器中运行的进程可以拥有从 1 开始的 PID。

# 创建新的 PID Namespace 并运行一个 Bash 进程
unshare -p -f --mount-proc bash

2. Mount Namespace

Mount Namespace 用于隔离挂载点。不同的 Mount Namespace 可以拥有各自独立的文件系统视图。这样一来,在一个 Namespace 中对文件系统的修改不会影响到其他 Namespace。

# 创建新的 Mount Namespace 并运行一个 Bash 进程
unshare -m bash

3. UTS Namespace

UTS (UNIX Time-Sharing) Namespace 用于隔离主机名和域名。不同的 UTS Namespace 可以拥有不同的主机名和域名,这对于容器化应用非常有用。

# 创建新的 UTS Namespace 并运行一个 Bash 进程
unshare -u bash
hostname new_hostname

4. IPC Namespace

IPC (Inter-Process Communication) Namespace 用于隔离进程间通信资源,如消息队列、信号量和共享内存。不同的 IPC Namespace 之间的通信资源是隔离的。

# 创建新的 IPC Namespace 并运行一个 Bash 进程
unshare -i bash

5. Network Namespace

Network Namespace 用于隔离网络资源,如网络接口、路由表、防火墙规则等。每个 Network Namespace 可以拥有独立的网络设备和配置。

# 创建新的 Network Namespace 并运行一个 Bash 进程
ip netns add mynamespace
ip netns exec mynamespace bash

6. User Namespace

User Namespace 用于隔离用户和用户组 ID。它允许在不同的 Namespace 中使用相同的用户 ID,但这些 ID 在不同的 Namespace 中是独立的。这样一来,即使在容器中运行的进程以 root 身份运行,也不会拥有对宿主系统的 root 权限。

# 创建新的 User Namespace 并运行一个 Bash 进程
unshare -U bash

7. 无法被 Namespace

尽管 Linux的 Namespace机制提供了对多种系统资源的隔离,但并不是所有的系统资源都能被 Namespace隔离,以下是一些不能被 Namespace隔离的资源及其原因:

二、Cgroups 详解

1. 什么是Cgroups?

Cgroups (Control Groups,控制组)是 Linux 内核的一个特性,用于限制、记录和隔离一组进程的资源使用(CPU、内存、磁盘 I/O、网络等)。

Cgroups 通过将进程分组,然后对这些组应用资源限制来工作,核心组件包括:

2. Cgroups 的子系统

Cgroups 支持多种子系统,每种子系统负责不同的资源控制:

3. 创建和管理 Cgroups

通过命令行工具 cgcreate、cgset 和 cgexec 可以方便地创建和管理 Cgroups。

# 创建一个新的 Cgroup
cgcreate -g cpu,memory:/mygroup

# 设置 CPU 使用限制
cgset -r cpu.shares=512 mygroup

# 设置内存使用限制
cgset -r memory.limit_in_bytes=256M mygroup

# 将一个进程加入到 Cgroup
cgexec -g cpu,memory:mygroup /bin/bash

4. Cgroups v2

Cgroups v2 是 Cgroups 的第二个版本,提供了更为统一和简化的接口。Cgroups v2 的主要特点包括:

# 挂载 Cgroups v2
mount -t cgroup2 none /sys/fs/cgroup

# 创建一个新的 Cgroup
mkdir /sys/fs/cgroup/mygroup

# 设置 CPU 使用限制
echo 50000 > /sys/fs/cgroup/mygroup/cpu.max

# 设置内存使用限制
echo 256M > /sys/fs/cgroup/mygroup/memory.max

# 将一个进程加入到 Cgroup
echo $$ > /sys/fs/cgroup/mygroup/cgroup.procs

三、Namespace 和 Cgroups 的结合

Namespace 和 Cgroups 的结合使用是容器技术的基础,Namespace 提供了进程级别的隔离,而 Cgroups 则用于资源的分配和限制,通过这两种机制,可以创建高效且安全的容器化环境。

容器的创建

以下是一个简单的示例,展示如何使用 Namespace 和 Cgroups 创建一个容器:

# 创建新的 Namespace
unshare -p -f -m -u -i -n --mount-proc bash

# 设置主机名
hostname container

# 挂载新的文件系统
mount -t tmpfs none /tmp

# 创建新的 Cgroup
cgcreate -g cpu,memory:/container

# 设置 CPU 和内存限制
cgset -r cpu.shares=512 container
cgset -r memory.limit_in_bytes=256M container

# 将当前进程加入到 Cgroup
cgclassify -g cpu,memory:container $$

在上述示例中,我们首先创建了一个新的 Namespace,然后设置了主机名并挂载了新的文件系统。接着,我们创建了一个新的 Cgroup,并设置了 CPU 和内存限制。最后,我们将当前进程加入到 Cgroup。

四、总结

Namespace 和 Cgroups 是 Linux 内核提供的两种关键机制,用于实现系统资源的隔离和管理。Namespace 提供了进程级别的隔离,使得不同的进程组可以拥有各自独立的资源视图,而 Cgroups 则用于资源的分配和限制,通过将进程分组,然后对这些组应用资源限制来工作。结合使用这两种机制,可以创建高效且安全的容器化环境。

来源:猿java内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯