====== FreeBSD 14.3ではZFSのlongnameフィーチャーは事実上非対応っぽい? ====== [[https://github.com/openzfs/zfs/releases/tag/zfs-2.3.0|OpenZFS 2.3.0]]で、個人的に待望の[[https://openzfs.github.io/openzfs-docs/man/master/7/zpool-features.7.html#longname|longnameフィーチャー]]がリリースされた。 ZFSにおけるファイル名・ディレクトリ名(以後、まとめてファイル名と表記する)の最大長は、UNIX系の習わし(?)に沿って255 bytesとなっているが、longnameフィーチャーを有効にすると、その制約を打ち破って1023 bytesまで使えるようになる。単純に上限が固定的に引き上げられるといったものではなく、255 bytes超の名前があると機能がアクティブとなり、無くなれば非アクティブになるといった、動的な挙動となっているようだ。 この255バイトという伝統的な値は''NAME_MAX''マクロに由来し、FreeBSDの場合は[[https://github.com/freebsd/freebsd-src/blob/releng/14.3/sys/sys/syslimits.h#L55|/usr/src/sus/sys/syslimits.h]]で定義されている。厳密にいうと、ZFSでの制約は自身が定義している定数由来なのだが、''NAME_MAX''を意識した値であろうと思われる。なお、ここで注意が必要なのは、ファイルパスの最大長は''PATH_MAX''と別に定義されており、FreeBSDの場合は1023バイトとなっている。本記事で取り扱うのは、あくまでファイル名の最大長の方である。 現代的なUNIX系のファイルシステムでは、必ずしもこの制限に縛られることはないようだが、有名どころの[[https://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits|FSは大抵255バイトが上限]]となっている。 255**バイトも**あって何が不満かと言われれば、ファイル名の文字エンコーディングにUTF-8を採用すると、最大文字数がだいぶ心許ないってこと。UTF-8の場合、日本語の文字は大半が3バイト、場合によっては4バイトで表現されるため、いわゆる全角換算で85~63文字に目減りしちゃうんですな。この問題はとりわけWindowsとファイル共有した時に顕在化しやすい。というのも、Windowsの主要FSの最大長はUTF-16で255**文字**((UNCは話がややこしくなるので考慮しない))なので、つい長い名前つけちゃって、FreeBSD+Sambaな共有フォルダにコピーしようとして失敗、なんてことが年に数回起きる。これが1023バイトならUTF-8でも341~255文字となり、大変都合がいいわけですよ。 そんなわけで、longnameフィーチャーには大変期待していたのだが、どうもFreeBSD 14.3-RELEASE時点では事実上使えないようだ。 ZFS自体の255バイト制限はなくなったものの、FreeBSDの[[https://github.com/freebsd/freebsd-src/blob/5982521fe3dd3f1627bbe29ee8c3b190a24e3963/sys/kern/vfs_lookup.c#L1134|VFSレイヤーに255バイト制限が残っていて]]、この影響を受ける模様。実際、PortsからOpenZFS 2.3.0入れて試してみたが255バイト制限は突破できなかった…。Sambaは''NAME_MAX''等の直接的な制限は受けないようだし、[[https://note.com/pure_crab3639/n/nc97d3d2610ff|Linux+Sambaでは問題なく機能している]]ようだし、やはりFreeBSD側の制限の可能性が大。 VFSの根っこの部分っぽいし、改善されるのかなー? 正直、longnameは今すぐにも使いたい。というか、256バイト以上のファイル名を含むデータセットをFreeBSDに持ってきた時に変なことにならないんだろうか…?ついにLinuxに鞍替えするときが来たのか!?