Автор Тема: Ошибка Rsync - file name too long (63)  (Прочитано 6927 раз)

Оффлайн rits

  • Завсегдатай
  • *
  • Сообщений: 1 041
  • ITS
Ошибка Rsync - file name too long (63)
« : 17.11.2020 19:48:03 »
Столкнулся с такой проблемой:
при копировании файлов (rsync) с шары NTFS в раздел с ext4 поймал сотню ошибок с длинной имени файлов превышающих 255 байт. Если выразиться словами одного лоровца, - как теперь дальше жить? )

Есть несколько вариантов решения:
1) Высечь пользователя (ей) розгой.
2) Натравить скрипт и порезать все имена файлов, пусть страдают.
3) Подобрать файловую систему аналогичную ntfs.

Меня конечно - же интересует 3 вариант, не смотря на желание реализовать первый ).
Что мы имеем (поддержка ядра fs на 256 символов в std-def) в Alt Linux в стандартной сборке?
Какие предложения, советы и личный опыт сможете предложить, проблема стратегическая и ключевая для windows замещения?

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Ошибка Rsync - file name too long (63)
« Ответ #1 : 17.11.2020 20:16:02 »
Столкнулся с такой проблемой:
при копировании файлов (rsync) с шары NTFS в раздел с ext4 поймал сотню ошибок с длинной имени файлов превышающих 255 байт.

...
3) Подобрать файловую систему аналогичную ntfs.

Меня конечно - же интересует 3 вариант, не смотря на желание реализовать первый ).
Что мы имеем (поддержка ядра fs на 256 символов в std-def) в Alt Linux в стандартной сборке?
Какие предложения, советы и личный опыт сможете предложить, проблема стратегическая и ключевая для windows замещения?

Моё ИМХО.
Покласть на линуксовые инновации и использовать наработки старой школы Линукс:
https://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits
File system   Maximum filename lenght
Reiserfs3.6   4,032 bytes
Reiser4       3,976 bytes

В те времена, у меня все системы стояли на reiser.
« Последнее редактирование: 17.11.2020 20:18:08 от Speccyfighter »

Оффлайн rits

  • Завсегдатай
  • *
  • Сообщений: 1 041
  • ITS
Re: Ошибка Rsync - file name too long (63)
« Ответ #2 : 17.11.2020 21:11:37 »
Уже переформатнул в reiserfs, проверил ошибки остались. Может какие особенные параметры монтирования нужны?

Цитировать
/mnt/smb/docsae/Бухгалтерский отдел/Общие документы/музыка/Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! .mp3": File name too long (36)
# lsblk -f
NAME   FSTYPE   LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sr0                                                                       
vda                                                                       
├─vda1 swap           c64da11e-594a-4a30-9d21-19b3764bb24b                [SWAP]
└─vda2 ext4           6f92495e-5dg8-4642-8f16-b55a3d6bd52a   21,2G    18% /
vdb                                                                       
└─vdb1 reiserfs       b6c28b32-2293-4c22-ac2e-877b23b05638   68,6G    14% /mnt/smb/docsae

ошибку выбила команда  # rsync -avh /mnt/1s/ /mnt/smb/docsae/

# mount
//1s/документы on /mnt/1s type cifs (ro,relatime,vers=2.1,cache=strict,username=admin,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.100.3,file_mode=0755,dir_mode=0755,soft,nounix,serverino,mapposix,rsize=1048576,wsize=1048576,bsize=1048576,echo_interval=60,actimeo=1)
/dev/vdb1 on /mnt/smb/docsae type reiserfs (rw,noatime)

# lens="Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! .mp3"; echo `expr length "$lens"`
204
Где затык? cifs,ntfs,rsync,reiserfs?

Оффлайн Александр Ерещенко

  • Завсегдатай
  • *
  • Сообщений: 1 159
