Есть ли разумный способ увеличить ограничение имени файла до 255 байт?

/etc/ld.so.preloadне игнорируется Debian 10. Если я впишу в него/lib/x86_64-linux-gnu/libpcre.so.3(одну строку )в своей системе, $ LD_DEBUG=files sleep 1сообщит об этом обратно.

6
13.11.2020, 17:22
2 ответа

В то время как 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

А вот фрагмент кода из 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, у вас нет способа.

3
18.03.2021, 22:49

Во многих случаях ограничение в 255 -байт встроено в формат на -диске; см., например, Ext4 , который предоставляет только 8 бит для кодирования длины имени. Таким образом, даже если бы вы могли обойти ограничения API ядра, вы все равно не смогли бы хранить что-либо длиннее 255 байт.

Следовательно, вам придется придумать расширение для хранения имен (, например, стиль VFAT -, использующий несколько записей каталога для хранения слишком длинных имен, или стиль 4DOS -, использующий отдельный файл для хранения длинные имена ), а затем вы фактически создаете новую файловую систему...

2
18.03.2021, 22:49

Теги

Похожие вопросы