严重:Raspbian Stretch 的最新 systemd 更新中出现回归

严重:Raspbian Stretch 的最新 systemd 更新中出现回归

我最近更新了我的 Stretch 系统,这让我的 systemd 版本为 232-25+deb9u6。

一个非常令人讨厌的副作用是我的 /var/log/auth.log 充斥着以下内容:

Nov 30 07:13:34 rpi2-2 sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Nov 30 07:13:34 rpi2-2 su[29165]: Successful su for root by root
Nov 30 07:13:34 rpi2-2 su[29165]: + ??? root:root
Nov 30 07:13:34 rpi2-2 su[29165]: pam_unix(su:session): session opened for user root by (uid=0)
Nov 30 07:13:34 rpi2-2 su[29165]: pam_systemd(su:session): Cannot create session: Already running in a session
Nov 30 07:13:34 rpi2-2 su[29165]: pam_unix(su:session): session closed for user root
Nov 30 07:13:34 rpi2-2 sudo: pam_unix(sudo:session): session closed for user root
Nov 30 07:13:35 rpi2-2 sudo:       pi : TTY=unknown ; PWD=/home/pi ; USER=root ; COMMAND=/bin/su - -c echo 1 > /sys/class/backlight/rpi_backlight/bl_power

这似乎已被更新版本的 systemd 修复(请参阅https://github.com/systemd/systemd/pull/10832)但我无法自己构建该版本。

这是一个令人震惊的问题,因为我有一些代码每秒运行“su”两次,导致 auth.log 快速填满根分区。

如何获取 Raspbian Stretch 的最新 systemd 二进制文件或没有此问题的旧版本?

答案1

实际上,您在这里有几个问题,我会尽力解决每个问题。请注意,这里的解决方案似乎是不使用suStephen Kitt 在评论中指出的那样。

我将谈谈其他一些方面。

如何准备一个基于 debian 的系统来从源代码构建,例如:systemd(我建议首先在沙箱系统(例如 VM)中执行几次)

$ sudo apt-get build-dep systemd

现在,假设您希望构建的版本并不比您拥有的版本新很多,依赖项通常是相同的,这对于 systemd 的补丁版本来说也是如此。上面的命令将获取构建 systemd 所需的所有软件包,当然,systemd 本身除外。请注意,下面我们将获取最新和最好的 systemd,请注意确保满足所有先决条件。

然后您获取源代码并进行构建; systemd 位于 github 上,因此您需要 git 来获取源代码。

$ sudo apt-get install git
$ git clone https://github.com/systemd/systemd.git

具体如何构建源代码取决于相关软件开发人员使用的构建系统,systemd 使用介子。当我去的时候我看到了https://github.com/systemd/systemd,我向下滚动,那里有有关该项目的信息。

我看到了这一行:

自述文件中提供了有关构建要求的信息。

并阅读自述文件,总是一个好主意!

$ sudo apt-get install meson
$ git clone https://github.com/systemd/systemd.git
$ meson systemd/ && ninja -C systemd
$ cd systemd; sudo ninja install

如何配置日志保留,以免它们填满您的驱动器:

这里,需要为rsyslog配置logrotation。 logrotate 的配置位于/etc/logrotate.d,我们想要的文件是/etc/logrotate.d/rsyslog

首先访问文档:

  $ man logrotate.conf
  $ man logrotate

好的,现在我们已经阅读了文档,我们知道旋转日志的关键字是rotatesize指定何时旋转到下一个文件,compress压缩旋转的文件,mail邮寄它(可选),我希望文件旋转,所以我放mailfirst

我的/etc/logrotate.d/rsyslog样子:

[...]
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
[...]

配置 logrotate /var/log/auth

[...]
/var/log/kern.log
/var/log/auth.log
{
  rotate 10
  size 100M
  compress
  mail [email protected]
  mailfirst
}
/var/log/user.log
[...]

这将保留最多 10 个100Mb几乎 1Gb 的文件,一旦文件达到 100M,它就会被压缩并通过电子邮件发送到[电子邮件受保护]。默认情况下,rotatelog 每天通过 cron 运行,您可能希望每小时运行一次。man crontab

相关内容