为什么 systemd-journald 在 Storage=auto 时创建“/var/log/journal/machine_id”目录

为什么 systemd-journald 在 Storage=auto 时创建“/var/log/journal/machine_id”目录

我正在研究 systemd-journald 的代码并发现了这个(在system_journal_open()):

if (!s->system_journal &&
    IN_SET(s->storage, STORAGE_PERSISTENT, STORAGE_AUTO) &&
    (flush_requested || flushed_flag_is_set())) {

        /* If in auto mode: first try to create the machine
         * path, but not the prefix.
         *
         * If in persistent mode: create /var/log/journal and
         * the machine path */

        if (s->storage == STORAGE_PERSISTENT)
                (void) mkdir_p("/var/log/journal/", 0755);

        (void) mkdir(s->system_storage.path, 0755);

        fn = strjoina(s->system_storage.path, "/system.journal");

此处,在之前的函数调用中system_storage.path设置为。strjoin("/var/log/journal/", SERVER_MACHINE_ID(s));

据我了解,/var/log/journal当存储设置为 时,它会创建目录persistent。但在这两种情况(persistentauto)中,为什么要创建/var/log/journal/machine_id目录((void) mkdir(s->system_storage.path, 0755);)? auto如果事先创建,将持久存储日志/var/log/journal,否则日志将写入/run/log/journal.因为auto它不应该创建/var/log/journal/machine_id目录吗?

另外看完评论后,/var/log/journal/machine_id不创建前缀怎么可能创建呢?我假设/var/log/journal是前缀。

答案1

我已经弄清楚了,这只是一个混乱,所以如果设置为persistent代码将创建/var/log/journal前缀,然后是machine_id目录,如果设置为auto/var/log/journal不会创建(前缀),因此尝试通过创建完整路径(void) mkdir(s->system_storage.path, 0755);将失败,因为journal目录丢失(假设大多数系统已经有/var/log/) 并且mkdir如果完整路径中缺少任何目录,命令将失败(mkdir与创建丢失目录的 -p 不同)

相关内容