广州网站建设公司哪家好网页设计素材
前言
随着虚拟化技术的兴起,特别是容器技术的普及,对资源隔离的需求变得更加迫切。容器化应用要求在同一主机上运行多个相互隔离的应用实例,而这些实例需要独立的资源视图,以确保安全性和稳定性,所以 Linux 引入了 Namespace 技术。
Namespace 提供了一种轻量级的资源隔离机制,使得不同的进程可以在相互隔离的环境中运行。通过 Namespace,系统可以为每个进程创建独立的资源视图,包括进程 ID、网络接口、挂载点等,从而实现进程间的完全隔离。
Namespace 技术的引入不仅提升了系统的安全性和稳定性,还为容器技术的发展奠定了基础。它使得在同一操作系统内核上运行多个独立的应用实例成为可能,极大地提高了资源利用率和管理效率。
Namespace支持的类型
Linux Namespace 支持的常见命名空间如下:
- UTS (UNIX Time-sharing System):隔离主机名和域名
- IPC (Interprocess Communication):隔离进程间通信资源
- PID (Process ID):隔离进程 ID
- Network:隔离网络设备、IP 地址、路由表等
- Mount:隔离挂载点
- User:隔离用户和组 ID
UTS
UTS(UNIX Time-sharing System)命名空间是一种用于隔离系统标识的机制。它允许每个容器或进程组拥有独立的主机名和域名。
如下示例,主机的实际 hostname 是 hcss-ecs-73e7,创建新的UTS命名空间后修改 hostname,只在命名空间内有效,外部还是 hcss-ecs-73e7。
> hostname
hcss-ecs-73e7# 创建新的UTS命名空间
> unshare --uts --fork bash
hostname newname
> hostname
newname# 退出命名空间,还是原来的hostname
> exit
> hostname
hcss-ecs-73e7
PID
PID (Process ID) 命名空间允许不同的进程组在独立的命名空间中运行。每个命名空间都有自己的 PID 视图,这意味着同一个进程可以在不同的命名空间中拥有不同的 PID。
如下示例,创建新的PID命名空间,ps -aux
仍然显示主机上的所有进程,因为 /proc
文件系统未隔离。
/proc
文件系统是一个虚拟文件系统,提供了关于内核和运行进程的信息。挂载 /proc
文件系统后,你可以通过访问 /proc
目录来查看和操作这些信息。通常,/proc
文件系统在系统启动时自动挂载。
> unshare --pid --fork bash
> ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
......
root 1983 0.0 0.4 380268 8904 ? Sl 15:08 0:00 /usr/local/uniagentd/bin/uniagentd
root 2086 0.0 0.5 17096 9712 ? Ss 15:09 0:00 /lib/systemd/systemd --user
root 2087 0.0 0.2 104036 3988 ? S 15:09 0:00 (sd-pam)
root 2247 0.0 0.6 17156 11144 ? Ss 15:09 0:00 sshd: root@pts/1
root 2296 0.0 0.3 9200 5692 pts/1 Ss 15:09 0:00 -bash
root 2371 0.0 0.5 16448 10064 ? Ss 15:10 0:00 sshd: root [priv]
sshd 2372 0.0 0.3 15440 5444 ? S 15:10 0:00 sshd: root [net]
root 2373 0.0 0.2 10732 3668 pts/1 R+ 15:10 0:00 ps -aux
在命名空间内重新挂载 proc,ps -aux
显示的只有命名空间内的几个进程,且 PID 是从 1 重新计数的。
> mount -t proc proc /proc
> ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 8160 4088 pts/1 S 15:11 0:00 bash
root 9 0.0 0.1 10732 3604 pts/1 R+ 15:11 0:00 ps -aux
mount
是用于挂载文件系统的命令。-t proc
指定要挂载的文件系统类型为proc
。proc
是要挂载的源。/proc
是挂载点,即将proc
文件系统挂载到/proc
目录。
USER
USER(user namespace)命名空间用于隔离和虚拟化用户和组 ID。它允许在同一系统上运行的不同进程拥有不同的用户和组 ID 视图,从而提高安全性和灵活性。
通过用户命名空间,进程可以在容器内以 root 身份运行,而在宿主系统上仍然是非root用户。这种机制使得容器化应用程序能够在不提升系统级权限的情况下执行需要高权限的操作。
如下示例,主机当前用户是 dev,创建新的用户命名空间,并且映射为 root 用户。结果是在新的命名空间内,当前是 root 用户,但实际上它在主机上是 dev。
> id
uid=1001(dev) gid=1001(dev) groups=1001(dev)> unshare --user --map-root-user --fork bash
> id
uid=0(root) gid=0(root) groups=0(root)> exit
> id
uid=1001(dev) gid=1001(dev) groups=1001(dev)
--user
:创建一个新的用户命名空间--map-root-user
:将当前用户映射为新命名空间中的 root 用户
MOUNT
MOUNT 挂载命名空间,允许你在不影响其他进程的情况下更改挂载点。这样,你可以在新的命名空间中挂载或卸载文件系统,而这些更改对其他命名空间是不可见的。
通过创建独立的文件系统视图,可以为每个进程或进程组提供隔离的运行环境。这在容器技术中尤为重要,使得每个容器可以有自己的文件系统布局。
如下示例,创建新的 MOUNT 命名空间,并且新建/container/volume
挂载点,这个挂载点对外是不可见的,往里面写文件外部也是不可见的。
> mkdir /container/volume
> unshare --mount --fork -- bash
> mount -t tmpfs none /container/volume
> df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 14G 24G 37% /
tmpfs 886M 0 886M 0% /dev/shm
tmpfs 178M 1.2M 177M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 178M 4.0K 178M 1% /run/user/0
none 886M 4.0K 886M 1% /container/volume
# 命名空间外部
> df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 178M 1.2M 177M 1% /run
/dev/vda1 40G 14G 24G 37% /
tmpfs 886M 0 886M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 178M 4.0K 178M 1% /run/user/0
NETWORK
NETWORK 网络命名空间,允许你隔离网络环境,使得在该命名空间中运行的进程拥有独立的网络接口、路由表等。
如下示例,主机有两个网络接口,分别是lo
本地回环接口,用于网络软件的本地通信。eth0
以太网接口,用于局域网中与其它设备通信。
# 命名空间外部
> ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether fa:16:3e:f0:4b:a1 brd ff:ff:ff:ff:ff:ffaltname enp0s3altname ens3inet 192.168.3.89/20 brd 192.168.15.255 scope global dynamic noprefixroute eth0valid_lft 315356174sec preferred_lft 315356174secinet6 fe80::f816:3eff:fef0:4ba1/64 scope linkvalid_lft forever preferred_lft forever
创建一个新的网络命名空间,发现只有lo
本地回环网络接口。
> unshare --net bash
> ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
没有以太网接口,意味着当前命名空间内无法与外部通信,需要重新配置。
> ping 8.8.8.8
ping: connect: Network is unreachable
IPC
IPC(Interprocess Communication)命名空间用于隔离进程间通信资源,如消息队列、信号量和共享内存。
如下示例,创建一个新的 IPC 命名空间,并创建一个共享内存段,它只在命名空间内可见,对外是不可见的。
> unshare --ipc --fork bash
# 创建一个共享内存段
> ipcmk -M 1000
# 查看共享内存段
> ipcs -m------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x2156d547 0 root 644 1000 0