255バイトのファイル名の制限を増やすための合理的な方法はありますか?

255バイトのファイル名の制限を増やすための合理的な方法はありますか?

ファイル名の長さの制限は、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のように)、デバイスの外部からこれらのファイルシステムをマウントすることはできません。

おすすめ記事