Re: Ошибка Rsync - file name too long (63)
« Ответ #3 : 17.11.2020 22:22:37 »
Где затык? cifs,ntfs,rsync,reiserfs?
Есть предположение, что cifs

На самой ntfs (точнее, в API Windows) было ограничение на max_path (полное имя файла от корня вместе с именем диска) в 260 символов (вместе с терминальным нулем). Начиная с Windows10 1609 в API Windows появилась возможность увеличить это ограничение до 32768 символов (по ссылкам ниже есть упоминание, как указать использовать "long_path" - префикс к полному имени файла "\\?\")
На само имя файла или папки ограничение в 255 символов так и осталось.
https://docs.microsoft.com/ru-ru/windows-server/storage/file-server/ntfs-overview
и ещё по ссылкам оттуда:
https://docs.microsoft.com/ru-ru/windows/win32/fileio/naming-a-file
и далее...

Вероятно, в реализации cifs используется ещё старое ограничение на max_path. Либо сервер так отдает (версия SMB ?)
Кстати, насчет smb вполне вероятно. Вот тут с той же проблемой на самой винде:
https://answers.microsoft.com/ru-ru/windows/forum/windows_10-files/%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0/9301a139-1e87-4b07-a67c-b9a2c9c7a7cf

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Ошибка Rsync - file name too long (63)
« Ответ #4 : 17.11.2020 22:42:57 »
Для ext4 собирались увеличить лимит. Уже восьмой год "увеличивают":
https://bugs.etersoft.ru/show_bug.cgi?id=9266#c33

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Ошибка Rsync - file name too long (63)
« Ответ #5 : 17.11.2020 22:49:00 »
Проблема не в reiser. ReiserFS поддеживает длинну имени почти в четыре килобайта. Проблема в vfs ядра.

Задайте поисковику вопрос:
4032 byte limited to 255 by Linux VFS

Занять время будет чем. :-)

https://reiser4.wiki.kernel.org/index.php/X0reiserfs
Max length of file name = blocksize - 64 (for 4kb blocksize Max name length  = 4032 bytes).

Тем не менее:
# file -s /dev/sdc1
/dev/sdc1: ReiserFS V3.6
# getconf NAME_MAX /dev/sdc1
255
« Последнее редактирование: 18.11.2020 02:59:49 от Speccyfighter »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Ошибка Rsync - file name too long (63)
« Ответ #6 : 18.11.2020 01:58:25 »
reiser4 в альтах:
# udisksctl mount -b /dev/sdc1
Error mounting /dev/sdc1: GDBus.Error:org.freedesktop.UDisks2.Error.Failed: Error mounting /dev/sdc1 at /media/REISER4: unknown filesystem type 'reiser4'
# find /lib/modules/5.4.62-std-def-alt1 -name "*reiser*"
/lib/modules/5.4.62-std-def-alt1/kernel/fs/reiserfs
/lib/modules/5.4.62-std-def-alt1/kernel/fs/reiserfs/reiserfs.ko
# strings /lib/modules/5.4.62-std-def-alt1/kernel/fs/reiserfs/reiserfs.ko | grep '3.6\|3.6$\|v4' | grep -v '__\|vs'
found reiserfs format "3.6" with non-standard journal
converting 3.5 filesystem to the 3.6 format
xattrs/ACLs not supported on pre-v3.6 format filesystems. Failing mount.
*3.6*
reiserfs_3_6_magic_string
is_reiserfs_3_6
# rpm -qa | grep reiser
reiser4progs-1.2.1-alt1.x86_64
libprogsreiserfs-0.3.0.5-alt4.x86_64
libreiser4-1.2.1-alt1.x86_64
libreiser4-minimal-1.2.1-alt1.x86_64

Оффлайн rits

  • Завсегдатай
  • *
  • Сообщений: 1 041
  • ITS
