- DebianがY2K38(Unix Epochalypse)問題を事前に防ぐため、次期バージョン Debian 13 から32ビットアーキテクチャも含めて64ビット
time_t の適用を正式化
- 従来の32ビット
time_t の限界により、2038年1月19日以降は時刻が1900年へ巻き戻る現象が発生しうるため、この問題をこれ以上放置しない方針
- 64ビットハードウェアはすでに安全だが、組み込み、IoT などコスト重視の32ビットデバイスではDebian需要が残っており、事前対応の必要性が強調されている
- 全6,429パッケージに分散した
time_t 型を、ABI互換性の破壊を受け入れて一斉に切り替える大規模作業が進められた
- i386、hurd-i386 など一部のレガシー対応アーキテクチャは例外として残す一方、新しい64ビット
time_t ベースの x86(i686)アーキテクチャ導入の可能性にも言及
DebianのY2K38バグ対応: 64ビット時間への移行
- Debianは、迫るY2K38またはUnix Epochalypse問題を避けるため、サポート対象の最も古いハードウェアの一部を除き、すべての環境で64ビット時間へ移行する
- これにより、2038年1月19日に発生予定の32ビット signed int の範囲超過による時刻値エラーを防止する
Y2K38およびUnix Epochalypse問題の背景
- Y2K38問題は、1970年1月1日以降の経過秒数を32ビット signed int で表現するUnixシステムで、2038年を過ぎるとオーバーフローが発生し、時刻が1900年など過去へ誤って巻き戻る現象
- これは、過去のY2K(2000年問題)と同様に、短いデータ形式を選んだアーキテクチャ上の判断に起因する
- Y2Kの際には、開発者たちの事前対応のおかげで大混乱を防ぐことができた
- 64ビットハードウェア向けソフトウェアはすでに安全だが、Debianは組み込み、低スペック、レガシー環境で今なお広く使われている
Debianの主な対応
- Debian 13 "Trixie" リリースから、すべての主要アーキテクチャで64ビット
time_t をデフォルトで適用する
- 64ビットハードウェアはすでに安全だが、32ビットプロセッサベースの組み込み機器やレガシーハードウェアでは問題が起きやすい
- こうした機器は、自動車制御、IoT、テレビ、ルーターなど、コスト重視かつ大量出荷される分野で今なお使われている
- 多くの新型機器は OpenEmbedded、Alpine、Android、Gentoo などの独自ビルドLinuxを使っているが、Debianベースの組み込み機器の利用先も今後数年は続く見通し
適用内容と変更点
time_t 変数は関連コードの6,429パッケージに分散しており、大規模な作業が必要だった
- 今回の変更はABI(アプリケーション・バイナリ・インターフェース)互換性を壊す可能性があるため、関連するすべてのライブラリとパッケージで同時に調整された
- メンテナンスチームによれば、この作業は完了しており、十分なテストも実施済み
例外と今後の計画
- i386 ポート(従来の x86)は32ビット
time_t を継続し、既存バイナリの実行互換性を目的として残される
- i686 アーキテクチャについては、64ビット時間と最新ISA(命令セットアーキテクチャ)の適用が別途議論される可能性がある
- hurd-i386 ポートはカーネル側のサポート不足により移行せず、代わりに hurd-amd64 へ移す案が進められている
開発者向けの参考事項
- 開発者は、自身のソフトウェアが64ビット時間変数の適用によって壊れないかを、Debian Wikiで案内されている方法を通じてテストできる
- 詳細情報および技術文書は Debian wiki で提供されている
1件のコメント
Hacker News の意見
time_tを見るたびに彼を思い出すだろう+1900のハードコードなど)。自分が直接遭遇した Y2K バグは、インターネットフォーラムが 1999 年から 19100 年に飛んだものだった(単なる表示バグ)。Y2K は COBOL だけの問題ではなかったint値で日付を表していれば、さらに多くのバイトを節約できた。3バイトなら 1900年から約 44,000 年先まで、2バイトでも 2070 年ごろまでカバーできるtime_tで Epochalypse は解決するだろうが、すべてのシステムが単純に 64ビット秒へ移行するわけではない。ext4 はすでに 30ビットの小数解像度(ナノ秒級)と 34ビットの秒解像度に変わっているが、やはり数百年後にはまた問題が起きる見込みだ。いずれ 64ビット秒 + 64ビット小数の 128ビットタイムスタンプに落ち着くのではないかと思う。そうなれば人類史で予見可能な未来はすべてカバーできるtime64_tへの移行はすでに完了している。互換性のため i386 だけが例外で、それ以外は m68k を含めすべて変更済みだ。自分で m68k、powerpc、sh4、hppa を移行したtime_tは変数ではなくデータ型だtime_tは本当にあちこちに登場する。35,960 パッケージのうち 6,429 のソースコードに現れる。time_tを含む構造体を ABI として公開するパッケージは、ABI 全体を同時に移行しなければならない」と明記されている。Wiki のほうが記事よりも明確に説明していたRLIMIT_STACKの値を増やせばよい。たとえばulimit -s 4000なら 4MB スタックだ。さらに大きくするなら/etc/security/limits.confを修正して再ログインが必要になるMAX_ARG_STRLENを再定義してカーネルを再コンパイルすればよい。ページサイズが大きいマシン(例: 64k ページサイズの RHEL Arm カーネル)を使う手もある。ただし、コマンドバッファの代わりにパイプを使ってプロセス間でデータを渡すほうがはるかに簡単だtime_tの C++ 標準ライブラリを書いて使っていた