容器重新挂载文件系统

该博客展示了如何在Linux中使用clone函数和命名空间技术创建一个简易的容器。通过设置新的UTS命名空间,实现hostname隔离,并执行bash shell。在容器内部,可以观察到hostname已更改为'container',并且文件系统的改变仅限于容器内部。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>

/* 定义一个给 clone 用的栈,栈大小1M */
#define STACK_SIZE (1024 * 1024)
static char container_stack[STACK_SIZE];

char* const container_args[] = {
    "/bin/bash",
    NULL
};
int container_main(void* arg)
{
    printf("Container - inside the container!\n");
    sethostname("container",10); /* 设置hostname */
    execv(container_args[0], container_args);
    printf("Something's wrong!\n");
    return 1;
}

int main()
{
    printf("Parent - start a container!\n");
    int container_pid = clone(container_main, container_stack+STACK_SIZE, 
            CLONE_NEWUTS | SIGCHLD, NULL); /*启用CLONE_NEWUTS Namespace隔离 */
    waitpid(container_pid, NULL, 0);
    printf("Parent - container stopped!\n");
    return 0;
}


[root@dock01 C]# gcc -o ns ns.c
[root@dock01 C]# ./ns
Parent - start a container!
Container - inside the container!
[root@container C]# hostname
container
[root@container C]# ls -ltr /tmp/
total 0
-rw-r--r-- 1 root root 0 Dec  7 05:25 dd
-rw-r--r-- 1 root root 0 Dec  7 05:25 cc
-rw-r--r-- 1 root root 0 Dec  7 05:25 bb
-rw-r--r-- 1 root root 0 Dec  7 05:25 aa

mount("none", "/tmp", "tmpfs", 0, "");  
execv(container_args[0], container_args);

[root@dock01 C]# ./ns
Parent - start a container!
Container - inside the container!
[root@container C]# ls -ltr /tmp/
total 0
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scan724

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值