怎样做网站导航界面,生成器,源码如何搭建网站,网络推广哪个好前言
随着虚拟化技术的兴起#xff0c;特别是容器技术的普及#xff0c;对资源隔离的需求变得更加迫切。容器化应用要求在同一主机上运行多个相互隔离的应用实例#xff0c;而这些实例需要独立的资源视图#xff0c;以确保安全性和稳定性#xff0c;所以 Linux 引入了 Na…前言
随着虚拟化技术的兴起特别是容器技术的普及对资源隔离的需求变得更加迫切。容器化应用要求在同一主机上运行多个相互隔离的应用实例而这些实例需要独立的资源视图以确保安全性和稳定性所以 Linux 引入了 Namespace 技术。
Namespace 提供了一种轻量级的资源隔离机制使得不同的进程可以在相互隔离的环境中运行。通过 Namespace系统可以为每个进程创建独立的资源视图包括进程 ID、网络接口、挂载点等从而实现进程间的完全隔离。
Namespace 技术的引入不仅提升了系统的安全性和稳定性还为容器技术的发展奠定了基础。它使得在同一操作系统内核上运行多个独立的应用实例成为可能极大地提高了资源利用率和管理效率。
Namespace支持的类型
Linux Namespace 支持的常见命名空间如下
UTS (UNIX Time-sharing System)隔离主机名和域名IPC (Interprocess Communication)隔离进程间通信资源PID (Process ID)隔离进程 IDNetwork隔离网络设备、IP 地址、路由表等Mount隔离挂载点User隔离用户和组 ID
UTS
UTSUNIX Time-sharing System命名空间是一种用于隔离系统标识的机制。它允许每个容器或进程组拥有独立的主机名和域名。
如下示例主机的实际 hostname 是 hcss-ecs-73e7创建新的UTS命名空间后修改 hostname只在命名空间内有效外部还是 hcss-ecs-73e7。 hostname
hcss-ecs-73e7# 创建新的UTS命名空间unshare --uts --fork bash
hostname newnamehostname
newname# 退出命名空间还是原来的hostnameexithostname
hcss-ecs-73e7PID
PID (Process ID) 命名空间允许不同的进程组在独立的命名空间中运行。每个命名空间都有自己的 PID 视图这意味着同一个进程可以在不同的命名空间中拥有不同的 PID。
如下示例创建新的PID命名空间ps -aux 仍然显示主机上的所有进程因为 /proc 文件系统未隔离。
/proc文件系统是一个虚拟文件系统提供了关于内核和运行进程的信息。挂载 /proc 文件系统后你可以通过访问 /proc 目录来查看和操作这些信息。通常/proc 文件系统在系统启动时自动挂载。 unshare --pid --fork bashps -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: rootpts/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在命名空间内重新挂载 procps -aux 显示的只有命名空间内的几个进程且 PID 是从 1 重新计数的。 mount -t proc proc /procps -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 -auxmount 是用于挂载文件系统的命令。-t proc 指定要挂载的文件系统类型为 proc。proc 是要挂载的源。/proc 是挂载点即将 proc 文件系统挂载到 /proc 目录。
USER
USERuser namespace命名空间用于隔离和虚拟化用户和组 ID。它允许在同一系统上运行的不同进程拥有不同的用户和组 ID 视图从而提高安全性和灵活性。
通过用户命名空间进程可以在容器内以 root 身份运行而在宿主系统上仍然是非root用户。这种机制使得容器化应用程序能够在不提升系统级权限的情况下执行需要高权限的操作。
如下示例主机当前用户是 dev创建新的用户命名空间并且映射为 root 用户。结果是在新的命名空间内当前是 root 用户但实际上它在主机上是 dev。 id
uid1001(dev) gid1001(dev) groups1001(dev) unshare --user --map-root-user --fork bashid
uid0(root) gid0(root) groups0(root) exitid
uid1001(dev) gid1001(dev) groups1001(dev)--user创建一个新的用户命名空间--map-root-user将当前用户映射为新命名空间中的 root 用户
MOUNT
MOUNT 挂载命名空间允许你在不影响其他进程的情况下更改挂载点。这样你可以在新的命名空间中挂载或卸载文件系统而这些更改对其他命名空间是不可见的。
通过创建独立的文件系统视图可以为每个进程或进程组提供隔离的运行环境。这在容器技术中尤为重要使得每个容器可以有自己的文件系统布局。
如下示例创建新的 MOUNT 命名空间并且新建/container/volume 挂载点这个挂载点对外是不可见的往里面写文件外部也是不可见的。 mkdir /container/volumeunshare --mount --fork -- bashmount -t tmpfs none /container/volumedf -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/0NETWORK
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 baship 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 unreachableIPC
IPCInterprocess 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