【问题标题】:How to monitor the process in a container?如何监控容器中的进程?
【发布时间】:2015-07-31 19:35:37
【问题描述】:

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

【问题讨论】:

    标签: process linux-kernel cgroups linux-containers


    【解决方案1】:

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

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

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

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

    因此,您可以在配置文件中添加类似的内容(例如:~/.config/lxc/default.conf):

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

    上面基本上意味着 0 到 65536 之间的 uids/gids 映射到 100000 到 1655356 之间的数字。因此,容器上 0(根)的 uid 将被视为主机上的 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 并将其与该容器配置中定义的映射相关联来找到进程的容器。

    【讨论】:

    • 非常感谢。但我不是在寻找命令行解决方案。我需要一种让操作系统识别进程属于哪个容器的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    相关资源
    最近更新 更多