Linux&FreeBSD ハードウェア設定

YAMAMORI Takenori ●yamamori

■コラム■ CD-Rはタイムゾーンに注意

mkisofsでISO9660のファイルシステムイメージを作成する場合は, 環境変数TZ=UTCにすることをお奨めします.それを省略すると, ファイルシステム内の各ファイルのタイムスタンプが, 日本時間で記録されてしまいます.

タイムスタンプがUTC以外で記録されている場合, 各OSや,そのバージョンによって,CD-Rを読み出した時の タイムスタンプが異なってしまうという現象がおきます.

mkisofs実行時のTZ  | TZ=UTC |  TZ=JST-9
-------------------+--------+------------
Linux kernel 2.0.x |  正常  | 18時間進む
-------------------+--------+------------
Linux kernel 2.2.x |  正常  |   正常
-------------------+--------+------------
FreeBSD 3.2        |  正常  |   正常
-------------------+--------+------------
Solaris 7          |  正常  |   正常
-------------------+--------+------------
SunOS 4.1.4        |  正常  |  9時間進む
-------------------+--------+------------

本来,UNIXのファイルシステムでは,すべてUTCで時刻が記録されています. それを,たとえば "ls -l" のようなコマンドでタイムスタンプを表示させた 時に,日本時間の場合は9時間プラスして表示しているのです.

ところが,ISO9660ファイルシステムでは,UTC以外の, たとえば日本時間のままでもそのまま内部データとして記録できます. その際には,「これは日本時間での(9時間進んだ)時刻」という情報も 同時に記録しています.

日本時間で記録されたCD-ROMを読み出す際には,カーネルが タイムスタンプから一度9時間引き,(ここでUTCになる) それを"ls -l"コマンドなどが,また9時間足して時刻を表示しているのです.

ところが,Linuxのkernel 2.0.xでは,上記の「一度9時間引く」処理を, 逆に「一度9時間プラス」しているのです! このバグにより,結果として時刻は18時間進んで表示されてしまいます.

また,SunOS 4.1.4では,そもそもISO9660がUTC以外で記録されていることに 対応していないらしく,カーネルは「何も足さず何も引かず」となります. その結果,"ls -l"の表示は9時間進みます.

このような経緯や事情があるため,CD-ROMとして汎用性を持たせるためには, TZ=UTCにて,mkisofsを実行するべきだと思います.

なお,CD-ROMをDOS/Windows上から読むと,9時間遅れて表示されますが, これはDOSとUNIXのファイルシステム間において,もともと存在する問題のため, これはこれでよしとします.

ちなみに,ファイルのタイムスタンプを秒単位まで表示するには, LinuxではGNUのfileutilslsを採用しているため,

  $ ls -l --full-time

とし,FreeBSDでは,

  $ ls -lT

とします.


関連ページ:
コラム「厄介なタイムゾーン

To「Linux&FreeBSD ハードウェア設定」index


このページは、技術評論社 Linux×BSD HYPER PRESS Vol.2秋号、『もう困らない!Linux&FreeBSD ハードウェア設定テクニック』 の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 Home
yamamori