Re: Ошибка Rsync - file name too long (63)
« Ответ #7 : 18.11.2020 10:17:25 »
Есть предположение, что cifs
Тупое копирование файла из под винды powershell-ом на NAS (zfs) тоже выбило ошибку. Скорее всего виной файловая система.
Читая ваши комментарии, вы меня подталкиваете на решение проблемы по первому пункту ), бухгалтерию "высек" на очереди инженеры )

Оффлайн rits

  • Завсегдатай
  • *
  • Сообщений: 1 041
  • ITS
Re: Ошибка Rsync - file name too long (63)
« Ответ #8 : 18.11.2020 10:23:04 »
reiser4 в альтах:
Расшифруй суть в двух словах.
4 я так и не смог примонтировать,
Цитировать
Примечание: в ALT Linux нет готовых ядер с поддержкой Reiser4.
https://www.altlinux.org/%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5%D0%94%D0%B8%D1%81%D0%BA%D0%B0#reiser4

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Ошибка Rsync - file name too long (63)
« Ответ #9 : 18.11.2020 10:49:53 »
reiser4 в альтах:
Расшифруй суть в двух словах.
4 я так и не смог примонтировать,
Цитировать
Примечание: в ALT Linux нет готовых ядер с поддержкой Reiser4.
https://www.altlinux.org/%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5%D0%94%D0%B8%D1%81%D0%BA%D0%B0#reiser4

Саму reiser4 можно создать на разделе, но монтировать и работать с ней нельзя, - в ядре нет модуля. А тот модуль который есть, он под reiser 3.6.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Ошибка Rsync - file name too long (63)
« Ответ #10 : 18.11.2020 11:08:56 »
Всё что написано в интернет, всё это "вода".
Конкретика тут, в ответе на вопрос:
Как я могу увеличить ограничение имени файла в Ubuntu на 143 байта для зашифрованных каталогов?

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Ошибка Rsync - file name too long (63)
« Ответ #11 : 18.11.2020 11:24:49 »
На каждый символ кириллицы, приходится 2 байта; символ латиницы, однобайтный:
[root@comp ~]# hexdump -C /path/длинноеимя.txt
00000000  d0 9c d0 b0 d0 bc d0 b0  2c 20 d1 8f 20 d0 b2 20  |........, .. .. |
00000010  d0 94 d1 83 d0 b1 d0 b0  d0 b5 21 20 d0 9c d0 b0  |..........! ....|
00000020  d0 bc d0 b0 2c 20 d0 bc  d0 b0 d0 bc d0 b0 2c 20  |...., ........, |
00000030  d1 8f 20 d0 b2 20 d0 94  d1 83 d0 b1 d0 b0 d0 b5  |.. .. ..........|
00000040  21 20 d0 9c d0 b0 d0 bc  d0 b0 2c 20 d1 8f 20 d0  |! ........, .. .|
00000050  b2 20 d0 94 d1 83 d0 b1  d0 b0 d0 b5 21 20 d0 9c  |. ..........! ..|
00000060  d0 b0 d0 bc d0 b0 2c 20  d0 bc d0 b0 d0 bc d0 b0  |......, ........|
00000070  2c 20 d1 8f 20 d0 b2 20  d0 94 d1 83 d0 b1 d0 b0  |, .. .. ........|
00000080  d0 b5 21 20 d0 9c d0 b0  d0 bc d0 b0 2c 20 d1 8f  |..! ........, ..|
00000090  20 d0 b2 20 d0 94 d1 83  d0 b1 d0 b0 d0 b5 21 20  | .. ..........! |
000000a0  d0 9c d0 b0 d0 bc d0 b0  2c 20 d0 bc d0 b0 d0 bc  |........, ......|
000000b0  d0 b0 2c 20 d1 8f 20 d0  b2 20 d0 94 d1 83 d0 b1  |.., .. .. ......|
000000c0  d0 b0 d0 b5 21 20 d0 9c  d0 b0 d0 bc d0 b0 2c 20  |....! ........, |
000000d0  d1 8f 20 d0 b2 20 d0 94  d1 83 d0 b1 d0 b0 d0 b5  |.. .. ..........|
000000e0  21 20 d0 9c d0 b0 d0 bc  d0 b0 2c 20 d0 bc d0 b0  |! ........, ....|
000000f0  d0 bc d0 b0 2c 20 d1 8f  20 d0 b2 20 d0 94 d1 83  |...., .. .. ....|
00000100  d0 b1 d0 b0 d0 b5 21 20  d0 9c d0 b0 d0 bc d0 b0  |......! ........|
00000110  2c 20 d1 8f 20 d0 b2 20  d0 94 d1 83 d0 b1 d0 b0  |, .. .. ........|
00000120  d0 b5 21 20 d0 9c d0 b0  d0 bc d0 b0 2c 20 d0 bc  |..! ........, ..|
00000130  d0 b0 d0 bc d0 b0 2c 20  d1 8f 20 d0 b2 20 d0 94  |......, .. .. ..|
00000140  d1 83 d0 b1 d0 b0 d0 b5  21 20 2e 6d 70 33        |........! .mp3|
0000014e
[root@comp ~]# cat /path/длинноеимя.txt
Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! Мама, я в Дубае! Мама, мама, я в Дубае! .mp3[root@comp ~]#

