如何检查 Linux 中内核命名空间是否活跃

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何检查 Linux 中内核命名空间 (kernel namespaces) 是否处于活动状态。我们将探索不同的方法来识别和验证命名空间的存在,这些命名空间对于进程隔离和容器化至关重要。

你将首先使用 lsns 命令列出系统上的各种命名空间,了解它们的类型和关联进程。接下来,你将检查 /proc/self/ns 目录中的命名空间链接,以了解进程如何与特定的命名空间关联。最后,你将使用 ip netns 命令专门验证网络命名空间,这是一个用于管理网络隔离的常用工具。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/RemoteAccessandNetworkingGroup(["Remote Access and Networking"]) linux(("Linux")) -.-> linux/PackagesandSoftwaresGroup(["Packages and Softwares"]) linux/BasicSystemCommandsGroup -.-> linux/read("Input Reading") linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/SystemInformationandMonitoringGroup -.-> linux/ps("Process Displaying") linux/RemoteAccessandNetworkingGroup -.-> linux/ip("IP Managing") linux/PackagesandSoftwaresGroup -.-> linux/apt("Package Handling") subgraph Lab Skills linux/read -.-> lab-558722{{"如何检查 Linux 中内核命名空间是否活跃"}} linux/ls -.-> lab-558722{{"如何检查 Linux 中内核命名空间是否活跃"}} linux/ps -.-> lab-558722{{"如何检查 Linux 中内核命名空间是否活跃"}} linux/ip -.-> lab-558722{{"如何检查 Linux 中内核命名空间是否活跃"}} linux/apt -.-> lab-558722{{"如何检查 Linux 中内核命名空间是否活跃"}} end

使用 lsns 列出命名空间

在这一步中,你将学习如何使用 lsns 命令列出系统上存在的命名空间。命名空间 (Namespaces) 是 Linux 中的一个基本概念,它为各种系统资源(如进程、网络接口、挂载点等)提供隔离。这种隔离是容器等技术的关键。

lsns 命令是 util-linux 软件包的一部分,用于列出系统上命名空间的相关信息。

首先,我们要确保 util-linux 软件包已安装。虽然它通常是存在的,但进行检查是一个好习惯。我们可以使用 apt 来完成此操作。

如果终端尚未打开,请打开它。你可以在桌面左侧找到 Xfce Terminal 图标。

现在,输入以下命令来更新软件包列表:

sudo apt update

按下回车键。你可能会看到类似以下的输出:

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
...
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
...

接下来,让我们安装 util-linux。输入以下命令并按下回车键:

sudo apt install util-linux

你可能会看到表明该软件包已安装的输出,这是正常的。如果进行安装,你会看到进度条和确认信息。

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
util-linux is already the newest version (x.xx.x-xu).
0 upgraded, 0 newly installed, 0 to remove and xx not upgraded.

现在我们确定 lsns 可用了,让我们用它来列出命名空间。输入以下命令并按下回车键:

lsns

你会看到类似以下的输出,显示不同类型的命名空间以及与之关联的进程:

        NS TYPE   NPROCS   PID PPID       CMD
4026531835 cgroup      1     1    0     /sbin/init
4026531836 pid         1     1    0     /sbin/init
4026531837 user        1     1    0     /sbin/init
4026531838 uts         1     1    0     /sbin/init
4026531839 ipc         1     1    0     /sbin/init
4026531840 mnt         1     1    0     /sbin/init
4026531841 net         1     1    0     /sbin/init
4026532720 cgroup     10   700  699 /usr/lib/xfce4/xfconf/xfconfd
4026532721 pid        10   700  699 /usr/lib/xfce4/xfconf/xfconfd
4026532722 user       10   700  699 /usr/lib/xfce4/xfconf/xfconfd
4026532723 uts        10   700  699 /usr/lib/xfce4/xfconf/xfconfd
4026532724 ipc        10   700  699 /usr/lib/xfce4/xfconf/xfconfd
4026532725 mnt        10   700  699 /usr/lib/xfce4/xfconf/xfconfd
4026532726 net        10   700  699 /usr/lib/xfce4/xfconf/xfconfd
...

