可以是 / 以外的文件系统上的日志路径吗?

Pet*_*RGA 1 logs mount systemd-journald

我想将默认journal目录存储/var/log/journal/在已安装的设备上,但我不确定我是否可以这样做,因为这journal是一项重要的服务,可能在安装任何设备之前已经运行,这会导致突然直接改变。

journal目录存储在已安装的设备上是否安全/可能,如果是,如果简单的安装不起作用,该怎么做。

journal条目中的目录列表:

2019-03-18 22:16:41 root@AAEB-APP206LY:/var/log/journal/d41cf15550e34487abe7103b61fbf794 => ll
total 792M
drwxr-sr-x  1 root systemd-journal  884 Mar 12 06:35 ./
drwxr-sr-x  1 root systemd-journal   64 Feb 26 18:17 ../
-rw-r-----  1 root systemd-journal  96M Mar 18 22:16 system.journal
-rw-r-----  1 root root            120M Feb 26 18:17 system@d5301574c947425cb992f7839ae52cdb-0000000000000001-0005827c7effc14d.journal
-rw-r-----  1 root systemd-journal  96M Mar  5 12:29 system@d5301574c947425cb992f7839ae52cdb-0000000000051acb-000582cf3a7ba719.journal
-rw-r-----  1 root systemd-journal  96M Mar 12 06:35 system@d5301574c947425cb992f7839ae52cdb-00000000000872b4-000583572e31154d.journal
-rw-r-----+ 1 root systemd-journal 128M Mar 18 22:16 user-5000.journal
-rw-r-----+ 1 root root            128M Mar  5 12:29 user-5000@cf6acecdf28e48c790173a36447ec2e7-0000000000051ad9-000582cf3d435013.journal
-rw-r-----+ 1 root systemd-journal 128M Mar 12 06:35 user-5000@cf6acecdf28e48c790173a36447ec2e7-00000000000872b9-000583572e312040.journal
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它占用了将近 800 MB,并且填满了主分区。因此,将它存储在不同的文件系统上的想法。

Tre*_*ntP 6

据我所知,无法更改 systemd 预定义日志记录目录的位置,/run/log/journal并且/var/log/journal. 可以通过Storage配置选项选择使用这两个选项中的哪一个。但是您不能将路径更改为/anotherfs/log/journal.

您可以做的是使 /var/log/journal 成为指向另一个目录的符号链接,并使该目录位于另一个文件系统中。Systemd-tmpfiles 可以自动制作这个链接。

将带有此文件的文件放入/etc/tmpfiles.d/

L     /var/log/journal     -    -    -     -      /anotherfs/journal
Run Code Online (Sandbox Code Playgroud)

现在,如果/var/log/journal不存在,它将是到另一个文件系统的链接,并且日志将转到那里。

但是你很可能会遇到另一个问题。Journald 将在启动期间从使用 /run 中的非持久性日志切换到 /var 中的持久性日志,并将日志数据从 /run 刷新到 /var。显然我们需要这个开关 /anotherfs安装发生!如果符号链接指向 rootfs,或者指向与打开相同的 fs /var/log,那么这不会是问题,它可以很好地作为更改日志数据所在路径的一种方式。

这种排序方式,即挂载文件系统然后刷新日志,通常是通过systemd-journal-flush.service拥有一个RequiresMountsFor=/var/log/journal属性来实现的。如果/var/log/journal是符号链接,systemd 只等待链接本身所在的文件系统被挂载,而不是链接指向的文件系统。所以排序不起作用。

我们可以通过绑定安装来解决这个问题。我们不是符号链接/var/log/journal到另一个 fs,而是将挂载来自另一个 fs 的目录(或直接挂载其他 fs,如果另一个 fs 仅用于日志)到/var/log/journal.

创建一个必须命名的单元文件var-log-journal.mount

[Unit]
Description=Persistent Journal Storage Bind

[Mount]
What=/anotherfs/journal
Where=/var/log/journal
Type=none
Options=bind

[Install]
WantedBy=local-fs.target
Run Code Online (Sandbox Code Playgroud)

安装并启用它。现在日志刷新单元将看到有一个安装单元var-log-journal(它只查找确切的名称!)并等待它。挂载单元将挂载目录绑定/anotherfs/journal/var/log/journal. /anotherfs如果需要,Systemd 将自动添加排序依赖项以等待挂载,并且/var/log/journal如果挂载点尚不存在,它将自动创建挂载点。


小智 -2

systemd-journald手册页:

日志服务将日志数据永久存储在 /var/log/journal 下,或者以易失性的方式存储在 /run/log/journal/ 下(在后一种情况下,日志数据在重新启动时会丢失)。默认情况下,如果启动期间 /var/log/journal/ 存在,则日志数据将永久存储,否则隐式回退到易失性存储。使用journald.conf(5)中的Storage=配置日志数据的放置位置,与/var/log/journal/是否存在无关。

因此,将日志存储在其他地方是可能且安全的。您只需添加/更改

Storage=/some-filesystem-with-free-space/some-dir/
Run Code Online (Sandbox Code Playgroud)

日志配置文件之一中。