C语言实现简单的Linux容器

一、项目介绍

这是一个基于C语言实现的简单Linux容器,提供了基本的容器功能,包括环境隔离、资源限制、网络管理等特性。

主要功能

  1. 1. 命名空间隔离(Namespace)
  2. 2. 资源限制(Cgroups)
  3. 3. 能力管理(Capabilities)
  4. 4. 文件系统隔离(chroot)
  5. 5. 挂载点管理
  6. 6. 网络隔离

完整源代码在文章末尾

二、编译安装

1. 环境要求

  • • Linux操作系统(推荐Ubuntu/Debian)
  • • GCC编译器
  • • libcap开发库

2. 安装依赖

# Debian/Ubuntu系统
sudo apt-get update
sudo apt-get install -y gcc make libcap-dev

# CentOS/RHEL系统
sudo yum install -y gcc make libcap-devel

3. 编译

# 编译容器程序
gcc -o container simple_container.c -lcap

三、容器环境准备

1. 创建容器根目录

# 创建基本目录结构
sudo mkdir -p /container_root/{bin,lib,lib64,proc,sys,dev,etc,usr/bin,usr/lib,usr/lib64}

# 创建设备节点
sudo mknod -m 666 /container_root/dev/null c 1 3
sudo mknod -m 666 /container_root/dev/zero c 1 5
sudo mknod -m 666 /container_root/dev/random c 1 8
sudo mknod -m 666 /container_root/dev/urandom c 1 9
sudo mknod -m 666 /container_root/dev/tty c 5 0
sudo mkdir -p /container_root/dev/pts

2. 复制基本系统文件

# 复制基本命令
sudo cp /bin/{bash,ls,cat,ps,hostname,mount,ip} /container_root/bin/

# 复制必要的库文件
sudo cp -r /lib/x86_64-linux-gnu /container_root/lib/
sudo cp -r /lib64/* /container_root/lib64/

四、容器配置说明

容器的基本配置在代码中的 container_config 结构体中定义:

struct container_config {
    char *hostname;              // 容器主机名
    char *root_dir;             // 容器根目录
    int cpu_shares;             // CPU份额(默认1024)
    int memory_limit;           // 内存限制(MB)
    char *ip_address;           // IP地址
    int enable_network;         // 网络启用标志
};

默认配置:

  • • 主机名:container
  • • 根目录:/container_root
  • • CPU份额:1024
  • • 内存限制:512MB
  • • IP地址:172.17.0.2
  • • 网络启用:是

五、运行容器

1. 基本运行

sudo ./container

2. 验证容器功能

a. 检查命名空间隔离

# 查看主机名
hostname

# 查看进程隔离
ps aux

# 查看挂载点
mount

预期输出:

container
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   4496  3488 ?        S    00:00   0:00 /bin/bash
...

b. 检查文件系统隔离

# 查看根目录结构
ls /

# 查看可用命令
ls /bin

c. 检查网络隔离

# 查看网络接口
ip addr

# 预期只看到lo接口

d. 检查资源限制

# 查看cgroup信息
cat /proc/self/cgroup

# 查看内存限制
cat /sys/fs/cgroup/memory/memory.limit_in_bytes

e. 检查能力限制

# 尝试修改系统时间(应该失败)
date -s "2024-01-01 00:00:00"

六、安全特性

  1. 1. 能力限制
  • • 容器只保留了最基本的能力:
    • • CAP_NET_BIND_SERVICE
    • • CAP_SYS_CHROOT
  1. 2. 资源限制
  • • CPU使用限制
  • • 内存使用限制
  1. 3. 文件系统隔离
  • • 使用chroot实现根文件系统隔离
  • • 只能访问容器内的文件系统

七、注意事项

  1. 1. 安全警告
  • • 必须使用root权限运行
  • • 不建议在生产环境使用
  • • 容器内的root用户映射到主机的root用户
  1. 2. 限制说明
  • • 网络功能仅实现了基本隔离
  • • 没有实现容器镜像管理
  • • 资源限制依赖于cgroup v1
  1. 3. 故障排除
  • • 如果启动失败,检查是否有足够权限
  • • 确保所有必要的系统文件都已复制到容器根目录
  • • 检查内核是否支持所有需要的命名空间特性

八、测试脚本

以下是一个完整的测试脚本,可以验证所有容器功能:

#!/bin/bash

echo "=== 容器功能测试脚本 ==="

# 1. 测试主机名隔离
echo "测试主机名隔离:"
hostname

# 2. 测试进程隔离
echo -e "\n测试进程隔离:"
ps aux

# 3. 测试文件系统隔离
echo -e "\n测试文件系统隔离:"
ls /
echo "根目录文件数量:"
ls / | wc -l

# 4. 测试挂载点
echo -e "\n测试挂载点:"
mount | grep -E "proc|sysfs|devpts"

# 5. 测试网络隔离
echo -e "\n测试网络隔离:"
ip addr

# 6. 测试资源限制
echo -e "\n测试资源限制:"
cat /proc/self/cgroup

# 7. 测试设备访问
echo -e "\n测试设备访问:"
ls -l /dev/

# 8. 测试能力限制
echo -e "\n测试能力限制:"
date -s "2024-01-01 00:00:00" 2>&1 || echo "预期的权限限制生效"

将此脚本保存为 test_container.sh,复制到容器的 /bin 目录,然后在容器内执行:

chmod +x /bin/test_container.sh
./bin/test_container.sh

九、扩展建议

  1. 1. 功能扩展
  • • 添加容器镜像管理
  • • 实现更完善的网络配置
  • • 添加容器资源监控
  • • 实现容器间通信机制
  1. 2. 安全加强
  • • 实现seccomp过滤器
  • • 添加更细粒度的能力控制
  • • 实现用户命名空间映射配置
  1. 3. 使用优化
阅读剩余
THE END