Linux/VLFN

Материал из Etersoft wiki
Перейти к навигацииПерейти к поиску

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

Длинные имена файлов в Linux

Увеличение длин имен файлов в Linux.

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

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

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

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

Упоминания данной проблемы:

Решение

Предложенное решение - необходимо увеличить возможную длину файлов в Linux.
Выбранная длина нового максимального предела имени файла - 1023 байта.
Причины выбора:

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

Уже сделано

Был проведен тест файловой системы 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. В итоге, тест (glibc_vlfn_test: git.eter:/people/reprofy/public/glibc_tests.git), создающий файл с именем, длинною в 1023 байта, проверяющий работу основных функций, выводит:

[root@host-35 btrfs]# ./glibc_vlfn_test 
creat_test: working
access_test: working
chmod_test: working
open_test: working
stat_test: working 
lstat_test: working 
read_open_dir_test: working
unlink_test: working 
creat_test: working
symlink_test: working
chmod_test: working
fopen_test: working
truncate_test: working
link_test: working
remove_test: working 
mkdir_test: working
read_open_dir_test: working
rmdir_test: working
Errors: 0

Glibc

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

При использовании mc было обнаружено, что несмотря на исправленные пределы в файловой системе midnight comander не отображает длинные имена файлов. Как оказалось далее, mc берет значения констант из файла /usr/include/linux/limits.h. Последний, в свою очередь, принадлежит пакету glibc-kernheaders, который требует среди зависимостей пакет kernel-source. Исправив в kernel-source файл limits.h, собрав и установив пакет на виртуальную машину, а затем собрав и установив glibc-kernheaders, удалось добиться изменения файла /usr/include/linux/limits.h. После чего, вновь собранный mc стал корректно отображать длинные имена.