输出显示了诸如 NS(命名空间 ID)、TYPE(命名空间类型,例如 cgroup、pid、user、uts、ipc、mnt、net)、NPROCS(命名空间中的进程数量)、PID(进程 ID)、PPID(父进程 ID)和 CMD(命令)等列。

此命令让你对系统上活动的命名空间以及在其中运行的进程有一个高层次的了解。

点击 Continue 进入下一步。

检查 /proc/self/ns 中的命名空间链接

在上一步中,你使用 lsns 查看了系统上的命名空间列表。现在,让我们来探究一个正在运行的进程是如何与这些命名空间相关联的。

在 Linux 中,每个进程在 /proc/<pid>/ns/ 下都有一个特殊的目录,其中包含指向该进程所属命名空间的符号链接。/proc/self/ 目录是指向当前正在运行的进程(在这种情况下,即你的终端会话)的 /proc/<pid>/ 目录的符号链接。

让我们列出 /proc/self/ns/ 目录的内容,以查看当前终端进程的命名空间链接。

在终端中输入以下命令并按下回车键:

ls -l /proc/self/ns/

你会看到类似以下的输出:

total 0
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 cgroup -> "cgroup:[4026532720]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 ipc -> "ipc:[4026532724]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 mnt -> "mnt:[4026532725]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 net -> "net:[4026532726]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 pid -> "pid:[4026532721]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 user -> "user:[4026532722]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 uts -> "uts:[4026532723]"

每一行代表一种不同类型的命名空间(cgroupipcmntnetpiduseruts),并且是一个符号链接(->),指向内核内部表示中的实际命名空间文件。方括号中的数字(例如 [4026532720])是该特定命名空间的唯一 ID,你在上一步 lsns 命令的输出中已经看到过。

这表明你当前的终端进程是几个不同命名空间的一部分,为其提供了对某些系统资源的独立视图。

理解 /proc/<pid>/ns/ 对于调试和检查正在运行的进程的命名空间配置至关重要,特别是在容器化环境中。

点击 Continue 继续。

使用 ip netns 验证网络命名空间

在前面的步骤中,你了解了命名空间的一般概念,以及如何查看进程的命名空间链接。现在,让我们专门关注网络命名空间 (Network namespaces),以及如何使用 ip 命令来管理它们。

网络命名空间为进程提供了独立的网络栈,包括网络接口、IP 地址、路由表和防火墙规则。这对于隔离网络流量至关重要,在容器和虚拟网络中都会用到。

ip 命令是 Linux 中用于网络配置的强大工具。ip netns 子命令专门用于管理网络命名空间。

要列出当前配置的网络命名空间,请使用 ip netnslist 选项。

在终端中输入以下命令并按下回车键:

ip netns list

在典型的 LabEx 环境(通常是一个容器)中,一开始你可能看不到该命令列出任何显式创建的网络命名空间。输出可能为空:

这是因为你的终端运行所在的主网络命名空间是默认的,而 ip netns list 通常显示的是那些被显式创建并注册的命名空间。

不过,你仍然可以通过检查 /proc/self/ns/net 符号链接来查看当前进程所属的网络命名空间,就像你在上一步中所做的那样。ip netns 命令更多地用于管理你可能为特定隔离目的而创建的 命名 网络命名空间。

虽然在这个入门实验中我们不会创建新的网络命名空间,但了解 ip netns list 是查看它们的命令,对于你未来学习网络隔离非常重要。

你现在已经使用 lsns 探索了命名空间,检查了 /proc 中特定于进程的命名空间链接,并学习了列出网络命名空间的命令。

点击 Continue 完成实验。

总结

在这个实验中,我们学习了如何检查 Linux 中活跃的内核命名空间 (Kernel namespaces)。首先,我们使用 lsns 命令列出了系统上存在的各种命名空间,了解到命名空间为系统资源提供隔离,是容器技术的基础。我们通过 apt 确保包含 lsnsutil-linux 软件包已安装。

在使用 lsns 列出命名空间之后,后续步骤(在提供的内容中未详细说明)将包括检查 /proc/self/ns 目录内的命名空间链接,以及专门使用 ip netns 命令验证网络命名空间。这些方法提供了检查和确认不同类型内核命名空间的存在和状态的其他方式。