[samba-jp:20708] Re: ファイル更新時刻の精度

YAMASAKI Hiroyuki yamasaki.hiroyuki @ sp.qnes.nec.co.jp
2009年 5月 25日 (月) 18:53:45 JST


山崎と申します。

>Linux ではカーネル 2.6.22 から utimenstat というシステムコールが
>追加され、これを使うとナノ秒単位でタイムスタンプをセットできる
>ようですが。

興味深いですね。

ちょっと動作確認するだけなら、samba3.0.25以降は、vfsのutimeのインタ
フェースの引数の型がstruct timespec(ナノ秒単位)になっているので、
samba本体を改造しなくてもvfsオブジェクト(プラグイン)の作成すること
で動作を確認できます。

で、試しに、そのutimenstatを使うVFS objectを自作してみました。
VFSのサンプルソースをベースにして、修正は数行です。
(添付ファイルがパッチ)

結果として、100ナノ秒精度のタイムスタンプの保存がうまくいくようです。


■環境

OS: Fedora 11 prerelease

高精度タイムスタンプに関係しそうなモジュールのバージョンは以下。
 kernel-2.6.29
 ext4
 glibc-2.10.1
 samba-3.3.2(OS付属)


■手順

	●samba-3.3.2のソースをダウンロードし、展開(fedora11に付属のsambaのバージョンに合わせたソースを取得)
	●cd samba-3.3.2/source
	●./configureを実行。(include/config.hの作成のみで、makeしなくていいはず。)
	●cd ../examples/VFS
	●cp skel_transparent.c vfs_linux_utimensat.c
	●patch < vfs.patch
	●./autogen.sh
	●./configure
	●make (vfs_linux_utimensat.soが生成される)
	●cp vfs_linux_utimensat.so /usr/lib/samba/vfs 
	●smb.confにテスト用共有のセクションを作り、 そのセクション内に
	  vfs objects = vfs_linux_utimensat 
	 を追加。
	●service smb restart

■テスト結果

下記のコマンドsetfiletimeは、100ナノ秒単位で設定するための私の自作のテストプログラム(
なので、このメールのとおり試すことはできませんが・・・

---------- Windows見え(vfs objects設定無し)---------------------------------------------------------
C:\>setfiletime z:\before 9999
*Error*: GetFileTime timestamp != SetFileTime timestamp
 SetFileTime timestamp = 1999/12/31 23:58:59 777(millisec) 9999(100nanosec)
 GetFileTime timestamp = 1999/12/31 23:58:59 777(millisec) 9990(100nanosec)
                                                              ↑素では100ナノ秒の位が保存されない。
----------------------------------------------------------------------------------------------------

---------- Windows見え(vfs_linux_utimensat追加)-----------------------------------------------------
C:\>setfiletime z:\after 9999
Success: GetFileTime timestamp == SetFileTime timestamp
 SetFileTime timestamp = 1999/12/31 23:58:59 777(millisec) 9999(100nanosec)
 GetFileTime timestamp = 1999/12/31 23:58:59 777(millisec) 9999(100nanosec)
                                                              ↑100ナノ秒の位が保存されるようになった。
----------------------------------------------------------------------------------------------------

---------- Linux上でのls結果 -----------------------------------------------------------------------
[root @ localhost owner]# ls -l --full-time before after
-rwxr--r-- 1 owner owner 0 1999-12-31 23:58:59.777999900 +0900 after
-rwxr--r-- 1 owner owner 0 1999-12-31 23:58:59.777999000 +0900 before
                                                     ↑vfs_linux_utimensat設定後の方は100ナノ秒の位が
                                                       保存されている
----------------------------------------------------------------------------------------------------




samba-jp メーリングリストの案内