我想在没有 systemd 的容器中使用 journald。这可能吗?如果可以,该怎么做?需要注意哪些问题?
答案1
Journald 是 Systemd 软件包中不可或缺的组件。systemd 管理员指南,XVII:
如果你想知道日志是什么,下面用几句话来解释一下,让你快速了解:日志是 systemd,它捕获 Syslog 消息、内核日志消息、初始 RAM 磁盘和早期启动消息以及写入所有服务的 STDOUT/STDERR 的消息,对它们进行索引并将其提供给用户。它可以并行使用,也可以代替传统的 syslog 守护程序,例如 rsyslog 或 syslog-ng。
systemd 如何处理容器在新的控制组接口例如
systemd 通过其“单元”概念,已经在对象之间实现了依赖关系网络,可以在其中进行传播,并包含强大的执行队列。此外,需要控制资源的大部分对象已经是 systemd 对象,其中最突出的是 systemd 管理的服务。
为什么这不是由独立于 systemd 的组件来管理的?
嗯,如上所述,对象之间的依赖关系网络可用于传播,再加上强大的执行引擎,这基本上就是 systemd 的本质。由于 cgroups 管理正是需要这一点,因此在 systemd 本身中实现这一点是一个显而易见的选择。
在 systemd 之外的独立“cgroup”守护进程中实现类似的传播/依赖关系网络和执行调度程序,基本上意味着第二次重新实现 systemd。此外,从 PID 1 访问此类外部服务来管理其他服务会导致 PID 1 之间产生循环依赖关系,PID 1 需要此功能来管理 cgroup 服务,但该服务仅在该服务启动完成后才可用。这种循环依赖关系当然可以解决,但会使设计变得复杂。
这种结构已经批评违背 UNIX 哲学:
“Systemd 违背了 Unix 哲学:‘只做一件事,并把它做好’,它代表了数十个紧密耦合的二进制文件的复杂集合 1。它的职责远远超出了 init 系统,因为它还要处理电源管理、设备管理、挂载点、cron、磁盘加密、套接字 API/inetd、系统日志、网络配置、登录/会话管理、预读、GPT 分区发现、容器注册、主机名/语言环境/时间管理等。保持简单,傻瓜。”