`journalctl -k -b -0`과 `ps holstart 1` 사이에 간격이 있는 이유는 무엇입니까?

`journalctl -k -b -0`과 `ps holstart 1` 사이에 간격이 있는 이유는 무엇입니까?

나는 이상한 관찰을 발견했습니다.

만약 내가한다면:journalctl -k -b -0 | sed -e 's/^\(.\{76\}\).*/\1.../;3q'

다음과 같은 내용이 표시됩니다.

-- Journal begins at Sun 2022-08-07 12:06:55 CEST, ends at Mon 2023-02-20 08...
Jan 09 15:07:39 magnet kernel: Linux version 5.10.0-20-amd64 (debian-kernel@...
Jan 09 15:07:39 magnet kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-5.10.0...

다음과 일치해야 합니다.dmesg | sed -e 's/^\(.\{76\}\).*/\1.../;2q'

 [    0.000000] Linux version 5.10.0-20-amd64 ([email protected]...
 [    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.10.0-20-amd64 root=/...

정말 멋지군요. 전체 타임스탬프가 포함된 출시의 첫 번째 줄이 보입니다!

하지만:내가 쳤을 경우:ps ho lstart,cmd 1

Mon Jan  9 15:07:26 2023 /sbin/init

내가 올바르게 설명한다면: 프로세스init13초 시작앞으로핵심! ?

다음 명령을 사용하여 다른 많은 호스트에서 테스트되었습니다.

initSeconds() { 
    sdtext=(before after)
    { read -r kstart
      read -r sstart ;} < <(
        date -f <(LC_ALL=C journalctl -k -b -0 |
            sed -e "2{s/$HOSTNAME.*//;q};d"
            LC_ALL=C ps ho lstart 1) +%s
    )
    sdiff=$((sstart-kstart))
    printf 'Kernel : %(%a %d %b %T)T\nSystemd: %(%a %d %b %T)T (%s" %s)\n' \
        $kstart $sstart ${sdiff#-} ${sdtext[sdiff>0]}
}

그 다음에

sudo bash < <(declare -f initSeconds;echo initSeconds)
Kernel : Mon 09 Jan 11:33:53
Systemd: Mon 09 Jan 11:33:23 (30" before)
ssh pi@raspberrypi sudo bash < <(declare -f initSeconds;echo initSeconds)

나는 다른 결과를 받았습니다:

  • 13", 18", 다음에 따라 30":init 앞으로 kernel, 다른 호스트에서
  • -50", -3354다른 Raspberry Pi에서...어디init 아마 한 시간쯤 후에 시작될 것 같아요핵심?

이것은 버그입니까?

그렇다면(내 생각에는) 이것은 ps버그 인가 journactl아닌가! ?

참고: 읽었습니다.ps lstart의 출력이 변경되었습니다., 하지만 불과 41일 만에 30초의 차이가 난다는 점에는 동의할 수 없습니다!

로그 발췌(Lenovo 노트북에서):

(아래의 전체 명령뿌리사용자:

# paste -d\   <( dmesg |
    sed 's/$/                        /;s/^\(.\{32\}\).*/    \1/'
  ) <(
    LANG=C journalctl -k -b -0|sed 's/\(.\{40\}\).*/\1/'
  )

)

일부 수동 버전도 있습니다:

|--       dmesg output       --| |--        journalctl output         --|
-------------------------------- ----------------------------------------
[    0.000000] Linux version 5.1 -- Journal begins at Sun 2021-10-03 13:2
[    0.000000] Command line: BOO Feb 26 12:09:12 host kernel: Linux versi
[    0.000000] x86/fpu: x87 FPU  Feb 26 12:09:12 host kernel: Command lin
[    0.000000] BIOS-provided phy Feb 26 12:09:12 host kernel: x86/fpu: x8
[    0.000000] BIOS-e820: [mem 0 Feb 26 12:09:12 host kernel: BIOS-provid
[    0.000000] BIOS-e820: [mem 0 Feb 26 12:09:12 host kernel: BIOS-e820: 
... 58 lines skipped
[    0.018652] RAMDISK: [mem 0x3 Feb 26 12:09:12 host kernel: found SMP M
...802 lines skipped
...102 lines skipped
[    4.557467] EXT4-fs (dm-0): m Feb 26 12:09:12 host kernel: PM: Image n
[    4.623199] Not activating Ma Feb 26 12:09:12 host kernel: EXT4-fs (dm
[    4.730262] systemd[1]: Inser Feb 26 12:09:12 host kernel: Not activat
[    4.751319] systemd[1]: syste Feb 26 12:09:12 host systemd[1]: Inserte
[    4.767877] systemd[1]: Detec Feb 26 12:09:12 host systemd[1]: systemd
...140 lines skipped
[    5.882062] iwlwifi 0000:03:0 Feb 26 12:09:12 host kernel: iwlwifi 000
[    5.895585] uvcvideo: Found U Feb 26 12:09:12 host kernel: uvcvideo: F
[    5.898230] input: Integrated Feb 26 12:09:13 host kernel: input: Inte
[    5.898319] usbcore: register Feb 26 12:09:13 host kernel: usbcore: re
... 49 lines skipped
[   10.702190] e1000e 0000:00:19 Feb 26 12:09:17 host kernel: e1000e 0000

그리고

initSeconds
Kernel : dim 26 fév 12:09:12
Systemd: dim 26 fév 12:09:07 (5" before)

실제로 systemd는 5초 동안 시작되었습니다.뒤쪽에커널(4.730262)이지만 이는 부정적인 격차를 설명하지 않습니다.

답변1

프로세스의 시작 시간은 기본적으로 "시스템 시작 이후 초" 형식으로 커널에 저장됩니다. 확인하시면 확인하실 수 있습니다/proc/1/stat파일 형식.

ps명령은 이를 사람이 읽을 수 있는 벽시계 타임스탬프로 변환합니다.명령을 실행할 때.

반면, 로그의 타임스탬프는 "부팅 이후 초 수" 형식에서 이에 상응하는 UTC 형식(아마도 Unix 타임스탬프 또는 유사)으로 변환되었습니다.로그 항목을 작성할 때.

대부분의 Raspberry Pi 모델에는 배터리로 구동되는 실시간 시계(RTC)가 포함되어 있지 않으므로 커널이 부팅되면 실제 시스템 시간이 결정되지 않습니다. 시간을 되돌릴 필요가 없도록 하는 합리적인 가정은 시스템이 마지막으로 실행되었을 때 마지막 타임스탬프를 루트 파일 시스템에 기록하고 1초를 추가한 다음 NTP 서버가 도달할 수 있을 때까지 이를 시스템 시간으로 사용하는 것입니다. .

시스템이 오랫동안 다운된 경우 첫 번째 NTP 동기화에는 상당한 순방향 시간 점프가 필요합니다. 그러나 이는 시계를 뒤로 돌리는 것보다 안전하며 어쨌든 시스템이 초기 부팅 단계에 있으므로 하드할 수 있는 것은 없습니다. 일관되고 원활한 타이밍에 대한 요구 사항이 여전히 적용되어야 합니다.

시스템은 일반적으로 루트 파일 시스템이 준비되고 쓰기 가능해지면 거의 즉시 로그에 쓰기 시작하므로 시스템에 정확한 RTC가 없으면 로그의 초기 시작 타임스탬프가 다소 왜곡됩니다. 시스템 시간이 조정되면 조정 이벤트 자체가 로그에 기록되어야 journald하지만아니요작성된 로그 항목의 타임스탬프를 반환하고 조정합니다. 전체 로그를 살펴보면 시스템 시계가 조정되는 모든 지점에서 타임스탬프의 불연속성을 볼 수 있습니다.

따라서 커널 부팅 시간과 첫 번째 NTP 동기화 설정 시간 사이에 기록된 타임스탬프만 해석될 수 있습니다.서로 상대적인, 실제 벽시계 시간과의 대응이 불확실하기 때문에,특히RTC에 대한 정확한 배터리 지원이 없는 시스템에서.

systemd실제로 여기에 적용되는 두 가지 목표가 있습니다. RTC가 있는 시스템에서는 time-set.target부팅 프로세스에서 시스템 시계가 RTC 시간으로 설정된 지점을 표시합니다. 그러면 시스템 시간은 최소한 올바른 범위에 있어야 합니다. RTC는 좋습니다.

두 번째 목표는 time-sync.target시스템 시계가 NTP 또는 기타 신뢰할 수 있는 외부 시간 소스와 동기화된 지점을 표시하는 것입니다. (대부분의) RasPis와 같이 기능적인 배터리 지원 RTC가 없는 시스템에서 이 목표에 도달하기 전에 기록된 초기 부팅 타임스탬프는 서로 관련해서만 사용 가능한 것으로 가정해야 합니다.

관련 정보