파일 이름 제한을 255 바이트로 늘리는 합리적인 방법이 있습니까?
파일 이름 길이 제한은 Windows (NTFS)에서는 255 "문자"이지만 Linux (ext4, BTRFS)에서는 255 "바이트"입니다. 해당 파일 시스템이 파일 이름에 사용하는 텍스트 인코딩을 잘 모르겠지만 UTF-8 인 경우 일본어와 같은 아시아 문자 하나는 3 바이트 이상을 차지할 수 있습니다. 따라서 영어의 경우 255 바이트는 255자를 의미하지만 일본어의 경우 255 바이트는 훨씬 적은 문자를 의미 할 수 있으며 이러한 제한은 경우에 따라 문제가 될 수 있습니다.
Linux 파일 시스템 / 커널 등을 수정하는 등 일반 사용자에게는 사실상 불가능한 방법 외에 Linux에서 아시아 문자에 대해 255 자 파일 이름 용량을 보장 할 수 있도록 제한을 늘리는 실용적인 방법이 있습니까?
답변
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를 잘 아는 경우가 아니면 방법이 없습니다.
대부분의 경우 255 바이트 제한은 온 디스크 형식으로 구워집니다. 예를 들어 이름 길이를 인코딩하기 위해 8 비트 만 제공하는 Ext4 를 참조하십시오 . 따라서 커널 API의 한계를 극복 할 수 있더라도 어쨌든 255 바이트를 초과하는 것은 저장할 수 없습니다.
따라서 이름 저장 확장명 (예 : 너무 긴 이름을 저장하기 위해 여러 디렉토리 항목을 사용하는 VFAT 스타일 또는 긴 이름을 저장하기 위해 별도의 파일을 사용하는 4DOS 스타일)을 생각해 내야합니다. 새로운 파일 시스템을 다시 효과적으로 생성합니다 ...