gpt4 book ai didi

android - CLONE_NEWNS 在 Android 上无效

转载 作者:行者123 更新时间:2023-11-30 01:56:00 24 4
gpt4 key购买 nike

我正在学习挂载命名空间,这是 Linux 内核提供的一种隔离机制。我写了一个简单的 C 程序来测试它。

#define _GNU_SOURCE
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>
#include <asm/unistd.h>
#include <sys/mount.h>
#include <errno.h>
#include <string.h>

#define STACK_SIZE (1024 * 1024)
static char container_stack[STACK_SIZE];

char* const container_args[] = {
"/bin/bash",
NULL
};

void mounts(void)
{
syscall(__NR_mount, "proc", "/home/aaa/nstest/", "proc", 0, NULL);
}

int container_main(void* arg)
{
printf("Container - inside the container!\n");
errno = 0;
mounts();
perror("mount");
execv(container_args[0], container_args);
printf("Something's wrong!\n");
return 1;
}

int main()
{
printf("Parent - start a container!\n");
int pid = syscall(__NR_clone, CLONE_NEWNS | SIGCHLD, NULL, NULL, NULL, NULL);
if (pid < 0) {
perror("clone failed");
exit(-1);
} else if (pid == 0) {
container_main(NULL);
exit(0);
}
waitpid(pid, NULL, 0);
printf("Parent - container stopped!\n");
return 0;
}

这段代码在我的 Ubuntu 上运行良好。目录“/home/aaa/nstest/”挂载到新的挂载命名空间后,在根挂载命名空间中为空。

但是,它不适用于 Android 模拟器。挂载传播到根挂载命名空间。首先我认为可能是内核不支持命名空间导致的。所以我用所有相关的 CONFIG 开关编译金鱼,比如 CONFIG_NAMESPACE。而且它也不起作用。

最佳答案

我有同样的问题,即使在使用所有 CONFIG_NAMESPACE 重新编译内核之后。我已经尝试了 unshare -m/bin/bash 命令,它适用于我的 archlinux x86_64 机器,

所以我深入研究了命令的 strace unshare -m/bin/bash

...
unshare(CLONE_NEWNS) = 0
mount("none", "/", NULL, MS_REC|MS_PRIVATE, NULL) = 0
execve("/bin/bash", ["/bin/bash"], [/* 19 vars */]) = 0
...

seams 有一个额外的调用 mount(...)。将调用添加到我的代码中,它有效!

int main(int argc, const char* argv[]) {
const char * source=argv[1];
const char * target=argv[2];

if (unshare(CLONE_NEWNS) == -1) {
printf("Failed to unshare(): %s\n", strerror(errno));
return -1;
}
mount("none", "/", NULL, MS_REC|MS_PRIVATE, NULL);

if (mount(source, target, NULL, MS_BIND, NULL) == -1) {
printf("Failed to mount %s to %s: %s\n", source, target, strerror(errno));
return -1;
}
sleep(50);
return 0;
}

关于android - CLONE_NEWNS 在 Android 上无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32224590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com