다른 컴퓨터에서 보관 된 일부 저널 파일을 살펴 보는 동안 일부 로그 항목의 __BOOT_ID
값 이 서로 다르며 시간 간격이 매우 좁다 는 것을 알았습니다 . 예를 들어 밀리 초 간격의 로그 항목은 다른 __BOOT_ID
값을 갖습니다. 기계가 그 작은 시간 간격 내에 다시 시작할 수 없기 때문에 이것은 불가능합니다.
실행할 때 journalctl -o verbose --directory <dir path> | grep -B 30 -A 30 -- "-- Reboot --"
10ms 간격의 로그 이벤트에 대해 두 가지 다른 부팅 ID 값을 사용하여 다음 실제 예제를 인용 할 수 있습니다.
Wed 2019-11-13 21:35:58.469925 ...
_TRANSPORT=kernel
PRIORITY=6
SYSLOG_FACILITY=0
SYSLOG_IDENTIFIER=kernel
_BOOT_ID=fec227a60ef24474aacd023d6c02733f
...
...
...
MESSAGE=spi1.0: ttyMAX1 at I/O 0x20 (irq = 30, base_baud = 3000000) is a MAX3109
-- Reboot --
Wed 2019-11-13 21:35:58.470352 ...
_SOURCE_MONOTONIC_TIMESTAMP=0
_TRANSPORT=kernel
PRIORITY=6
SYSLOG_FACILITY=0
SYSLOG_IDENTIFIER=kernel
MESSAGE=Booting Linux on physical CPU 0x0
_BOOT_ID=21b95aabab034009a19d1b7deac80327
...
...
...
나는 성공하지 못한 채 부팅 ID가 그렇게 빠르게 변할 수있는 원인을 찾으려고 노력했습니다. 버전 ( v243
) 의 systemd 소스를 살펴보면 sd_id128_get_boot()
부팅 ID를 읽는 데 사용되는 기능 이 파일에서 커널 생성 값을 읽는 것으로 보입니다 .
if (sd_id128_is_null(saved_boot_id)) {
r = id128_read("/proc/sys/kernel/random/boot_id", ID128_UUID, &saved_boot_id);
if (r < 0)
return r;
}
*ret = saved_boot_id;
return 0;
최종 결과는 결국 재부팅이 아닐 수도있는 로그에 표시되는 재부팅 목록입니다. 흥미롭게 journalctl --list-boots
도 이것들을 재부팅으로 전혀 표시하지 않을 것입니다 (현재 get_boots()
구현 을 이해하려고 시도 중 ).
누군가 가이 행동을 일찍 본 적이 있다면 어떤 아이디어 나 의견을 감사하십시오. jounalctl --list-boots
재부팅 목록을 가져 오는 곳 이라는 것을 이해 하지만 특정 재부팅 정보 세트를 염두에두고 로그를 분석하려고합니다. 이러한 잘못된 긍정은 내가 작성하려는 스크립트의 결과를 오염시킵니다.
나는 부팅 ID가 실제로 그렇게 빠르게 바뀌고 있다고 생각하지 않습니다. 한 번에 여러 부츠의 로그를보고 있고 서로 섞여있는 것 같습니다.
시스템에 배터리 전원을 사용하는 실시간 시계가없는 경우 발생할 수 있습니다.
journalctl은 벽시계 시간을 사용하여 다른 부팅에서 발생한 로그 메시지를 정렬합니다. 부팅 할 때마다 벽시계가 재설정되면 다른 부팅의 메시지가 동시에 발생한 것처럼 보이며 journalctl은 이러한 메시지를 혼동스럽게 삽입합니다.
시스템 기능 요청 # 662 에 대한 Lennart Poettering의 의견 을 참조하십시오 .
따라서 다음과 같은 일이 발생합니다. 재부팅 할 때마다 1970 년의 날짜와 새로 무작위 부팅 ID로 시작됩니다. 이러한 방식으로 부팅 할 때마다 몇 개의 메시지가 생성됩니다.
이제 표시하는 동안 journalctl은이 데이터를보고이를 이해하고 인터리브합니다. 인터리빙은 라인을 함께 정렬하고 최신 데이터보다 오래된 데이터를 배치해야 함을 의미합니다. 이를 위해 먼저 시퀀스 번호를 비교하려고합니다. 시퀀스 번호는 메모리에 유지되며 부팅 할 때마다 0으로 재설정됩니다. 따라서 비교할 두 줄간에 부팅 ID가 일치하는 경우에만 비교할 수 있습니다. 재부팅 할 때 부팅 ID가 다르기 때문에 (분명히 그리고 정당하게)이 순서 논리를 사용할 수 없습니다. 다음으로 journalctl은 단조로운 타임 스탬프 (즉, 부팅 이후 경과 한 시간)에 따라 순서를 지정합니다. 이러한 주문은 동일한 조건에서만 작동합니다. 단조로운 시간을 통해 동일한 부츠의 라인 만 주문할 수 있습니다.즉, wallclock 시간을 통해 두 라인을 비교하는 마지막 방법을 사용합니다. 그러나 그것은 항상 1970 년입니다. 따라서 라인이 모두 섞여있는 인터리빙이 발생합니다.
이를 확인하는 한 가지 방법 journalctl --list-boots
은 날짜 범위 를 실행 하고 확인하는 것입니다. 중복되는 경우 journalctl은 가짜 타임 스탬프를 사용합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다