zoukankan      html  css  js  c++  java
  • 利用setns()将进程加入一个新的network namespace

    1、首先使用docker创建一个容器,并获取该容器的network namespace

    monster@monster-Z:~$ docker run -itd --name test ubuntu /bin/bash
    3926b5b272107843602fae240fdda929c0e5830dbadc0122b10cd8e66cf71f31
    monster@monster-Z:~$ docker ps 
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    3926b5b27210        ubuntu              "/bin/bash"         3 seconds ago       Up 2 seconds                            test
    monster@monster-Z:~$ docker inspect --format '{{ .State.Pid }}' test
    3656
    

    由上可知,该容器的network namespace在/proc/3656/ns/net

    2、启动一个程序,加入该network namespace,并且exec为bash,查看运行效果

    程序文件如下所示:

    #define _GNU_SOURCE
    #include <fcntl.h>
    #include <sched.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE);
                            } while (0)
    
    int
    main(int argc, char *argv[]) {
            int fd;
    
            if (argc < 3) {
                    fprintf(stderr, "%s /proc/PID/ns/FILE cmd args...
    ", argv[0]);
                    exit(EXIT_FAILURE);
            }
    
            fd = open(argv[1], O_RDONLY);   // Get descriptor for namespace
            if (fd == -1)
                    errExit("open");
    
            if (setns(fd, 0) == -1)         // Join that namespace
                    errExit("setns");
    
            execvp(argv[2], &argv[2]);      // Execute a command in namspace
            errExit("execvp");
    }

    3、操作步骤如下所示,已经进入了该network namespace

    root@monster-Z:/home/monster/TEST/c# ./ns_exec /proc/3656/ns/net /bin/bash 
    root@monster-Z:/home/monster/TEST/c# ifconfig 
    eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02  
              inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
              inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:28 errors:0 dropped:0 overruns:0 frame:0
              TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:4324 (4.3 KB)  TX bytes:648 (648.0 B)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    

      

  • 相关阅读:
    零拷贝
    RxJava2源码解析
    一次博客崩溃日志分析
    Spring循环依赖的解决
    解决网络卡顿问题
    软工第一次作业
    3月26-27号训练笔记
    Codeforces Round #708 (Div. 2)题解A,B,C1,C2,E1,E2
    求出所有LIS的可行起点
    2020小米邀请赛决赛补题G,I,J(三DP)
  • 原文地址:https://www.cnblogs.com/YaoDD/p/6225803.html
Copyright © 2011-2022 走看看