NS

namespace 是 Linux 内核用来隔离内核资源的方式

Linux namespace资源:

  • Mount: 挂载点
  • Network: 网络设备/协议栈/端口
  • IPC: 进程间通信
  • USR: 用户和用户组
  • PID: 进程
  • UTS: 主机名和域名
  • Cgroup: 控制组
  • Time

Cgroup

Cgroup: Control Groups.是linux下用于对一个或一组进程资源控制和监控的机制.可以管理cpu, memory,diskIO 等资源.不同资源的具体管理工作由相应的cgrouup子系统来实现.

cgroup在不同的系统资源管理子系统中以层级树(Hierarchy)的方式来组织管理, 每个cgroup可以包含其它子cgroup.

ls -l /sys/fs/cgroup

cgroup子系统:

  • cpu
  • cpuacct
  • cpuset
  • memory
  • blkio
  • devices
  • freezer
  • ns
  • pid
  • net_cls
  • net_prio

lsns

查看系统的namespace

ns类型: mnt, net, ipc, user, pid, uts, cgroup

$lsns -l
$lsns -t net

unshare

使用非共享的NS运行程序

// 创建unshare 的 ns类型.
$unshare -f -m/-n/-i/-U/-p/-u/-C ... 

// 在net类型的namespace执行sleep命令
$unshare -fn sleep 10

nsenter

ns enter: Namespace enter.

nsenter - run program with namespaces of other processes

$ nsenter [options] [program [arguments]]

// 指定ns的目标进程,可以通过nsls查看.
$ nsenter -t/--target  

// 进入所有类型的ns.
$ nsenter -a --all ...
// 进入指定类型的ns
$ nsenter -m/-u/-i/-n/-p/-C/-U ...

// 进入指定ns的指定进程
$ nsenter -t <pid> -n ip a

$ nsenter -S/-G/-r/-w ...

$ nsenter -F/--no-fork ...

$ nsenter -Z/--follow-context ...