
正文
linux命名空间命令 linux 命名文件
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Linux 6种名称空间
6种名称空间:
命名空间和cgroups是软件集装箱化(Docker)的大部分新趋势的主要内核技术之一。 简单来说,cgroups是一种计量和限制机制,它们控制您可以使用多少系统资源(CPU,内存)。 另一方面,命名空间限制了您可以看到的内容。 由于命名空间进程有自己的系统资源视图
UTS namespace(UNIX Timesharing System包含了运行内核的名称、版本、底层体系结构类型等信息)用于系统标识。包含了hostname 和域名domainname 。它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器
相关问答
Q1: linux的命名空间到底是什么,一直搞不懂
抽象的概念。看了一下别人的解析,写一下:
从Linux 2.6.24版的内核开始,Linux 就支持6种不同类型的命名空间。(具体也没记住)
命名空间是一种轻量级的虚拟化手段;
传统的虚拟化软件,是虚拟化多个不同的操作系统,对共享资源的限制很大;
通过提供命名空间,可以让进程与进程之间,用户与用户之间彼此看不到对方。
命名空间,相当于容器。
命名空间,本质上建立了系统的不同视图。
Q2: 网络命名空间ip netns
namespace和cgroup是软件容器化趋势中的两个主要内核技术。简单来说linux命名空间命令,cgroup是一种对进程进行统一的资源监控和限制linux命名空间命令,控制着使用多少系统资源(CPUlinux命名空间命令,内存等)。而namespace是对全局系统资源的一种封装隔离,它通过Linux内核对系统资源进行隔离和虚拟化的特性。
Linux内核2.4仅实现了mount namespace,从内核 2.6开始实现了,在内核 3.8 中才宣布完成6种类型的命名空间:Process ID (pid)、Mount (mnt)、Network (net)、InterProcess Communication (ipc)、UTS、User ID (user)。随着Linux自身的发展以及容器技术持续发展带来的需求,会支持有新的namespace,比如在内核 4.6 中添加了Cgroup namespace。
Linux提供多个API用来操作namespace,分别是clone()、setns() 和unshare() 函数,为了确定隔离的namespace,在使用这些 API 时,通常要指定调用参数:CLONE_NEWIPC 、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS和CLONE_NEWCGROUP。
从Linux 3.8的内核开始,/proc/[pid]/ns 目录下会包含进程所属的 namespace 信息。
pid命名空间会使得进程只能看到同一pid命名空间中的进程。mnt命名空间,可以将进程附加到自己的文件系统(如chroot)。本文只关注网络命名空间 Network (net)。
网络命名空间为命名空间内的所有进程提供了全新隔离的网络协议栈。这包括网络接口,路由表和iptables规则。通过使用网络命名空间可以实现网络虚拟环境,实现彼此之间的网络隔离,这对于云计算中租户网络隔离非常重要,Docker中的网络隔离也是基于此实现的。
备注:ip命令要以root用户身份运行。
1.新增一个网络命名空间(名称netns0)
# ip netns add netns0
从系统的角度来看,当通过clone()系统调用创建一个新进程时,传递CLONE_NEWNET标志,在新进程中创建一个全新的网络命名空间。从用户的角度来看,使用ip命令创建一个新的名为netns0的持久网络命名空间。创建命名空间后,ip命令会在/var/run/netns目录下增加一个netns0文件。
列出系统中可用的命名空间:
# ip netns show 或ip netns list
2. 网络命名空间包含自己的网络资源:接口,路由表等。默认添加的网络命名空间netns0中会自动添加一个loopback(回环)接口但要手工开启回环口lo网卡
# ip netns exec netns0 ip link set lo up
查看网络lo回环口信息:
# ip netns exec netns0 ip a
# ip netns exec netns0 ping 127.0.0.1 -c 3
1) 创建2个网络命名空间
# ip netns add netns0
# ip netns add netns1
2) 模拟创建一根网线:
2.1) 先创建1对veth虚拟网络设备
# ip link add name vnet0 type veth peer name vnet1
# ip addr show
1: vnet1@vnet0: BROADCAST,MULTICAST, M-DOWN mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 52:42:c3:02:54:38 brd ff:ff:ff:ff:ff:ff
2: vnet0@vnet1: BROADCAST,MULTICAST, M-DOWN mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether a6:20:57:dc:c6:dd brd ff:ff:ff:ff:ff:ff
注意:这两个虚拟网络设备都属于“default” 或“global”命名空间,和物理网卡一样。
2.2) 把veth0设置到netns0命名空间,把veth1设置到netns1命名空间:
# ip link set vnet0 netns netns0
# ip link set vnet1 netns netns1
2.3) 给两个主机分别配置ip(进入命名空间启动网卡然后给网卡配置ip),然后互ping
# ip netns exec netns0 ip link set vnet0 up
# ip netns exec netns1 ip link set vnet1 up
# ip netns exec netns0 ip a add 192.168.0.2 dev vnet0
# ip netns exec netns1 ip a add 192.168.0.3 dev vnet1
# ip netns exec netns0 ping 192.168.0.3
connect: 网络不可达
2.4) 添加路由(互相配置对端ip为网关,为什么?)
# ip netns exec netns0 ip route add 192.168.0.3 dev vnet0
# ip netns exec netns1 ip route add 192.168.0.2 dev vnet1
在netns0中去ping netns1主机
# ip netns exec netns0 ping 192.168.0.3 -c 2
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.021 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.047 ms
--- 192.168.0.3 ping statistics ---
以上仅限于同一主机上网络可达,但不同主机上的网络不通。
3) 在主机上配置ip转发,并且在 iptables 设置伪装。
ip转发指:当Linux主机存在多个网卡的时候,允许一个网卡的数据包转发到另外一张网卡。 iptables的介绍,请点linux命名空间命令我点linux命名空间命令我哦 。
3.1) 开启ip转发
echo 1 /proc/sys/net/ipv4/ip_forward
3.2) 刷新forward规则
iptables -F FORWARD
iptables -t nat -F
3.3) 刷新nat规则
iptables -t nat -L -n
3.4) 告诉iptables伪装起来
iptables -t nat -A POSTROUTING -s 192.168.0.3/255.255.255.0 -o eth0 -j MASQUERADE # eth0连接外网
3.5) 允许veth0和eth0之间的转发
iptables -A FORWARD -i eth0 -o veth0 -j ACCEPT
iptables -A FORWARD -o eth0 -i veth0 -j ACCEPT
对namespace api的介绍
Q3: linux下的命令都是干什么用的?
前三个和最后一个是两个类型。前三个主要是Linux用来创建新的进程(线程)而设计的,exec()系列函数则是用来用指定的程序替换当前进程的所有内容。所以exec()系列函数经常在前三个函数使用之后调用,来创建一个全新的程序运行环境。Linux用init进程启动其他进程的过程一般都是这样的。
下面说fork、vfork和clone三个函数。这三个函数分别调用了sys_fork、sys_vfork、sys_clone,最终都调用了do_fork函数,差别在于参数的传递和一些基本的准备工作不同。可见这三者最终达到的最本质的目的都是创建一个新的进程。在这里需要明确一下,Linux内核中没有独立的“线程”结构,Linux的线程就是轻量级进程,换言之基本控制结构和Linux的进程是一样的(都是通过struct task_struct管理)。
fork是最简单的调用,不需要任何参数,仅仅是在创建一个子进程并为其创建一个独立于父进程的空间。fork使用COW(写时拷贝)机制,并且COW了父进程的栈空间。
vfork是一个过时的应用,vfork也是创建一个子进程,但是子进程共享父进程的空间。在vfork创建子进程之后,父进程阻塞,直到子进程执行了exec()或者exit()。vfork最初是因为fork没有实现COW机制,而很多情况下fork之后会紧接着exec,而exec的执行相当于之前fork复制的空间全部变成了无用功,所以设计了vfork。而现在fork使用了COW机制,唯一的代价仅仅是复制父进程页表的代价,所以vfork不应该出现在新的代码之中。在Linux的manpage中队vfork有这样一段话:It is rather unfortunate that Linux revived this specter from the past. The BSD man page states: "This system call will be eliminated when proper system sharing mechanisms are implemented. Users should not depend on the memory sharing semantics of vfork() as it will, in that case, be made synonymous to fork(2)."
clone是Linux为创建线程设计的(虽然也可以用clone创建进程)。所以可以说clone是fork的升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间(namespace)、有选择的继承父进程的内存、甚至可以将创建出来的进程变成父进程的兄弟进程等等。clone和fork的调用方式也很不相同,clone调用需要传入一个函数,该函数在子进程中执行。此外,clone和fork最大不同在于clone不再复制父进程的栈空间,而是自己创建一个新的。
关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html
Q4: 如何在Linux上一次删除所有网络命名空间
在Linux中linux命名空间命令,引入“命名空间”linux命名空间命令的概念是为linux命名空间命令了在不同linux命名空间命令的进程组之间隔离系统资源。作为六种不同类型的Linux命名空间之一,网络命名空间在逻辑上隔离与不同进程组之间的网络(例如,网络设备,IP地址,路由表)相关联的系统资源,从而为每个进程组提供主机网络堆栈的不同视图。此功能通常用于操作系统级虚拟化。 可以通过ip命令创建和删除Linux网络命名空间,
如下所示。
$ sudo ip netns add
’ $ sudo ip netns del
假设您要清理Linux系统上的所有现有命名空间。当然linux命名空间命令你可以用上面的ip命令逐个删除每个命名空间,但这可能很麻烦。以下是从命令行中删除所有网络命名空间的方法
方法一
该IP命令来自iproute2的包。最新的iproute2包允许ip命令为所有对象执行指定的操作(例如,对于所有现有的命名空间)。为此,它提供“-all”选项
例如,在Ubuntu 15.10或Fedora
23上,ip命令可以使用“-all”选项一次删除所有名称空间。
$ sudo ip -all netns delete
但是,如果您的Linux系统没有安装兼容的iproute2软件包,您将遇到以下错误。
选项“-all”未知,请尝试“ip-help”
方法二
对于那些没有安装最新iproute2软件包的人,可以使用xargs和ip的组合删除所有网络名称空间,如下所示。
$ ip netns | xargs -I {} sudo ip netns delete{}
基本上,您将多行命名空间列表传递给xargs,然后xargs将为每个命名空间运行ip命令。
转自 嘉为教育-rhce认证_rhce培训_linux培训_linux认证_linux考证
关于linux命名空间命令和linux 命名文件的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。






