unshare 理解 Linux 命名空间

news/2025/1/7 18:48:21/文章来源:https://www.cnblogs.com/menkeyi/p/18655285

1. 什么是 unshare

unshare 是 Linux 中的一个命令,用于在新的命名空间中运行程序。命名空间是 Linux 内核提供的一种隔离机制,允许进程组拥有独立的系统资源视图,如进程 ID、网络、挂载点等。unshare 常用于容器技术的底层实现中,帮助创建隔离的环境。


2. 常见的命名空间类型

Linux 支持多种命名空间,每种命名空间隔离不同的资源:

  • PID 命名空间:隔离进程 ID。
  • Mount 命名空间:隔离文件系统挂载点。
  • UTS 命名空间:隔离主机名和域名。
  • Network 命名空间:隔离网络接口、IP 地址、路由表等。
  • User 命名空间:隔离用户和组 ID。
  • IPC 命名空间:隔离进程间通信资源。
  • Cgroup 命名空间:隔离控制组(cgroup)视图。

示例 1:创建新的 PID 命名空间

步骤 1:创建新的 PID 命名空间

root@compute01:~# unshare --pid --fork bash

步骤 2:查看进程列表

root@compute01:~# ps -aux | head -n10
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0 167080 12288 ?        Ss    2024   0:40 /lib/systemd/systemd --system --deserialize 23
root           2  0.0  0.0      0     0 ?        S     2024   0:01 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<    2024   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<    2024   0:00 [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I<    2024   0:00 [slub_flushwq]
root           6  0.0  0.0      0     0 ?        I<    2024   0:00 [netns]
root           8  0.0  0.0      0     0 ?        I<    2024   0:00 [kworker/0:0H-kblockd]
root          11  0.0  0.0      0     0 ?        I<    2024   0:00 [mm_percpu_wq]
root          12  0.0  0.0      0     0 ?        S     2024   0:00 [rcu_tasks_rude_]
  • 问题ps -aux 仍然显示主机上的所有进程,因为 /proc 文件系统未隔离。

步骤 3:重新挂载 /proc 文件系统

root@compute01:~# mount -t proc proc /proc

步骤 4:再次查看进程列表

root@compute01:~# ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   8160  4308 pts/2    S    14:10   0:00 bash
root          11  0.0  0.0  10732  3664 pts/2    R+   14:10   0:00 ps -aux
  • 结果:只显示当前命名空间中的进程。

示例 2:创建新的 Mount 命名空间

步骤 1:创建新的 Mount 命名空间

root@compute01:~# unshare --mount --fork bash

步骤 2:查看当前挂载点

root@compute01:~# df -Th
Filesystem            Type   Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv--0 xfs    1.8T  1.3T  516G  72% /
tmpfs                 tmpfs 1008G  892K 1008G   1% /dev/shm
tmpfs                 tmpfs  202G  4.3M  202G   1% /run
tmpfs                 tmpfs  5.0M     0  5.0M   0% /run/lock
tmpfs                 tmpfs  202G  8.0K  202G   1% /run/user/1001
tmpfs                 tmpfs  202G  8.0K  202G   1% /run/user/0
/dev/sda1             vfat   1.1G  6.1M  1.1G   1% /boot/efi

步骤 3:创建并挂载临时文件系统

root@compute01:~# mkdir /tmp/mnt
root@compute01:~# mount -t tmpfs tmpfs /tmp/mnt

步骤 4:再次查看挂载点

root@compute01:~# df -Th
Filesystem            Type   Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv--0 xfs    1.8T  1.3T  516G  72% /
tmpfs                 tmpfs 1008G  892K 1008G   1% /dev/shm
tmpfs                 tmpfs  202G  4.3M  202G   1% /run
tmpfs                 tmpfs  5.0M     0  5.0M   0% /run/lock
tmpfs                 tmpfs  202G  8.0K  202G   1% /run/user/1001
tmpfs                 tmpfs  202G  8.0K  202G   1% /run/user/0
/dev/sda1             vfat   1.1G  6.1M  1.1G   1% /boot/efi
tmpfs                 tmpfs 1008G     0 1008G   0% /tmp/mnt
  • 结果/tmp/mnt 挂载点只在当前命名空间中可见。

步骤 5:退出命名空间并验证

root@compute01:~# exit
root@compute01:~# df -Th
Filesystem            Type   Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv--0 xfs    1.8T  1.3T  516G  72% /
tmpfs                 tmpfs 1008G  892K 1008G   1% /dev/shm
tmpfs                 tmpfs  202G  4.3M  202G   1% /run
tmpfs                 tmpfs  5.0M     0  5.0M   0% /run/lock
/dev/sda1             vfat   1.1G  6.1M  1.1G   1% /boot/efi
tmpfs                 tmpfs  202G  8.0K  202G   1% /run/user/1001
tmpfs                 tmpfs  202G  8.0K  202G   1% /run/user/0
  • 结果:退出命名空间后,/tmp/mnt 挂载点不再可见。

示例 3:创建新的 UTS 命名空间

步骤 1:创建新的 UTS 命名空间

root@compute01:~# unshare --uts --fork bash

步骤 2:查看当前主机名

root@compute01:~# hostname
compute01

步骤 3:修改主机名

root@compute01:~# hostname newhostname
root@compute01:~# hostname
newhostname
  • 结果:主机名已修改为 newhostname,且只影响当前命名空间。

步骤 4:退出命名空间并验证

root@compute01:~# exit
root@compute01:~# hostname
compute01
  • 结果:退出命名空间后,主机名恢复为 compute01

示例 4:创建新的 Network 命名空间

步骤 1:创建新的 Network 命名空间

root@compute01:~# unshare --net --fork bash

步骤 2:查看网络接口

root@compute01:~# ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  • 结果:只显示 lo 回环接口,其他网络接口被隔离。

步骤 3:退出命名空间并验证

root@compute01:~# exit
root@compute01:~# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
  • 结果:退出命名空间后,恢复显示所有网络接口。

示例 5:创建新的 User 命名空间

步骤 1:创建新的 User 命名空间

root@compute01:~# unshare --user --map-root-user --fork bash

步骤 2:查看当前用户

root@compute01:~# id
uid=0(root) gid=0(root) groups=0(root)
  • 结果:当前用户在命名空间中拥有 root 权限。

步骤 3:退出命名空间并验证

root@compute01:~# exit
root@compute01:~# id
uid=1000(user) gid=1000(user) groups=1000(user)
  • 结果:退出命名空间后,恢复为普通用户权限。

总结

通过以上测试示例,你可以清晰地看到 unshare 命令如何创建和隔离不同的命名空间:

  1. PID 命名空间:隔离进程视图,需要重新挂载 /proc 文件系统。
  2. Mount 命名空间:隔离文件系统挂载点,挂载操作只影响当前命名空间。
  3. UTS 命名空间:隔离主机名和域名。
  4. Network 命名空间:隔离网络接口、IP 地址和路由表。
  5. User 命名空间:隔离用户和组 ID。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864961.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习 - Nginx - 浅谈反向代理正向代理

一张图搞懂反向代理&正向代理反向代理 客户端发送请求 连接到互联网以后,不能直接访问到业务服务器(如Tomcat集群),需要通过Nginx反向代理才能访问,同理Tomcat返回报文数据的时候也不能直接返回给客户端,也需要通过Nginx才可以 正向代理 用户通过代理服务器(网关)访…

2025年简单好用的电脑桌面便签记事本软件

在新的一年,很多打工人希望自己可以更加高效工作,把每件事管理的井井有条,实现升职加薪。 每天使用电脑办公,想要随手记录工作事项、零散琐事,用一款电脑桌面便签或记事本软件是非常方便的。 今天为大家推荐一款2025年简单又好用的电脑桌面便签记事本软件:敬业签! ~ 桌面…

基础知识-虚拟化(Virtualization)技术

(250106) 参考资料 KVM 虚拟化技术 | cnblogs | 惨绿少年@clsn.io 虚拟化介绍 | cnblogs | 休耕 云计算与虚拟化技术发展编年史 | cnblogs | 云物互联 nova系列二:kvm介绍 | cnblogs | linhaifeng 虚拟化与容器 | cnblogs | marility 《LPIC-3-Virtualization-and-Containe…

【k8s基础】k8s 基本使用

介绍及教程大全 Kubernetes中文文档 结构模型 k8s 是经典的一对多模型,有一个主要的管理节点master和许多的工作节点slaver。当然,k8s 也可以配置多个管理节点,拥有两个以上的管理节点被称为 高可用。k8s 包括了许多的组件,每个组件都是单运行在一个docker容器中,然后通过…

Scss 入门

Scss 是对 CSS 的扩展,提供了比 CSS 更简洁的语法和更强大的功能。不过,在部署时,我们要先把 Scss 编译成 CSS,才能让浏览器识别。编译 Scss 的方法有很多,这里我们使用 VS Code 的插件 Live Sass Compiler 进行自动编译。 基本准备配置保存目录。在 VS Code 配置文件中添…

Seed Lab实验:RSAPublic-Key Encryption and Signature Lab

Seed Lab实验:RSAPublic-Key Encryption and Signature Lab笔记RSAPublic-Key Encryption and Signature Lab 1.推导RSA私钥 import gmpy2p = 0xF7E75FDC469067FFDC4E847C51F452DF q = 0xE85CED54AF57E53E092113E62F436F4F e = 0x0D88C3n = q * p phi = (p - 1) * (q - 1) d =…

双稳态触发器

双稳态触发器双稳态触发器是一种具有记忆功能的逻辑单元电路,它能储存一位二进制码。 特点有两个稳定状态“0”态和“1”态; 能根据输入信号将触发器置成“0”或“1”态; 输入信号消失后,被置成的“0”或“1”态能保存下来,即具有记忆功能。RS触发器 基本RS触发器 输入低电…

在Lazarus下的Free Pascal编程教程——以数据处置推动程序运行的模块化程序设计方法

0.前言 我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。 了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”和…

foobar2000 v2.24.1 汉化版

foobar2000 v2.24.1 汉化版 -----------------------【软件截图】---------------------- -----------------------【软件介绍】---------------------- foobar2000 是一个 Windows 平台下的高级音频播放器.包含完全支持 unicode 及支持播放增益的高级标签功能. 特色: * 支持的…

ABB机器人IO板DSQC652维修方法归纳

ABB机械手IO板DSQC652维修需要一定的专业知识和技能,以下是详细的维修步骤和注意事项:1. 初步检查断电操作:在维修前,确保机器人系统完全断电,避免触电或损坏设备。外观检查:检查DSQC652板是否有明显的物理损坏,如烧焦痕迹、裂纹或元件脱落。连接检查:检查IO板与控制器…

车载以太网一致性测试套件TAE.AETP

随着汽车电子电气架构的发展,高带宽、高速率的数据通信需求逐步涌现,具有稳定、高效特点的车载以太网技术逐步成为汽车主干网通信主流方案。为了满足复杂的通信需求,越来越多的以太网通信协议被应用到车载领域与之而来的是更多新技术的测试验证需求,经纬恒润自主研发的车载…