O での VMware ホスト時刻との同期は ntpd(8) の時刻ソースに vmt(4) を指定しろ

前回 の訂正、突然思い出したけど O には OpenNTPd という自前の NTP デーモン実装があって vmt(4) のような sensor_attach(9) 準拠の timedelta デバイスなら ntpd.conf(5) で以下のように指定すれば時刻ソースとして使えるんだっけ。

sensor vmt0

ということで O における VMware ホスト時刻同期は sensord(8) + time(1) でなく ntpd(8) を使えってことですわね、つーか設定せんでもデフォルト設定のワイルドカード指定で有効なんやな。

なお OpenNTPd についてはやはり NTP デーモンの独自実装 を持つ D なんとかがが批判してた記憶があるんだがなんだっけ? もう覚えてねえし限界集落のマウンティング合戦なんてどうでもいいけど クソ精度なのに stratum1 を名乗るなとかそんな感じの話だったかな。

時間逆行現象

前回説明した通り、N の vmt(4) は時間が逆戻りしようが関係ねえというストロングスタイルの実装である。

一度でも NTP 関係のドキュメントを読んだ経験があれば、いきなり時間が過去に戻るような実装は絶対に許さないよマイナス 3 日後マイナス 100 倍だかんな!という勢力が存在することを知ってるはずなんだが、そこは移植がメインディッシュでシングルユーザーで起動に成功した後は野となれ山となれで興味が無いしユーザーランド(笑)って嘲笑が N の本質だから諦めろ。

そもそもアプリケーション書く時、時間が逆行するようなこと想定できるプログラマなんてほとんどいないと思う。

しかしイレギュラーは普通に発生する、時刻の変更だけでなくうるう秒 (Leap Second) やサマータイムにともなう夏時間 (DST=Daylight Saving Time) で同じ時刻が2度やってくるのはごく普通に起こりうるのだ(だから廃止するね…)。

時刻を扱うアプリケーションの代表格 cron(8) はこういったイレギュラーを考慮し時刻のダブりでジョブが複数回流れないような実装になっている。 vixie-cron と呼ばれる実装を採用してるところが多いけれど、こいつは時刻差を

  • large … 時刻が3時間以上進むか戻ったケース、時刻合わせが行われたと考える
  • medium … 時刻が5分以上進んだケース、夏時間の開始と考える
  • small … 時刻の進み5分に満たないケース、通常の時刻の経過と考える
  • negative … 時刻が後ろに戻ったケース、夏時間の終了と考える

という4パターンで処理していたりする、詳しくはソース嫁。

こういう実装も何度となく痛い目に合った経験の蓄積が故で、元からパラノイア患ってるプログラマでもない限り普通は前回と今回の時刻の差が負の値になるなんて想像もしねえよ(そして想定外でクラッシュするアプリケーションの屍の山)。

なおワイはまごうことなきパラノイア側、なんせ文系営業職からクソ底辺SIerに転身しまともな指導員のいない明日の朝刊(日経動かないコンピュータ)載ったぞテメーなデスマで OJT(On the Jigoku Training) してた時、仕様書も完成してないのにテストケース書けと無茶振りされてまず最初に「サーバの電源が落ちた時」からはじまるテストをお出ししてレビュアーを凍りつかせた男だ。 怖いですよね天が崩れ落ちてくるの(杞憂の語源)、常日頃オリオン座のベテルギウスが超新星爆発してガンマ線バーストで地球がこんがり焼かれる夢を見ます。

そもそも現在の時刻でなく時間経過を知りたいだけなら(というかそれがほとんどだろう) getbinuptime(9) のように増えていくだけの値を使え、つーか自分で時間数える愚を犯さず OS で実装されてるタイマー使えなんやな。

なお vmt(4) では getbinuptime(9) ではなく

359 static void
360 vmt_update_guest_uptime(struct vmt_softc *sc)
361 {
362 	/* host wants uptime in hundredths of a second */
363 	if (vm_rpc_send_rpci_tx(sc, "SetGuestInfo  %d %" PRId64 "00",
364 	    VM_GUEST_INFO_UPTIME, time_uptime) != 0) {
365 		device_printf(sc->sc_dev, "unable to set guest uptime\n");
366 		sc->sc_rpc_error = 1;
367 	}
368 }

と直接 time_uptime(9) を触る古き良き時代のコードとなっている。

これ 64bit time_t 時代だと 32bit CPU では書換がアトミックじゃないから壊れた値をホストに投げても知らんゾ、まぁ壊れるのは 32bit 境界で桁が繰り上がる時だから 137 年後の事を気にするパラノイア以外はどうでもいいっちゃいいが。

ちなみに O では getuptime(9)を使うように 修正済みである、さすがパラノイアだし getuptime(9) は getbinuptime(9) と違って LP64 なら性能的なペナルティ無しって設計にするのもパラノイア感マシマシでいいよね、パっとパラノイア~パっとパラノイア~。

