Меню Рубрики

Linux максимальная длина имени файла

Ограничения длины имени файла на Linux?

Есть ли какие-либо ограничения на длину файла или пути в Linux?

См. Страницу Википедии о сравнении файловых систем , особенно в столбце Максимальная длина имени файла .

Вот некоторые ограничения длины имени файла в популярных файловых системах:

Я читал здесь, что ограничение длины пути в системных заголовках. Ограничение длины имени файла тоже там. В моей системе это файл:

и C-lang определяет:

Я имею в виду другие ответы, пожалуйста, проголосуйте за них.

Есть ли какие-либо ограничения на длину файла или пути в Linux?

Да, длина имени файла и пути ограничена:

Чтобы динамически получить эти свойства:

  • Используйте функции pathconf и fpathconf как предложено Майклом Аароном Сафяном
  • Создайте имя файла (или путь к файлу ) длиннее и длиннее, как объяснено dogbane

Используйте команду, getconf предложенную Тимом, которая также доступна в Linux:

И ради экономии времени (и привязки его к памяти):

ext2, ext3, ext4, zfs: без ограничений пути; Ограничение имени файла 255 байт.

Это длины имен файловых систем. У самого “linux” тоже есть. Например, из бит / stdio_lim.h:

Там нет никакого способа , чтобы определить максимальную длину путей на Linux переносимым способом. В моей системе:

Но я могу легко создавать пути намного длиннее, чем 4096 символов. Вместо этого смотрите PATH_MAX как нижнюю границу. Вы гарантированно сможете создавать пути так долго, но вы также можете создавать гораздо более длинные.

Вы всегда должны использовать pathconf или какую-либо функцию, подобную этой, чтобы получить значение времени выполнения для указанных элементов, поскольку на этой странице сказано, что:

Однако следует отметить, что многие из перечисленных пределов не являются инвариантными, и во время выполнения значение предела может отличаться от значений, указанных в этом заголовке, по следующим причинам:

Предел зависит от имени пути.

Предел различается между компиляцией и машинами времени выполнения.

По этим причинам приложение может использовать функции fpathconf (), pathconf () и sysconf () для определения фактического значения лимита во время выполнения.

Источник

Linux/VLFN

VLFN (Very Long FileName) – проблема, заключающаяся в том, что в большинстве Unix-систем (и в GNU/Linux в частности) применено ограничение в 255 байт на длину имени файла, что при использовании UTF-8 даёт для русских букв не более 127 символов.

В статье рассматриваются способы увеличения допустимой длины имени файлов в Linux и проблемы, с этим связанные.

Содержание

Имена файлов в Windows и Linux

В Windows для именования файлов принята кодировка UTF-16, то есть каждый символ в названии файла кодируется двумя байтами (16 бит). Максимальная длина имени файла — 255 символов (510 байт). В Linux же для именования файлов принята кодировка UTF-8, при этом максимальная длина файла составляет 255 байт (а не символов).

Причины проблемы

  • Ядро внутри себя не имеет общей константы для ограничения длины имени файла. NAME_MAX в include/linux/limits.h нужна только для программ (попадает в glibc-headers).
  • Файловые системы в ядре имеют ограничения по размеру (в ext3/4 вообще взяли и оставили 1 байт на хранение длины имени файла). В некоторых системах ограничение жёсткое (ext4), в некоторых — номинальное (btrfs).
  • glibc нигде не касается данных, связанных с ограничением длины.

Постановка задачи

Так как в UTF-8 для кодирования русских букв используется два байта, то максимальная длина имени файла, состоящего из русских букв, фактически составляет 127 символов. В связи с этим появляется проблема – длинные имена файлов (от 128 до 255 русских символов) не влезают в установленные для них ограничения в Linux.

  • NTFS – 256 символов UTF-16
  • NFS – лимит 255 символов.
  • CIFS – 260 символов UTF-16.

Решение

Необходимо увеличить возможную длину файлов в Linux.

Выбранная длина нового максимального предела имени файла – 1023 байта.

  • нет привязки к Windows, поэтому нет необходимости задавать размер ровно 511 байт;
  • имя файла задается с запасом, что позволит адаптировать ОС и ФС к иероглифической, к примеру письменности, где знаки могут занимать в районе 4 байт.

NAME_MAX free

Радикальным правильным решением для userspace является отказ от использования констант, задающих размер буфера под имя файла.

Файловые системы должны быть устроены таким образом, чтобы длина имени файла была переменной и не имела ограничений (кроме временных соображений совместимости).

Уже сделано

Был проведен тест файловой системы NTFS. Оказалось, что на данной можно создавать файлы с длинным русским именем, из чего следовало, что ограничение задается самой ФС, а не ядром или библиотекой glibc: https://bugs.etersoft.ru/show_bug.cgi?id=9266

Было решено выбрать файловую систему, которую легче всего было бы адаптировать для решения данной проблемы. Затем было проведено сравнение самых распространенных и перспективных файловых систем: http://wiki.etersoft.ru/Comparison_of_file_systems

