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

Nov 13 2020

파일 이름 길이 제한은 Windows (NTFS)에서는 255 "문자"이지만 Linux (ext4, BTRFS)에서는 255 "바이트"입니다. 해당 파일 시스템이 파일 이름에 사용하는 텍스트 인코딩을 잘 모르겠지만 UTF-8 인 경우 일본어와 같은 아시아 문자 하나는 3 바이트 이상을 차지할 수 있습니다. 따라서 영어의 경우 255 바이트는 255자를 의미하지만 일본어의 경우 255 바이트는 훨씬 적은 문자를 의미 할 수 있으며 이러한 제한은 경우에 따라 문제가 될 수 있습니다.

Linux 파일 시스템 / 커널 등을 수정하는 등 일반 사용자에게는 사실상 불가능한 방법 외에 Linux에서 아시아 문자에 대해 255 자 파일 이름 용량을 보장 할 수 있도록 제한을 늘리는 실용적인 방법이 있습니까?

답변

3 ArtemS.Tashkinov Nov 13 2020 at 23:24

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처럼).

TLDR : 방법이 있지만 커널 해커가 아니거나 C를 잘 아는 경우가 아니면 방법이 없습니다.

2 StephenKitt Nov 13 2020 at 23:24

대부분의 경우 255 바이트 제한은 온 디스크 형식으로 구워집니다. 예를 들어 이름 길이를 인코딩하기 위해 8 비트 만 제공하는 Ext4 를 참조하십시오 . 따라서 커널 API의 한계를 극복 할 수 있더라도 어쨌든 255 바이트를 초과하는 것은 저장할 수 없습니다.

따라서 이름 저장 확장명 (예 : 너무 긴 이름을 저장하기 위해 여러 디렉토리 항목을 사용하는 VFAT 스타일 또는 긴 이름을 저장하기 위해 별도의 파일을 사용하는 4DOS 스타일)을 생각해 내야합니다. 새로운 파일 시스템을 다시 효과적으로 생성합니다 ...