이동 중에 네임 스페이스를 변경하고 싶습니다. C에서 코드를 컴파일하고 실행할 때 제대로 작동하지만 netn 시스템 콜에서 errno 22를 얻습니다. 이것이 일어날 수있는 아이디어가 있습니까?리눅스 네임 스페이스를 변경하십시오.
이동)
$ go build main.go ; ./main
setns mnt: Invalid argument
panic: -1
goroutine 1 [running]:
runtime.panic(0x423b80, 0xffffffffffffffff)
/usr/local/go/src/pkg/runtime/panic.c:266 +0xb6
main.main()
main.go:81 +0x86
$
C)
$ grep ^// main.go | sed 's/\/\///' | sed 's/__main/main/' > main.c; gcc main.c -o main; ./main
$
아래 코드 :
package main
//
// #define _GNU_SOURCE
// #include <fcntl.h>
// #include <sched.h>
// #include <sys/syscall.h>
// #include <sys/param.h>
// #include <sys/mount.h>
// #include <stdio.h>
// #include <unistd.h>
//
// #define NETNS_RUN_DIR "/run/netns"
// #define MNTNS_RUN_DIR "/run/mntns"
//
// #ifndef HAVE_SETNS
//
// int
// setns(int fd, int nstype) {
// #ifdef __NR_setns
// return syscall(__NR_setns, fd, nstype);
// #else
// errno = ENOSYS;
// return -1;
// #endif
// }
//
// #endif /* HAVE_SETNS */
//
//
// int
// ChangeNamespace(char *name)
// {
// char net_path[MAXPATHLEN];
// char mnt_path[MAXPATHLEN];
// int fd;
//
// snprintf(net_path, sizeof(net_path), "%s/%s", NETNS_RUN_DIR, name);
// snprintf(mnt_path, sizeof(mnt_path), "%s/%s", MNTNS_RUN_DIR, name);
//
// fd = open(net_path, O_RDONLY);
// if (fd < 0) {
// perror("open net");
// return -1;
// }
//
// if (setns(fd, 0) < 0) {
// perror("setns net");
// return -1;
// }
//
// fd = open(mnt_path, O_RDONLY);
// if (fd < 0) {
// perror("open mnt");
// return -1;
// }
//
// if (setns(fd, 0) < 0) {
// perror("setns mnt");
// return -1;
// }
//
// return 0;
// }
//
// int
// __main(int argc, char *argv[]) {
// ChangeNamespace("ns");
// return 0;
// }
//
import "C"
import "unsafe"
func main() {
name := C.CString("ns")
defer C.free(unsafe.Pointer(name))
i := int(C.ChangeNamespace(name))
if i < 0 {
panic(i)
}
}
'perror()'줄을 변경하여 문자열이 어느 호출에 실패했는지 말할 수 있습니까? "잘못된 인수"만으로는 무슨 일이 일어나고 있는지 설명하기에 충분하지 않습니다. (나는 이것이 움직이는 스택 문제라고 생각한다.) – andlabs
setns가 예상 된 스레드에서 호출되고 있는지 확인하기 위해'runtime.LockOSThread'를 호출해야한다. – JimB
docker가 [libcontainer/namespaces] (https://github.com/libcontainer/namespaces)에서이를 어떻게 처리하는지 확인할 수 있습니다. 다가오는'go.sys' 패키지에 대한 지원을 추가하는 것에 관한 최소한 하나의 공개 문제가 있습니다 : [# 8447] (https://code.google.com/p/go/issues/detail?id=8447) – JimB