ハードウェアRTCを現地時間として誤って設定しました。

ハードウェアRTCを現地時間として誤って設定しました。

大学の課題の場合、いくつかのアンケートを実施するシステムがあります。 kern.log、syslog、およびauth.logファイルを分析するときの特定の動作について疑問に思いました。システムが起動するたびに、ログ内の特定のポイントにあるログタイムスタンプが2時間後に移動します。

最初の考えは、システムがhwclock UTC時間で始まり、ある時点でタイムゾーン(UTC + 2)が適用されることです。しかし、タイムゾーンがUTC+2(UTC-2ではない)なので、後ろではなく前に移動したいです。

この動作の説明(または説明のヒント)を与えることができる人はいますか?

これが私が意味するものです:

...
Jun  5 20:05:27 pc kernel: [   11.383305] snd_hda_codec_idt hdaudioC0D0: autoconfig for STAC9221 A1: line_outs=3 (0xc/0xf/0xb/0x0/0x0) type:speaker
Jun  5 20:05:27 pc kernel: [   11.383307] snd_hda_codec_idt hdaudioC0D0:    speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
Jun  5 20:05:27 pc kernel: [   11.383308] snd_hda_codec_idt hdaudioC0D0:    hp_outs=1 (0xa/0x0/0x0/0x0/0x0)
Jun  5 20:05:27 pc kernel: [   11.383309] snd_hda_codec_idt hdaudioC0D0:    mono: mono_out=0x0
Jun  5 20:05:27 pc kernel: [   11.383310] snd_hda_codec_idt hdaudioC0D0:    dig-out=0x10/0x0
Jun  5 20:05:27 pc kernel: [   11.383310] snd_hda_codec_idt hdaudioC0D0:    inputs:
Jun  5 20:05:27 pc kernel: [   11.383311] snd_hda_codec_idt hdaudioC0D0:      Mic=0xd
Jun  5 20:05:27 pc kernel: [   11.383312] snd_hda_codec_idt hdaudioC0D0:      Line=0xe
Jun  5 20:05:27 pc kernel: [   11.383313] snd_hda_codec_idt hdaudioC0D0:      CD=0x15
Jun  5 20:05:27 pc kernel: [   11.383314] snd_hda_codec_idt hdaudioC0D0:    dig-in=0x11
Jun  5 20:05:27 pc kernel: [   11.407403] input: HDA Intel Mic as /devices/pci0000:00/0000:00:05.0/sound/card0/input8
Jun  5 20:05:27 pc kernel: [   11.407540] input: HDA Intel Line as /devices/pci0000:00/0000:00:05.0/sound/card0/input9
Jun  5 20:05:27 pc kernel: [   11.407675] input: HDA Intel Speaker Front as /devices/pci0000:00/0000:00:05.0/sound/card0/input10
Jun  5 20:05:27 pc kernel: [   11.407810] input: HDA Intel Speaker CLFE as /devices/pci0000:00/0000:00:05.0/sound/card0/input11
Jun  5 20:05:27 pc kernel: [   11.407938] input: HDA Intel Front Headphone as /devices/pci0000:00/0000:00:05.0/sound/card0/input12
Jun  5 20:05:27 pc kernel: [   11.408111] input: HDA Intel SPDIF In as /devices/pci0000:00/0000:00:05.0/sound/card0/input13
Jun  5 20:05:27 pc kernel: [   14.635240] audit: type=1400 audit(1591380319.980:2): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libreoffice-xpdfimport" pid=620 comm="apparmor_parser"
Jun  5 20:05:27 pc kernel: [   14.655840] audit: type=1400 audit(1591380320.004:3): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libreoffice-senddoc" pid=618 comm="apparmor_parser"
Jun  5 20:05:27 pc kernel: [   14.741500] audit: type=1400 audit(1591380320.088:4): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libreoffice-oopslash" pid=617 comm="apparmor_parser"
Jun  5 20:05:27 pc kernel: [   14.742736] audit: type=1400 audit(1591380320.088:5): apparmor="STATUS" operation="profile_load" profile="unconfined" name="ippusbxd" pid=616 comm="apparmor_parser"
Jun  5 20:05:27 pc kernel: [   15.019051] audit: type=1400 audit(1591380320.364:6): apparmor="STATUS" operation="profile_load" profile="unconfined" name="lsb_release" pid=624 comm="apparmor_parser"
Jun  5 20:05:27 pc kernel: [   15.053162] audit: type=1400 audit(1591380320.400:7): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe" pid=627 comm="apparmor_parser"
Jun  5 20:05:27 pc kernel: [   15.053165] audit: type=1400 audit(1591380320.400:8): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe//kmod" pid=627 comm="apparmor_parser"
Jun  5 20:05:27 pc kernel: [   15.084543] audit: type=1400 audit(1591380320.428:9): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/sbin/tcpdump" pid=619 comm="apparmor_parser"
Jun  5 20:05:27 pc kernel: [   15.158035] audit: type=1400 audit(1591380320.504:10): apparmor="STATUS" operation="profile_load" profile="unconfined" name="system_tor" pid=623 comm="apparmor_parser"
Jun  5 20:05:27 pc kernel: [   15.748144] audit: type=1400 audit(1591380320.652:11): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/NetworkManager/nm-dhcp-client.action" pid=632 comm="apparmor_parser"
Jun  5 20:05:38 pc kernel: [   32.906512] kauditd_printk_skb: 28 callbacks suppressed
Jun  5 20:05:38 pc kernel: [   32.906515] audit: type=1400 audit(1591380338.248:40): apparmor="DENIED" operation="capable" profile="/usr/sbin/cups-browsed" pid=765 comm="cups-browsed" capability=23  capname="sys_nice"
Jun  5 20:05:40 pc kernel: [   34.654094] e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
Jun  5 20:05:40 pc kernel: [   34.654536] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready
Jun  5 18:05:55 pc kernel: [   49.364257] snd_hda_intel 0000:00:05.0: Invalid position buffer, using LPIB read method instead.
Jun  5 18:05:55 pc kernel: [   49.571782] snd_hda_intel 0000:00:05.0: Invalid position buffer, using LPIB read method instead.
Jun  5 18:06:21 pc kernel: [   75.730326] rfkill: input handler disabled
Jun  5 18:07:45 pc kernel: [  159.004723] rfkill: input handler enabled
Jun  5 18:07:57 pc kernel: [  171.241572] rfkill: input handler disabled
...

