NTFS,ext3,ReiserFS等のファイル名の長さの話 

December 26, 2007

ファイル名の長さの制限


概要


NTFS(Windows) : 255文字(UTF-16)
ext3(及びUNIXのファイルシステム一般) : 255バイト

NTFSとHFS+ではファイル名にUTF-16を使用することが仕様で規定されているが、
Unix系のファイルシステムではファイル名の文字コードの規定はなく、NULL(0x00)と"/"(0x2f)を含まない任意のバイト列が使用できるようになっている。

ASCII文字だけ使うなら上記のどのファイルシステムでも同等だけど、マルチバイト文字を使うとext3の方が使える文字が少なくなる。
今のLinuxは文字コードにUTF-8を採用しているので、日本語は1文字3バイトとなり、255/3=85文字でファイル名のリミットとなる。

ext系


Filesystems HOWTOにてext2でも必要なら1012バイトまで拡張可能という記述があるが、その方法は発見できなかった。
多分理屈上ファイル名用に1012バイト確保できるみたいな話で、実際に出来るようにはなっていないんじゃなかろうか。

ReiserFS


ReiserFSについては、公式に
Max length of file name = blocksize - 64 (for 4kb blocksize Max name length = 4032 bytes).

の記述がある。
ブロックサイズを大きくすればそれだけファイル名に使える文字数も増えるということらしい。
しかし実際に
# mkreiserfs /dev/hd?? -b 4096
でReiserFSを作っても256バイト以上のファイル名を付けようとすると失敗する。
この理由については、LKMLでのこのやりとりが参考になる。
要約すると
Linux Kernelのdirent.hでファイル名のところはd_name[256]ってハードコーディングされている。
だから256バイト以上のファイル名を扱おうとするとカーネル内でバッファオーバーフローが発生してしまう。
これを防ぐためにファイルシステムにもファイル名255バイトの制限が必要なんだっていう内容。

そんな事情らしい。
そう言われるとUnixのツールにもファイル名最大255バイト決め打ちになっているものが結構ありそうな気がする。

で、気になるのはja/en.wikipedia等各所で散見されるReiserFSの制限が4032バイトだという記述。
ReiserFS側の制限はあくまでblocksize - 64の式で与えられるもので、例えばblocksizeが4kBなら4032バイトになりますよ、っていうだけの話。
blocksizeは8kBまで取れるから、ファイル名の最長は8192-64=8128バイトになるはず、だと思う。

実際255バイトまでしか使えないからみんな興味ないのかな。

まとめ


結局何が言いたかったかというと、長いサブタイをネタにしていた、あれとかこれとかのアニメをLinux機にコピーするときは気を付けろってこと。

nig_luce at 12:16│Comments(3)TrackBack(1)

トラックバックURL

この記事へのトラックバック

1. Mac + NAS だとファイル名制限が最長 42 文字になる件について  [ blog.remora.cx ]   January 11, 2011 10:37
先に結論から書いておこう。次の条件だとファイル名の文字数についての制限がかなり厳しくなってしまう。 OS が Mac である。 Linux ベースの NAS を使っている。 (半)濁点の付いたひらがな・カタカナを多用する。 上記の条件で最悪の場合、ファイル名には 42 文字という制...

この記事へのコメント

1. Posted by XERE   May 01, 2011 13:57
4 Ubuntu-server 10.10 AMD64にて、LVMな12TB(2TB*6)のVGをNTFSでフォーマットして、smbでネットワークストレージとして使っています。
この記事も参考になりました。

sambaの設定で、扱うファイル名、dos charsetをUTF-8にしました。

おかげで、アレなファイル名なファイルも扱えるようになりました。
2. Posted by    September 29, 2013 13:03
まさにその、ReiserFSは4032バイトというのを信じて使ってみたけど、実際は500バイト程度のファイル名がつけられなかった。
Linuxにはがっかりだよ。
3. Posted by 通りすがり   May 05, 2014 19:23
d_name[256]の所をd_name[5000]とかにして、カーネルを再コンパイルしてみようと思う人はいないの?

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
GWAVE公式WEB