ファイル名の長さの制限は、Windows(NTFS)では255「文字」ですが、Linux(ext4、BTRFS)では255「バイト」のようです。これらのファイルシステムがファイル名にどのようなテキストエンコーディングを使用するかはわかりませんが、UTF-8の場合、1つのアジア文字(日本語)が3バイト以上を占める可能性があります。したがって、英語の場合、255バイトは255文字を意味しますが、日本語の場合、255バイトははるかに少ない文字を意味し、これらの制限は場合によっては問題になる可能性があります。
一般ユーザーには、ほとんど不可能な方法(Linuxファイルシステム/カーネルの修正など)に加えて、Linuxでアジア文字に対して255文字のファイル名容量を確保できるように制限を増やすための実用的な方法はありますか?
答え1
TL/DR:方法はありますが、カーネルハッカーであるかCをよく知らない限り、方法はありません。
詳細な答え:
glibc は、#define FILENAME_MAX 4096
パスの長さを 4096 バイトに制限するように Linux で定義されていますが、Linux VFS には、すべてのファイルシステムが準拠する必要がある 255 バイトの厳しい制限があります。上記の制限は、次のように定義されます/usr/include/linux/limits.h
。
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _LINUX_LIMITS_H
#define _LINUX_LIMITS_H
#define NR_OPEN 1024
#define NGROUPS_MAX 65536 /* supplemental group IDs are available */
#define ARG_MAX 131072 /* # bytes of args + environ for exec() */
#define LINK_MAX 127 /* # links a file may have */
#define MAX_CANON 255 /* size of the canonical input queue */
#define MAX_INPUT 255 /* size of the type-ahead buffer */
#define NAME_MAX 255 /* # chars in a file name */
#define PATH_MAX 4096 /* # chars in a path name including nul */
#define PIPE_BUF 4096 /* # bytes in atomic write to a pipe */
#define XATTR_NAME_MAX 255 /* # chars in an extended attribute name */
#define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */
#define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */
#define RTSIG_MAX 32
#endif
linux/fs/libfs.c
以下は、255文字を超えるファイル名を使用したい場合にエラーを発生させるコードです。
/*
* Lookup the data. This is trivial - if the dentry didn't already
* exist, we know it is negative. Set d_op to delete negative dentries.
*/
struct dentry *simple_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
{
if (dentry->d_name.len > NAME_MAX)
return ERR_PTR(-ENAMETOOLONG);
if (!dentry->d_sb->s_d_op)
d_set_d_op(dentry, &simple_dentry_operations);
d_add(dentry, NULL);
return NULL;
}
したがって、この制限を再定義する必要があるだけでなく、それを使用するにはファイルシステムのソースコード(およびディスク構造)も再構築する必要があります。その後、拡張子を使用して非常に長いファイル名を保存しない限り(FAT32のように)、デバイスの外部からこれらのファイルシステムをマウントすることはできません。
答え2
多くの場合、255バイトの制限がディスク形式に組み込まれています。外部4名前の長さをエンコードするために8ビットのみを提供します。したがって、カーネルAPIの制限を解決できますが、255バイトを超えるエントリを保存することはできません。
したがって、名前の保存拡張を作成する必要があります(たとえば、VFATスタイルは複数のディレクトリエントリを使用して長すぎる名前を保存するか、4DOSスタイルは別のファイルを使用して長い名前を保存します)。これにより、効果的に新しいファイルシステムが作成されます。 ......