ベストアンサー1

ハードウェアRTCを現地時間として誤って設定しました。

決して良い考えではなく、今も良い考えではありません。この特定の問題(いくつかのうちの1つ)は数十年間知られてきました。

何が起こったのか?

  1. ブートローダでは、カーネルはシステムクロックを設定します(いつもスレーブハードウェアクロックはUTCで動作します。ハードウェア RTC が UTC 時間に設定されていないため、システムクロックが間違った時間に設定されます。ハードウェアRTCチップ(標準プラットフォーム)にはタイムゾーン情報はありません。
  2. その後、ブートローダでは、非カーネルプログラムは、設定ファイルの「グローバル」タイムゾーン設定を使用してCライブラリのロケールデータベースを照会し、カーネルにそのオフセットを知らせることによって、現地時間からUTCまでのオフセットを計算します。
  3. カーネルは、システムクロックと時間を現地時間のように偽装するさまざまなドライバ(FATファイルシステムドライバなど)にオフセットを適用します。これで、システムクロックが正しいUTC値に設定されました。システムクロックジャンプUTCオフセット値。

設定された「グローバル」タイムゾーンがUTCより遅れると(アメリカのように)、システムクロックがUTCより遅く起動し(ハードウェアクロックが誤って実行されます)、system-manager/ systemd / whateverにタイムゾーンオフセットが与えられた後にUTCにジャンプします。 。タイムゾーンがUTCより前の場合(たとえば、ヨーロッパ/アフリカおよびアジアの一部の地域)、システムクロックは後方に移動しますが、これはアプリケーションにとって望ましくありません。

BSDにはこの問題を解決する方法があります。ブートローダは、ファイルのローダ変数を介してUTCからのタイムゾーンオフセットを知ることができますloader.conf。だからカーネルすでに知っていたハードウェアRTCの初期読み取りを実行するときにシステムクロックが設定されているUTC値を取得するためにハードウェアRTC値に適用されるオフセット。

Linuxにはそのようなメカニズムはありませんが、代わりに最初のプログラムが特定の方法で関数を呼び出すのに魔法のsettimeofday()意味があります。このプログラムは通常、systemd、nosh、system-managerまたはプログラムhwclockの最初の呼び出しです。

ハードウェアリアルタイムクロックをUTCとして実行し、それを理解するようにすべてのオペレーティングシステムを設定します。

追加読書

おすすめ記事