ということで君もパラノイアになろうよ、まずはフィリップ・K・ディックの ユービック ならびに 逆まわりの世界 は必読、つーかハヤカワにも時間逆行現象が起きて表紙が過去に戻ればいいのに。 ニューロマンサー の表紙は奥村靫正以外ありえねぇしクソ新訳も要らねえつってんだろガブルガブルガビッシュ。

脱線、ディックが作品で執拗にモチーフとした時間逆行現象ってのはありゃ貧困家庭あるある話なのだ。 この令和の SNS 映えが何よりもの評価基準の世界で、昭和40年代築のボロ実家に住みレトロなタイル貼りとバランス釜の風呂に浸かりながら幼児退行した老人がやらかす奇行の数々に頭悩ませてみるといい、あーこりゃ時間退行現象に違いないっすねーと現実逃避のひとつもしたくなるってもんだ。

彼は アンドロイドは電気羊の夢を見るか で陰謀論に染まり職を失った ジャック・イジドアの告白 の主人公を再登場させるのだけど、イジドアが苛まされるキップル化現象(一般的にはエントロピー増大の法則やグレシャムの法則)というのは、経済的に困窮し3~40年前のガラクタで溢れかえったゴミ屋敷で鬱々とするディック本人の投影なのだ。

あなたは NTP してますか?

いや NPT (核不拡散条約)じゃねえからそこのならずもの国家どもはウラン濃縮に必要なブツを秋葉原で揃えるのをやめろ。

いまどき 1 万円台の壁掛け時計ですら GPS で時刻同期するのに、これがパソコンとなると ティーポット 回すくらいしか使い道の無い GPU いっこ 20 万円也を積む金はあれど、GPS で時刻同期するのも無駄お前らにはクォーツすら贅沢とばかりに時刻同期は軽視される風潮ほんと謎である。 にもかかわらず完成度でも実用性でもテロリスト愛用 CASIO F91W お値段1500円也にも劣る手巻きの高級腕時計には執心し男のステータス云々で数百万円溶かすってただの脳のバグだよなァ?

そもそも人類に MATROX G200 以上のグラボなんて必要ないのだ。 しかし GPU 需要を支える暗号資産とかいうポンジスキームすなわち詐欺行為や生成 AI とかいう著作権ロンダリングすなわち泥棒行為はたまた Chat うんたらの現代人の 亀卜 のためのデバイスと違って GPS で時刻同期したところで一銭にもならねえからな。一文字違うだけで大富豪と大貧民である。

余談だが今ロシアとかいう 80 年遅れでナチスドイツと大日本帝国 RTA 更新にチャレンジする底無しのバカが GPS 妨害してるので、CISCO は 特定地域で PTP のソースを GPS からクォーツに変更する羽目になったなんて話もあったな、やはり第三次世界大戦の今は一家に一台原子時計が必要なのである。

そもそも Windows 使ってるなら勝手に time.windows.com という NTP サーバと時刻同期してるんだよね。 もよりの NTP サーバ使うよう変更するのがお勧め。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
"NtpServer"="ntp.nict.jp,0x8"

ということで意識したことはなくても使ったことのない人はほとんどいないということ。

ntpd(8) はどのようなポリシーで時刻合わせを行うか

シャカタク(お洒落な音楽)に説法のような気もするが、N 他で広く使われている リファレンス実装 の ntpd(8) には

  • Step モード
  • Slew モード

という二種類の時刻同期方法がある。

Step モードとは

英語で step は歩みの意味だけど進行方向については続く副詞次第、step forward なら一歩前で step back なら一歩後ずさり。

つまり時間が進むだけでなく巻き戻されることもあるのがこのモードの特徴、またプラマイ 128 ミリ秒を超える誤差は即反映するポリシーだ。

通常こちらがデフォルトの実装が多いが VMware Tools では Set_Option time.synchronize.tools.startup.backward 1 でないと Step モードでの時刻同期は許可されず 次に説明する Slew モードでの時刻合わせを行わなければならない。

Slew モードとは

聴き慣れない単語だが slay (残虐に殺す)の過去形で時刻ズレなんてぶっ殺したぜの意味

…ではなく「直線にしたがって進む」とか「回転軸を中心に回る」などの意味で英英辞書でもないと載ってないなこれ。

つまり時間はこれまでの時刻経過のラインにしたがい前に進んで決して後戻りしないのがこのモードの特徴、さらにプラマイ 128 ミリ秒を超える誤差は即反映するのではなく均等に分割し少しずつ解消していくポリシー。

ただし誤差がプラマイ 600 秒を超えて毎秒 0.5 ミリ秒づつ調整してなお 14 日近くかかってしまう大きな誤差の場合

  • 前進なら Step モードで一気に修正を行う
  • 後退なら万事休す時刻同期そのものを断念する

という動作になるので注意である。

VMware Tools ではデフォルトでこのモードで時刻合わせを行う。

次回

めんどくせえが vmt(4) に Slew モードを実装する話ができればいいのだがやる気がピクリとも起きねえ。 いやほんとこれ O みたいに ntpd(8) に丸投げするのがナイス判断だよなぁ。