如何监控容器中的进程?

时间:2015-05-19 19:39:08

标签: process linux-kernel cgroups linux-containers

我目前正在研究LXC容器API。我试图弄清楚如何让操作系统知道当前正在运行的进程属于哪个容器。通过这种方式,OS可以根据容器为进程分配资源。

1 个答案:

答案 0 :(得分:0)

我假设您的查询是 - 给定PID,如何找到运行此进程的容器?

我将根据我最近阅读的Linux容器尝试回答这个问题。可以将每个容器配置为以其自己的用户和组ID映射开始。

来自https://linuxcontainers.org/lxc/manpages/man5/lxc.container.conf.5.html

  

<强> lxc.id_map
      必须提供四个值。首先是一个字符,“u”或“g”,用于指定是否正在映射用户或组ID。接下来是   在容器的用户命名空间中看到的第一个用户标识。下一个   是在主机上看到的用户标识。最后,一个范围表明了   要映射的连续ID的数量。

所以,你可以在配置文件中添加这样的东西(例如:〜/ .config / lxc / default.conf):

lxc.id_map = u 0 100000 65536
lxc.id_map = g 0 100000 65536

以上基本上意味着0到65536之间的uid / gid被映射到100000和1655356之间的数字。因此,容器上的uid(0)将在主机上被视为100000

例如,在容器内部,它看起来像这样:

root@unpriv_cont:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 02:18 ?        00:00:00 /sbin/init
root       157     1  0 02:18 ?        00:00:00 upstart-udev-bridge --daemon

但是在主机上,相同的过程将如下所示:

ps -ef | grep 100000
100000    2204  2077  0 Dec12 ?        00:00:00 /sbin/init
100000    3170  2204  0 Dec12 ?        00:00:00 upstart-udev-bridge --daemon
100000    1762  2204  0 Dec12 ?        00:00:00 /lib/systemd/systemd-udevd --daemon

因此,您可以通过查找其UID并将其与该容器配置中定义的映射相关联来查找进程的容器。