网络命名空间 命名数据网络
大家好,关于网络命名空间很多朋友都还不太明白,今天小编就来为大家分享关于命名数据网络的知识,希望对各位有所帮助!
详解Linux中的命名空间
背景
从Linux 2.6.24版的内核开始,Linux就支持6种不同类型的命名空间。它们的出现,使用户创建的进程能够与系统分离得更加彻底,从而不需要使用更多的底层虚拟化技术。
CLONE_NEWIPC:进程间通信(IPC)的命名空间,可以将 SystemV的 IPC和 POSIX的消息队列独立出来。
CLONE_NEWPID:进程命名空间。空间内的PID是独立分配的,意思就是命名空间内的虚拟 PID可能会与命名空间外的 PID相冲突,于是命名空间内的 PID映射到命名空间外时会使用另外一个 PID。比如说,命名空间内第一个 PID为1,而在命名空间外就是该 PID已被 init进程所使用。
CLONE_NEWNET:网络命名空间,用于隔离网络资源(/proc/net、IP地址、网卡、路由等)。后台进程可以运行在不同命名空间内的相同端口上,用户还可以虚拟出一块网卡。
CLONE_NEWNS:挂载命名空间,进程运行时可以将挂载点与系统分离,使用这个功能时,我们可以达到 chroot的功能,而在安全性方面比 chroot更高。
CLONE_NEWUTS: UTS命名空间,主要目的是独立出主机名和网络信息服务(NIS)。
CLONE_NEWUSER:用户命名空间,同进程 ID一样,用户 ID和组 ID在命名空间内外是不一样的,并且在不同命名空间内可以存在相同的 ID。下面我们介绍一下进程命名空间和网络命名空间。
进程命名空间
本文用 C语言介绍上述概念,因为演示进程命名空间的时候需要用到 C语言。下面的测试过程在 Debian 6和 Debian 7上执行。首先,在栈内分配一页内存空间,并将指针指向内存页的末尾。这里我们使用 alloca()函数来分配内存,不要用 malloc()函数,它会把内存分配在堆上。
复制代码代码如下:void*mem= alloca(sysconf(_SC_PAGESIZE))+ sysconf(_SC_PAGESIZE);然后使用 clone()函数创建子进程,传入我们的子栈空间地址"mem",并指定命名空间的标记。同时我们还指定“callee”作为子进程运行的函数。
复制代码代码如下:mypid= clone(callee, mem, SIGCHLD| CLONE_NEWIPC| CLONE_NEWPID| CLONE_NEWNS| CLONE_FILES, NULL);clone之后我们要在父进程中等待子进程先退出,否则的话,父进程会继续运行下去,并马上进程结束,留下子进程变成孤儿进程:
复制代码代码如下:while(waitpid(mypid,&r, 0)< 0&& errno== EINTR)
{
continue;
}最后当子进程退出后,我们会回到 shell界面,并返回子进程的退出码。
复制代码代码如下:if(WIFEXITED(r))
{
return WEXITSTATUS(r);
}
return EXIT_FAILURE;上文介绍的 callee函数功能如下:
复制代码代码如下:static int callee()
{
int ret;
mount("proc","/proc","proc", 0,"");
setgid(u);
setgroups(0, NULL);
setuid(u);
ret= execl("/bin/bash","/bin/bash", NULL);
return ret;
}程序挂载了/proc文件系统,设置用户 ID和组 ID,值都为“u”,然后运行/bin/bash程序,LXC是一个操作系统级的虚拟化工具,使用 cgroups和命名空间来完成资源的分离。现在我们把所有代码放在一起,变量“u”的值设为65534,在 Debian系统中,这是“nobody”和“nogroup”:
复制代码代码如下:#define _GNU_SOURCE
#include
#include
#include
#include types.h>
#include wait.h>
#include mount.h>
#include
#include
#include
#include
static int callee();
const int u= 65534;
int main(int argc, char*argv[])
{
int r;
pid_t mypid;
void*mem= alloca(sysconf(_SC_PAGESIZE))+ sysconf(_SC_PAGESIZE);
mypid= clone(callee, mem, SIGCHLD| CLONE_NEWIPC| CLONE_NEWPID| CLONE_NEWNS| CLONE_FILES, NULL);
while(waitpid(mypid,&r, 0)< 0&& errno== EINTR)
{
continue;
}
if(WIFEXITED(r))
{
return WEXITSTATUS(r);
}
return EXIT_FAILURE;
}
static int callee()
{
int ret;
mount("proc","/proc","proc", 0,"");
setgid(u);
setgroups(0, NULL);
setuid(u);
ret= execl("/bin/bash","/bin/bash", NULL);
return ret;
}执行以下命令来运行上面的代码:
复制代码代码如下:root@w:~/pen/tmp# gcc-O-o ns.c-Wall-Werror-ansi-c89 ns.c
root@w:~/pen/tmp#./ns
nobody@w:~/pen/tmp$ id
uid=65534(nobody) gid=65534(nogroup)
nobody@w:~/pen/tmp$ ps auxw
USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND
nobody 1 0.0 0.0 4620 1816 pts/1 S 21:21 0:00/bin/bash
nobody 5 0.0 0.0 2784 1064 pts/1 R+ 21:21 0:00 ps auxw
nobody@w:~/pen/tmp$注意上面的结果,UID和 GID被设置成 nobody和 nogroup了,特别是 ps工具只输出两个进程,它们的 ID分别是1和5(LCTT注:这就是上文介绍 CLONE_NEWPID时提到的功能,在线程所在的命名空间内,进程 ID可以为1,映射到命名空间外是另外一个 PID;而命名空间外的 ID为1的进程一直是 init)。
网络命名空间
接下来轮到使用 ip netns来设置网络的命名空间。第一步先确定当前系统没有命名空间:
复制代码代码如下:root@w:~# ip netns list
Object"netns" is unknown, try"ip help".如果报了上述错误,你需要更新你的系统内核,以及 ip工具程序。这里假设你的内核版高于2.6.24,ip工具版本也差不多,高于2.6.24(LCTT注:ip工具由 iproute安装包提供,此安装包版本与内核版本相近)。更新好后,ip netns list在没有命名空间存在的情况下不会输出任务信息。加个名为“ns1”的命名空间看看:
复制代码代码如下:root@w:~# ip netns add ns1
root@w:~# ip netns list
ns1列出网卡:
复制代码代码如下:root@w:~# ip link list
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 1000
link/ether 00:0c:29:65:25:9e brd ff:ff:ff:ff:ff:ff创建新的虚拟网卡,并加到命名空间。虚拟网卡需要成对创建,互相关联——就像交叉电缆一样:
复制代码代码如下:root@w:~# ip link add veth0 type veth peer name veth1
root@w:~# ip link list
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 1000
link/ether 00:0c:29:65:25:9e brd ff:ff:ff:ff:ff:ff
3: veth1: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether d2:e9:52:18:19:ab brd ff:ff:ff:ff:ff:ff
4: veth0: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether f2:f7:5e:e2:22:ac brd ff:ff:ff:ff:ff:ff这个时候 ifconfig-a命令也能显示新添加的 veth0和 veth1两块网卡。
很好,现在将这两份块网卡加到命名空间中去。注意一下,下面的 ip netns exec命令用于将后面的命令在命名空间中执行(LCTT注:下面的结果显示了在 ns1这个网络命名空间中,只存在 lo和 veth1两块网卡):
复制代码代码如下:root@w:~# ip link set veth1 netns ns1
root@w:~# ip netns exec ns1 ip link list
1: lo: mtu 65536 qdisc noop state DOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: veth1: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether d2:e9:52:18:19:ab brd ff:ff:ff:ff:ff:ff这个时候 ifconfig-a命令只能显示 veth0,不能显示 veth1,因为后者现在在 ns1命名空间中。
如果想删除 veth0/veth1,可以执行下面的命令:
复制代码代码如下:ip netns exec ns1 ip link del veth1我们可以为 veth0分配 IP地址:
复制代码代码如下:ifconfig veth0 192.168.5.5/24在命名空间内为 veth1分配 IP地址:
复制代码代码如下:ip netns exec ns1 ifconfig veth1 192.168.5.10/24 up在命名空间内外执行 ip addr list命令:
复制代码代码如下:root@w:~# ip addr list
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:65:25:9e brd ff:ff:ff:ff:ff:ff
inet 192.168.3.122/24 brd 192.168.3.255 scope global eth0
inet6 fe80::20c:29ff:fe65:259e/64 scope link
valid_lft forever preferred_lft forever
6: veth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 86:b2:c7:bd:c9:11 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.5/24 brd 192.168.5.255 scope global veth0
inet6 fe80::84b2:c7ff:febd:c911/64 scope link
valid_lft forever preferred_lft forever
root@w:~# ip netns exec ns1 ip addr list
1: lo: mtu 65536 qdisc noop state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 12:bd:b6:76:a6:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.5.10/24 brd 192.168.5.255 scope global veth1
inet6 fe80::10bd:b6ff:fe76:a6eb/64 scope link
valid_lft forever preferred_lft forever在命名空间内外查看路由表:
复制代码代码如下:root@w:~# ip route list
default via 192.168.3.1 dev eth0 proto static
192.168.3.0/24 dev eth0 proto kernel scope link src 192.168.3.122
192.168.5.0/24 dev veth0 proto kernel scope link src 192.168.5.5
root@w:~# ip netns exec ns1 ip route list
192.168.5.0/24 dev veth1 proto kernel scope link src 192.168.5.10最后,将虚拟网卡连到物理网卡上,我们需要用到桥接。这里做的是将 veth0桥接到 eth0,而 ns1命名空间内则使用 DHCP自动获取 IP地址:
复制代码代码如下:root@w:~# brctl addbr br0
root@w:~# brctl addif br0 eth0
root@w:~# brctl addif br0 veth0
root@w:~# ifconfig eth0 0.0.0.0
root@w:~# ifconfig veth0 0.0.0.0
root@w:~# dhclient br0
root@w:~# ip addr list br0
7: br0: mtu 1500 qdisc noqueue state UP
link/ether 00:0c:29:65:25:9e brd ff:ff:ff:ff:ff:ff
inet 192.168.3.122/24 brd 192.168.3.255 scope global br0
inet6 fe80::20c:29ff:fe65:259e/64 scope link
valid_lft forever preferred_lft forever为网桥 br0分配的 IP地址为192.168.3.122/24。接下来为命名空间分配地址:
复制代码代码如下:root@w:~# ip netns exec ns1 dhclient veth1
root@w:~# ip netns exec ns1 ip addr list
1: lo: mtu 65536 qdisc noop state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 12:bd:b6:76:a6:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.3.248/24 brd 192.168.3.255 scope global veth1
inet6 fe80::10bd:b6ff:fe76:a6eb/64 scope link
valid_lft forever preferred_lft forever现在, veth1的 IP被设置成 192.168.3.248/24了。
IDEA中如何快速添加命名空间
您好,这样的:
安装JDK
根据自己的系统情况,在百度搜索JDK的下载、安装和环境变量配置方式。
1、在xp环境下安装JDK
2、在win7环境下安装JDK
3、在win7 64位环境下安装JDK
2
安装Tomcat
参照步骤一,到百度经验搜索Tomcat,根据教程下载和安装Tomcat
1、进入Tomcat7.0的官方下载页面,地址如下
2、在页面中点击以下文字下载Tomcat7.0
“32-bit/64-bit Windows Service Installer”
3、安装
下载完毕后,双击打开,按照提示一路下一步即可
安装完毕后,不需要启动Tomcat服务器程序
3
安装Intellij Idea 14
1、进入官方网站下载页面,地址如下
2、点击页面左下角按钮,即可下载Idea最新完整版
“Download Ultimate”
3、安装
下载完毕后双击打开安装
END
首次配置Intellij Idea 14
1
是否导入配置文件
Idea可以自定义的项目非常多,你在根据个人喜好设置后,可以导出配置文件,以在其他机器上快速导入配置。在此选否。
2
输入序列号
我才不会告诉你百度上可以搜索Idea+序列号
如果有条件请支持正版
3
同意使用协议
4
选择主题风格
毫无疑问选右边那个
5
选装插件
如果你对JAVA有一定的了解,建议逐块点Customize...查看详情,把不需要的插件前面的勾去掉。如果不熟悉,可以参照下图,把没有红线圈起来的部分全部点Disable all全部禁用(只保留Java Frameworks、Web Development、Application Servers、Database Tools等)。启用过多不需要的插件会使Idea变慢。选好以后下一步。
6
选装特色插件
如果你需要阅读本文,说明这些插件你还用不上,下一步。
END
创建Struts项目
1
新建项目
选择项目使用的SDK(首次使用IDEA时配置)
1、【new】-【SDK】
2、【选中jdk的安装目录】-【OK】
注意是jdk目录,不是jre目录
选择项目使用的Application Server(首次使用IDEA时配置)
1、【new】-【Tomcat Server】
2、【...】
3、【选择Tomcat 7.0目录】-【OK】
选择项目所需要的库和框架
这里勾选Web Application和Struts2
给项目起名字
点Finish即完成项目的建立,然后Idea开始下载和生成所需要的文件
过程中可能因网络问题导致库文件下载失败,在弹出提示时点Try again即可
进入工作空间
下图即我们刚刚建立的工作空间及空间下唯一的一个项目,为了省事,这个项目和工作空间同级了。按照从其他IDE过来朋友的习惯,应该是new一个Empty project当做工作空间,然后在该project下new一个module。
设置项目结构
点击菜单栏【File】-【Project Structure】
或者直接【Ctrl】+【Alt】+【Shift】+【S】
按下图步骤,在图中右侧的Struts上单击鼠标右键,选择将Struts库加入项目的/WEB-INF/lib目录中
这样在发布项目的时候,IDEA就会把sturts2的库文件输出到相应的目录下
新建一个helloworld.jsp
1、在web目录上单击鼠标右键,选择new一个jsp
2、把jsp命名为helloworld
3、在helloworld.jsp中输入下图中高亮部分代码
编辑struts.xml
1、双击打开src目录下的struts.xml
2、在<struts>节点中,加入下图中高亮部分代码
调试项目
点击菜单栏的【Run】-【Debug】
或者点击IDEA界面右上角的Debug按钮(如下图所示)
当IDEA界面右下角的Output输出窗口提示“...has finished in 157 ms”即发布完成
浏览器访问测试
打开浏览器,在地址栏输入
如何删除dfs残留下的命名空间
答案:
要删除DFS留下的命名空间残留,通常涉及多个步骤。具体的做法依赖于你是在哪种编程环境或使用的具体技术框架中进行DFS操作。以下是常见情况的指导步骤:
详细解释:
在多数编程语境中,特别是在图形理论或网络分析中使用的DFS算法,一般不会直接留下所谓的“命名空间残留”。命名空间通常指的是编程环境中用于组织代码、避免命名冲突的一种结构。例如,在Python中,我们使用点号来访问对象属性或模块中的函数,这些都属于命名空间的一部分。
然而,如果你在特定的框架或库中使用了DFS算法,并且担心有残留的命名空间影响你的程序或系统性能,你可以采取以下步骤来清理和删除这些残留:
1.检查代码和框架文档:首先回顾你的代码和所使用的框架或库的文档。确认DFS算法的使用是否正确关闭或释放了所有资源。有时候,框架会提供清理函数或方法来清理使用过的命名空间。
2.手动清理:如果框架没有提供自动清理机制,你可能需要手动清理那些不再需要的变量或对象。这可能涉及到释放内存、关闭文件或网络连接等。确保在代码逻辑中妥善处理这些资源。
3.重启应用程序或服务:在某些情况下,重启应用程序或服务可以清除残留的命名空间或其他系统资源。这通常适用于那些长时间运行的服务器应用程序或系统服务。
4.检查系统资源监控工具:使用系统资源监控工具来检查内存和CPU使用情况。这有助于识别是否有任何残留的命名空间或其他资源占用问题。如果发现异常,可以进一步调查并采取相应的清理措施。
请注意,具体的步骤取决于你的编程环境、使用的库以及你的应用程序的具体需求。在采取任何清理措施之前,确保理解你的编程环境和所使用的技术细节,避免误操作导致的问题。如果涉及复杂的系统或大型项目,考虑咨询相关领域的专家意见。
如果你还想了解更多这方面的信息,记得收藏关注本站。