有没有合理的方法来增加 255 字节的文件名限制?

Dam*_*les 6 filesystems filenames

似乎文件名长度限制在 Windows (NTFS) 上为 255 个“字符”,但在 Linux(ext4、BTRFS)上为 255 个“字节”。我不确定这些文件系统用于文件名的文本编码是什么,但如果它是 UTF-8,一个亚洲字符(如日语)可能需要 3 个或更多字节。因此,对于英语,255 字节意味着 255 个字符,但对于日语,255 字节可能意味着更少的字符,并且这种限制在某些情况下可能会出现问题。

除了像修改 Linux 文件系统/内核等一般用户几乎不可能的方法之外,还有什么实用的方法可以增加限制,以便我可以保证 Linux 上亚洲字符的 255 个字符的文件名容量?

Ste*_*itt 9

在许多情况下,255 字节的限制已融入磁盘格式中;例如Ext4只提供 8 位来编码名称长度。因此,即使您可以解决内核 API\xe2\x80\x99 限制,您也\xe2\x80\x99 无法存储任何超过 255 字节的内容。

\n

因此,您必须提出一个名称存储扩展(例如,VFAT 样式使用多个目录条目来存储太长的名称,或者 4DOS 样式使用单独的文件来存储长名称),然后您\ xe2\x80\x99正在有效地创建一个新的文件系统...

\n


Art*_*nov 8

TL/DR:有办法,但除非您是内核黑客/非常了解 C,否则没有办法。


详细解答:

虽然 glibc#define FILENAME_MAX 4096在 Linux 上定义将路径长度限制为 4096 字节,但 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
Run Code Online (Sandbox Code Playgroud)

下面是一段代码,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;
}
Run Code Online (Sandbox Code Playgroud)

因此,您不仅必须重新定义此限制,还必须重写文件系统源代码(和磁盘结构)才能使用它。然后在您的设备之外,您将无法安装这样的文件系统,除非您使用其扩展名来存储很长的文件名(如 FAT32 那样)。

  • @DamnVegetables,当设置 255 字节限制时,不同的国家/地区倾向于使用自己的字符编码,因此它可以轻松容纳 255 个 ASCII 字符或 255 个 JIS X 0201 假名。(当时,无论编码如何,255 字节的文件名都被认为比任何有理智的人需要的长度都要长——大多数人都必须处理诸如 DOS 的 8.3 限制之类的事情,而 Mac 的 31 个字符的限制被认为是奢侈的。) (2认同)
  • @DamnVegetables Bell Systems Unix 有 14 个字符的文件名限制。 (2认同)