Solaris/Linux/FreeBSDでCD-Rを焼こう |
YAMAMORI Takenori ●yamamori |
UNIXのファイルシステムでは,ファイルのタイムスタンプはUTCで記録されます. 一方,DOS/Windowsなどでは,ローカルタイム(日本では日本時間)で記録されます. では,ISO9660ではどうかというと,フォーマット上はどのタイムゾーンの タイムスタンプででも記録できます.そして,どのタイムゾーンで記録したかを示す, 15分単位のオフセットデータも同時に記録されます.
ここで,このオフセットデータの扱いに問題があるのです. 具体的には,Linuxのkernel-2.0.xで,このオフセットを引き算しなければ ならないところを間違えて足し算しているのです.
/* timezone offset is unreliable on some disks */ if (-48 <= tz && tz <= 52) crtime += tz * 15 * 60; -- ここは += ではなく -= でなければならない |
このため,日本時間(JST)で記録されたCD-ROMをLinux kernel-2.0.xで読むと, タイムスタンプが18時間進んで表示されます.(UTCとJSTの差の9時間の2倍)
また,SunOS 4.xでは,タイムゾーンのオフセット自体に対応しておらず, タイムスタンプが9時間進んで見えます.
もちろん,Linuxならkernel-2.2.x以降を使えばよいのですが, 問題は,タイムゾーンオフセットを正常に扱えないOSも すでに普及してしまっていることです. 「あらゆるOSで同じように読めるようにしたい」という考えから, タイムゾーンはUTCで記録するのが適当であると思います.