나는 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와 달리).