
[小ネタ] SynologyやQNAPのNASでNTFSフォーマットの外付けHDDから本体内のHDDにファイルを移動する場合、255バイトのファイル名文字長制限に気を付ける
先にまとめ。
・SynologyやQNAPで本体内に格納されるHDDは、おそらくEXT4でフォーマットされている
・一方、外付けHDDの場合、NTFSフォーマットのものも接続できる
・結果、NTFSで許容されていた漢字255文字の名前を持つファイルが、EXT4である本体内HDDに移動できない(255バイト=漢字83文字制限)?
いつものことだが、当たり前と言えば当たり前。だが気づくまでに時間がかかり検索してすぐに出てこなかったので、ここにメモ。
yt-dlpを使って保存した動画は、SynologyのNAS(DS220j)に接続した外付けHDDに保存していたが、
・格納先のストレージの容量が不安になってきた
・Youtube等と異なり、能力が貧弱なクライアントだと高画質動画の再生において実用とならないレベルの遅延が発生する(もしかすると端末能力ではなく回線速度のせいかも)
といった悩みがあった。
いろいろ調べた結果、「もしかしたらリアルタイムでのトランスコードに対応した大容量NASだったら解決できるのでは?」と思い、思い切ってQNAPのTS464を購入した。
そもそもトランスコードできるNASというのが現在ほぼ絶滅種っぽく、以前にはSynologyもPlayというシリーズ名で製品展開があったようなのだが、現在は見当たらない。BuffaloにはMyBoxという製品があるが、発売が10年前の2014年であり、これではトランスコード云々以前にCPUパワーが足らないのではないかもという不安が残る。
QNAPでも、少なくとも手が届きそうな範囲では2ベイのTS-462か4ベイのTS-464しか見当たらなかった。容量不足の懸念もあることから、TS-464を選択した。
TS-464をセットアップし、いよいよファイルを移動していく。
DS220j (外付けHDD)→TS-464(本体内HDD)のファイル移動をFastCopyを使用して行うが、作業していくとどういうわけか頻繁に
「ファイル名、ディレクトリ名、またはボリュームラベルの構文が間違っています」
というエラーが発生してしまう。
問題のファイルを見ると、名前が明らかに長いため、おそらくはファイル名の文字長制限に引っ掛かったのだろうと推測し、短くリネームして再処理したところ、問題なく移動できた。
その後も同様にエラーが出るたびにファイル名を短く修正していたのだが…あまりにも多くひっかかりすぎる。
ふと「今までDS200jではなんで大丈夫だったんだろう?」と疑問に思い(というかファイル名修正作業が面倒になってきたこともあり)、改めて文字長制限について調べてみた。
まずQNAP TS464について調べると、やはり「255バイトまで」という制限が存在した。漢字だと83文字制限となるため、まあまあの頻度で引っ掛かる結果となる。
QNAP NASのext4ファイルシステムでは、ファイル名の最大長(ファイル拡張子を含む)は255バイトに制限されています。
通常の漢字はUTF-8エンコーディングで3バイト使用します。そのため、84文字の漢字は252バイトになります。3文字のファイル拡張子では、さらに4バイトが追加されます(例:「.txt」では、ドットを含め、それぞれが1バイトになります)。つまり、1バイト超えて256バイトになります。
じゃあなんでSynology DS220jは平気だったのか?と念のため調べると…こちらも同じような制限があることがわかる。
この問題は、ファイルパスの長さが 244 文字を超えているために発生します。これは、長いファイル名、長い親フォルダー名、または多くの親フォルダー層が原因である可能性があります。
ネットワークドライブ上のファイルおよびフォルダーに関する Windows の規則によると、Windows API の最大パス長 (MAX_PATH) は 260 文字です。これには、ドライブ文字 (例: E:\ は 3 文字を使用)、フォルダーパス、ファイル名、および見えない終端 NULL 文字 (1 文字を使用) が含まれます。
ドライブ文字と終端 NULL 文字を除くと、ネットワークドライブ上でファイル/フォルダーを作成、名前変更、または移動するための最大パス長は 244 文字です。1 この制限を超えると、保存、名前変更、移動、または削除などのファイル操作ができなくなります。
暗号化されていない共有フォルダ内のファイル/フォルダ名は最大 255 文字(ラテン系言語以外は最大 80 文字)、ファイルパスは最大 4,096 文字とし、暗号化されている共有フォルダ内では最大 143 文字(ラテン系言語以外は最大 47 文字)、ファイルパスは最大 2,048 文字とします。
あれ?じゃあ今までは何で平気だったんだろう…
長いファイル名のテキストファイルを作成してテストしてみたところ、
DS220jやTS464の本体内HDD → ファイルを作成できない(エラー)
DS220jの外付けHDD → ファイルを作成できる
ことがわかった。
冷静になって考えてみると、
DS220jやTS464の本体内HDD → NASの指示に従ってNASでフォーマット(おそらくEXT4)
DS220jの本体内HDD → Windowsでフォーマットして接続(NTFS)
の違いがあるような気がしてきた。
改めてNASに接続したntfsについて調べてみると、
直接的な言及は見つけることができなかったが、QNAPのページで「255バイト」ではなく、NTFSでは「255文字」と言っていることがもしかしてミソなのかもしれない。
255バイト=漢字83文字制限が、NTFSである外付けHDDであれば255文字まで許容されているのだとしたら、今回の現象は説明できるような気がする。
なお、Synology DD220jでは実際にテストして外付けHDD(NTFS)であれば長いファイル名も許容されることを確認できているが、本日時点ではQNAP TS464で同様のことが可能であるかについては、未確認。
理論上はいけそう、という段階である。
さて、これで「RAID5で大容量を確保して動画サーバを作ろう!」という当初の目論見がとん挫してしまった。
(ついでに、エラーを起こしつつ少しずつファイルを移動していた2日間くらいの作業時間(と電気代)も無駄になった…)
いちおうyt-dlpには「--trim-filenames」というファイル名の長さを制限するオプションもあるようなので、
・対応方針1:既存のファイルの文字長をなんとか255バイト以内に変換+今後の分も文字長制限をしつつ、TS464の本体HDD(大容量)に保存する
※既存のファイル名変換手段の確保、yt-dlpオプションの検証が必要
・対応方針2:TS464にNTFSの外付けHDD(小容量)を接続して保存する
※ファイル名文字長、トランスコードについて要検証
のどちらかを選択することになりそうだが、はたして。