255바이트 파일 이름 제한을 늘릴 수 있는 합리적인 방법이 있습니까?

255바이트 파일 이름 제한을 늘릴 수 있는 합리적인 방법이 있습니까?

파일 이름 길이 제한은 Windows(NTFS)에서는 255 "문자"이지만 Linux(ext4, BTRFS)에서는 255 "바이트"인 것 같습니다. 이러한 파일 시스템이 파일 이름에 어떤 텍스트 인코딩을 사용하는지 잘 모르겠지만 UTF-8인 경우 하나의 아시아 문자(예: 일본어)가 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 스타일은 별도의 파일을 사용하여 긴 이름을 저장함). 그러면 효과적으로 새 파일 시스템을 생성하게 됩니다. ......

관련 정보