我正在研究 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
。但在这两种情况(persistent
或auto
)中,为什么要创建/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 不同)