旅とプログラミングを少々

趣味に関する記録などをします。さしあたっては2017年JGC修行とプログラミング入門に関しての内容を連ねていきます。

32bit版Linuxの2038年問題

一般のPCではもはや64bit CPUが当然となっているが、多様なマシンのために今も32bit版のLinuxはメンテナンスが続けられている。おそらくそういった環境では今後数回のアップデートに対応できるかどうかはシステムの寿命に関わる大事なものとなる。

2038年、2038-01-19 03:14:07 UTCの瞬間に32bitのtime_tでは時刻を表現できなくなり、時刻が1901-12-13 20:45:52 UTCへとループしてしまう。

実は既にここしばらくのカーネルアップデートで密かに対応が進んでおり、32bit版でも内部的には64bitで確保した時刻を32bitにして返している。 (2015年ごろから継続的にコードと議論が続いている https://lkml.org/lkml/2015/5/6/597 etc.)

そして間に合えば次のLinux 5.1かあるいはLinux5.2からはついにユーザー側インタフェースでもtime_tが64bitとなるオプションが追加されるのだ。

変更が入れば23個のシステムコールが影響され、新たにtime64版が提供されるようになる。大抵のソフトウェアはたいてい直接これらシステムコールの呼び出しをせずlibc経由で使っているだろうから、glibcでY2038-Incompatibleとなっている関数などを参考に64bit対応版へ置き換えを進めるか、きっぱりと32bit版をサポートしないと切り捨てていかなければならない。

 

 

参考

64bit time in 32bit system example from some kernel developers: https://git.kernel.org/pub/scm/linux/kernel/git/arnd/playground.git/log/?h=y2038-syscalls

glibc Y2038 design: https://sourceware.org/glibc/wiki/Y2038ProofnessDesign