CentOS 7 中的命名空间机制详解
一、命名空间基础概念
命名空间(Namespace)是操作系统中用于资源隔离的重要机制。它通过将系统资源进行逻辑分组,实现不同进程或环境之间的相互独立。在 Linux 系统中,命名空间主要服务于轻量级虚拟化技术,如容器化应用。
每个命名空间内的进程只能感知到该空间内的资源状态,对外部环境完全不可见。这种隔离特性使得容器能够模拟出一个独立的操作系统环境,从而提升安全性与可管理性。
二、常见命名空间类型及功能
| 类型 | 作用范围 | 核心功能 | 说明 |
|---|---|---|---|
| 进程命名空间 | PID | 隔离进程编号空间 | 子命名空间可访问父空间,形成层级结构 |
| 网络命名空间 | 网络栈 | 独立的网卡、路由表、防火墙规则 | 支持创建虚拟网络设备并连接多个命名空间 |
| IPC 命名空间 | 进程间通信 | 隔离共享内存、消息队列等通信对象 | 同空间内进程可交互,跨空间无法通信 |
| 挂载命名空间 | 文件系统挂载点 | 独立的文件系统视图 | 实现类似 chroot 的隔离,但更安全可靠 |
| UTS 命名空间 | 主机名与域名 | 为容器提供独立的主机标识 | 使容器拥有自己的 hostname 与 NIS 配置 |
| 用户命名空间 | UID/GID 映射 | 隐藏真实用户身份,实现权限隔离 | 容器内用户可映射为宿主机非特权用户 |
三、网络命名空间实战操作
以网络命名空间为例,演示如何创建、配置和通信。
3.1 创建网络命名空间
# ip netns add test_ns
# ip netns list
test_ns
3.2 删除命名空间
# ip netns delete test_ns
3.3 在命名空间中执行命令
# ip netns exec test_ns bash
3.4 查看命名空间内的网络接口
# ip netns exec test_ns ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3.5 退出当前命名空间
# exit
3.6 批量执行网络配置指令
# ip netns exec test_ns route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
# ip netns exec test_ns iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
...
3.7 创建一对虚拟网络设备
# ip link add veth_a type veth peer name veth_b
3.8 将其中一个网卡移入命名空间
# ip link set veth_b netns test_ns
# ip netns exec test_ns ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
10: veth_b@if11: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff link-netnsid 0
3.9 从命名空间中移除网卡
# ip netns exec test_ns ip link delete veth_b
3.10 配置虚拟网卡地址并启用通信
# ip link add veth_a type veth peer name veth_b
# ip link set veth_b netns test_ns
# ip netns exec test_ns ip addr add 192.168.100.2/24 dev veth_b
# ip netns exec test_ns ip link set veth_b up
# ip netns exec test_ns ip link set lo up
# ip addr add 192.168.100.1/24 dev veth_a
# ip link set veth_a up
# ping 192.168.100.2
PING 192.168.100.2 (192.168.100.2) 56(84) bytes of data.
64 bytes from 192.168.100.2: icmp_seq=1 ttl=64 time=0.078 ms
若需访问外部网络,需开启 IP 转发:
# sysctl -w net.ipv4.ip_forward=1