Размер в байтах
[root@comp ~]# wc -c /path/длинноеимя.txt
334 /path/длинноеимя.txt

Не в символах
# wc -m /path/длинноеимя.txt
204 /path/длинноеимя.txt

[root@comp ~]# getconf NAME_MAX /dev/sda8
255

NAME_MAX говорит о символах, но однобайтной латиницы (?):
# cat /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
« Последнее редактирование: 18.11.2020 12:19:00 от Speccyfighter »

Оффлайн rits

  • Завсегдатай
  • *
  • Сообщений: 1 041
  • ITS
Re: Ошибка Rsync - file name too long (63)
« Ответ #12 : 18.11.2020 12:34:54 »
Это ясно.
Выявить нарушителей:
find /mnt/1s -type f >  path_1s.txtwhile read line; do len=`basename "$line" | tr -d [:cntrl:] | wc -c`; if [ $len -gt 255 ]; then echo $line; fi; done < path_1s.txt минут 10, колбасил цикл текст с 40 GB мелких файлов
А тот модуль который есть, он под reiser 3.6.
Странно, что такой ключевой момент разработчики упускают. Вроде как reiser4 нашими пацанами собирался.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Ошибка Rsync - file name too long (63)
« Ответ #13 : 18.11.2020 12:47:24 »
...
NAME_MAX говорит о символах, но однобайтной латиницы (?):
# cat /usr/include/linux/limits.h
...
#define NAME_MAX         255 /* # chars in a file name */
...

В контексте нелатиницы, терминология в комментарии выбрана неверно:
Длинна имени файла считается не в символах, - в байтах. Потому как нелатиница utf8, двухбайтная.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Ошибка Rsync - file name too long (63)
« Ответ #14 : 18.11.2020 19:01:59 »
На каждый символ кириллицы, приходится 2 байта; символ латиницы, однобайтный:
...
NAME_MAX говорит о символах, но однобайтной латиницы (?):
# cat /usr/include/linux/limits.h
...
#define NAME_MAX         255 /* # chars in a file name */
#define PATH_MAX        4096 /* # chars in a path name including nul */
...
...

Также учитывая, что у альтов каталоги Desktop, Documents и прочее, кириллизованы, этот лимит в кириллице будет вдвое меньше на PATH_MAX. А значит комментарий /* # chars in a path name including nul */ также неверен и это ошибка в комментариях к {NAME,PATH}_MAX исходников ядра.
Правильно должно быть:
#define NAME_MAX         255 /* # bytes in a file name */
#define PATH_MAX        4096 /* # bytes in a path name including nul */