LINUX.ORG.RU
ФорумAdmin

Траблы с длинными именами в кириллице

 ,


0

4

Я сделал бэкап директории, которая на винде через ssh. От rsync пришлось отказаться, так как она плохо работала с длинными путями к файлам. Поэтому на стороне винды использовал syncovery. Файлы бэкапятся по ssh на линуксовый ext4 раздел.

На компе, откуда они бэкапятся, любили давать файлом максимально длинные имена. Таким образом, там есть файлы, у которых имя состоит из 255 символов. Причем, в кириллице. Винда там - семерка.

И все отработало на вид нормально! Но. Получилось, что имя файла занимает больше 255 байт, а ограничение ext4 - 255 байт.

Я не знаю, почему оно работает и где хранит «лишние» байты названия. Как оно сохранило такие длинные имена файлов - затрудняюсь ответить. По ls они выводятся нормально. cat,rm работает (и на том спасибо). Но скопировать их невозможно: слишком длинное имя. Перенаправить вывод cat в файл с таким длинным именем - не получается. rsync тоже не работает. Я даже подебажил немножко и выяснил, что фейлится системный вызов lstat, с ошибкой - слишком длинное имя.

Так же, под линуксом невозможно обычными средствами создать такой файл:

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
    int fd = open("однажды в студенную зимнюю пору я из лесу вышел был сильный мороз. Раз два три. проба проба это проба. проба расского текста длинный файл букв", O_RDWR|O_CREAT, 0777);
}

Как создаются эти файлы при копировании через ssh - загадка. Наверное, ssh использует не open, а что-то другое.

Вопросы: Насколько опасно иметь такие длинные файлы? Не может ли это повредить ext4? Как бы их все же скопировать? Хотелось раз в неделю делать rsync в другой каталог, и он делается, но файлы с длинными именами игнорируются. Почему лажает вызов lstat? Что вообще происходит? Это какая-то лажа, так быть не должно.

Тебе бы 8.3 заставить использовать, радовался бы бесконечно длинному имени в 255 байт (спать пора уже, а винде же UTF-16 вроде до кучи) божественного юникода.

Это какая-то лажа, так быть не должно.

Лажа это в винде — нельзя символы, не понимает регистр.

Кто-то тут патчил ядро, но до ext4 даже тот энтузиаст не добрался. Самое простое и очевидное — переименовывать. Иди хранить бекап на NTFS.

mandala ★★★★ ()
Последнее исправление: mandala (всего исправлений: 1)
Ответ на: комментарий от mandala

ага, вот и ответ. Оказалось, что оно у меня сохраняет на примаунченый ntfs, поэтому и получается больше 255 байт. Я типа, когда пытался это завести, то в угаре примаунтил туда ntfs и забыл про это.

Если бы в винде можно было задать ограничение - ну конечно не 8.3, но 32 символа я бы задал.

chabapok ()
Ответ на: комментарий от mandala

Хочется перенести архив с ntfs на btrfs. А на btrfs ограничение 255 байт. Получается, что виндовые файлы нормально на линукс не забэкапишь.

chabapok ()
Ответ на: комментарий от akk

о, спасибо

Правда, не хочется откатываться на более старое ядро. Я уже на 4.4

сейчас грепнул BTRFS_NAME_LEN - вроде ничего серьезного. Константа участвует только в проверках и размерах буферов. Если припечет - буду заменять ее.

chabapok ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.