/etc/ld.so.preload
не игнорируется Debian 10. Если я впишу в него/lib/x86_64-linux-gnu/libpcre.so.3
(одну строку )в своей системе, $ LD_DEBUG=files sleep 1
сообщит об этом обратно.
В то время как 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, у вас нет способа.
Во многих случаях ограничение в 255 -байт встроено в формат на -диске; см., например, Ext4 , который предоставляет только 8 бит для кодирования длины имени. Таким образом, даже если бы вы могли обойти ограничения API ядра, вы все равно не смогли бы хранить что-либо длиннее 255 байт.
Следовательно, вам придется придумать расширение для хранения имен (, например, стиль VFAT -, использующий несколько записей каталога для хранения слишком длинных имен, или стиль 4DOS -, использующий отдельный файл для хранения длинные имена ), а затем вы фактически создаете новую файловую систему...