Стоит рассмотреть такие системы как btrfs, xfs, ext4.

В итоге, благодаря гибкости и динамичности развития, была выбрана файловая система BTRFS.

BTRFS

B TRee File System – файловая система, основанная на структуре Б-деревьев и работающая по принципу «копирование при записи».

Изменения

Изначально изменен предел BTRFS_NAME_LEN, заданный в файле /fs/btrfs/ctree.h. Аналогичный предел был изменен в пакете BTRFS-progs.
Изменения: diff –git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index d6dd49b..3ae04d0 100644 — a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -154,7 +154,7 @@ struct btrfs_ordered_sum;

-#define BTRFS_NAME_LEN 255 +#define BTRFS_NAME_LEN 1023

diff –git a/include/linux/compat.h b/include/linux/compat.h index 7f0c1dd..9bbf0d9 100644 — a/include/linux/compat.h +++ b/include/linux/compat.h @@ -202,7 +202,7 @@ struct compat_dirent <

– char d_name[256]; + char d_name[1024];

diff –git a/include/uapi/linux/limits.h b/include/uapi/linux/limits.h index 2d0f941..ca17cbe 100644 — a/include/uapi/linux/limits.h +++ b/include/uapi/linux/limits.h @@ -8,7 +8,7 @@

-#define NAME_MAX 255 /* # chars in a file name */ +#define NAME_MAX 1023 /* # chars in a file name */

Тестирование

Проведено тестирование основной функциональности новой файловой системы. Для граничных значение – 1024 и 1023 байта:

  • При измененном ядре и измененной программе форматирования:

Testing glibc functions with 1023-byte filename FAILED: 0, PASSED: 20

Testing glibc functions with 1024-byte filename FAILED: 0, PASSED: 20

Testing glibc functions with 1023-byte filename

[root@host-35 btrfs]# /home/guest/glibc_vlfn_test Testing glibc functions with 1023-byte filename FAILED: 0, PASSED: 20

Testing glibc functions with 1024-byte filename FAILED: 0, PASSED: 20

  • При оригинальном ядре и измененной программе форматирования:

Testing glibc functions with 1023-byte filename Error in line:190; file: glibc_vlfn_test.c: File name too long Error in line:191; file: glibc_vlfn_test.c: File name too long Error in line:192; file: glibc_vlfn_test.c: File name too long Error in line:193; file: glibc_vlfn_test.c: File name too long Error in line:194; file: glibc_vlfn_test.c: File name too long Error in line:195; file: glibc_vlfn_test.c: File name too long Error in line:196; file: glibc_vlfn_test.c: Success Error in line:197; file: glibc_vlfn_test.c: File name too long Error in line:198; file: glibc_vlfn_test.c: File name too long Error in line:201; file: glibc_vlfn_test.c: File name too long Error in line:202; file: glibc_vlfn_test.c: No such file or directory Error in line:203; file: glibc_vlfn_test.c: File name too long Error in line:204; file: glibc_vlfn_test.c: File name too long Error in line:205; file: glibc_vlfn_test.c: File name too long Error in line:206; file: glibc_vlfn_test.c: File name too long Error in line:207; file: glibc_vlfn_test.c: No such file or directory Error in line:208; file: glibc_vlfn_test.c: File name too long Error in line:209; file: glibc_vlfn_test.c: File name too long Error in line:210; file: glibc_vlfn_test.c: Success Error in line:211; file: glibc_vlfn_test.c: File name too long FAILED: 20, PASSED: 0

Testing glibc functions with 1024-byte filename FAILED: 0, PASSED: 20

Программа для тестирования доступна тут: git.eter:/people/reprofy/public/glibc_vlfn_test.git

Применение

Для того, чтобы использовать файловую систему BTRFS с увеличенным пределом имени файла, необходимо:

  1. Установить исправленную версию ядра ( git.eter:/people/reprofy/packages/kernel_sis.git -> btrfs_new_bound );
  2. Отформатировать дисковый раздел, используя исправленную версию btrfs-progs ( git.eter:/people/reprofy/public/btrfs_progs.git -> filename_bound );
  3. Для обеспечения полной функциональности необходимо изменить предел в файле limits.h:
    1. Установить исправленный пакет kernel-source-3.9 ( git.eter:/people/reprofy/public/kernel_source_3.9.git -> namelength_increased );
    2. Установить пакет glibc-kernheaders(из репозитория git.alt );

Glibc

В самой glibc вносить изменения не нужно, единственное, что требуется – изменить предел в файле limits.h.

Пакеты

Пакеты для ALT Linux в LINUX@Etersoft:

  • glibc-kernheaders даёт возможность собирать программы с увеличенным ограничением
  • btrfs-utils не будет ругаться на длинные имена при проверке ФС
  • ядро с увеличенным ограничением для btrfs

Источник

Популярные записи

Kali linux tl wn723n
Msi afterburner под linux
Виджеты для linux mint 18
Linux list open ports
Yandex disk rosa linux
Найти файл по названию linux

Adblock
detector