lsns 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,属于容器与云族。它是 nsenter 的好搭档:nsenter 需要一个目标 PID/namespace,lsns 先帮你把系统里都有哪些 namespace 列出来。
一、基本用法
bash
lsns # 列出所有 namespace
lsns -t net # 只列网络 namespace(排查容器网络最常用)
lsns -t pid # 只列 pid namespace
lsns -t mnt # 只列挂载 namespace
lsns -J # JSON 输出,便于脚本解析
lsns -o NS,TYPE,NPROCS,PID,COMMAND # 指定列
sudo lsns # 需要权限才能看到其他用户进程的 ns典型输出列:
| 列 | 含义 |
|---|---|
| NS | namespace 标识符(inode 号),相同数字=同一个 namespace |
| TYPE | net/mnt/pid/uts/ipc/user/cgroup |
| NPROCS | 该 namespace 内进程数(1 通常是独立/残留) |
| PID / COMMAND | 命名空间内的代表进程 |
二、和 nsenter 配合排障
bash
# 1. 找到目标容器/服务的 net namespace(看 COMMAND 或 NPROCS)
sudo lsns -t net
# 2. 取其中一个 PID,用 nsenter 进入排查
sudo nsenter -t <PID> -n ss -tanp多个容器若共享 netns(如 K8s 同一 Pod 的 pause + 业务容器),它们的 NS 编号相同——这是判断"哪些容器在同一网络栈"的直接方法。
三、底层:/proc/<pid>/ns
lsns 的数据来自 /proc/<pid>/ns/ 下的符号链接:
bash
ls -l /proc/1234/ns/net # net:[4026531956],括号内即 inode
readlink /proc/1234/ns/net
# 两进程 readlink 结果相同 ⇒ 同一 namespace还可以用 ip netns 绑定命名网络做调试,或用 unshare 创建新 namespace 做实验。
若某 namespace 的 NPROCS 为 1 且 COMMAND 是已退出服务的残留线程,可能是挂载了该 ns 的句柄(如
ip netns持有)使其未被释放;这与进程/资源泄漏排查相关。
相关命令
进入 namespace 用 nsenter,新建隔离用 unshare,容器进程定位用
docker inspect/crictl,原理见容器 namespace 概念章。
总结
lsns = 列出系统现有 Linux namespace 的清单:按 NS inode 去重,给出类型、进程数 NPROCS 和代表进程,-t net 过滤网络命名空间、-J 输出 JSON;它读 /proc/pid/ns,用来发现容器 netns(同 Pod 共享时 NS 编号相同)并把 PID 交给 nsenter 进入排查,是 nsenter 的前置导航命令。