LINUX.ORG.RU

[РЕШЕНО] rsync на ntfs: не копирует

 ,


0

1

Здравствуйте!

Пытаюсь копировать файлы с помощью rsync на файловую систему NTFS, смонтированную с опцией umask=0000. rsync ругается и файлы не создаёт. Думал может файлы попадут в --partial-dir=, но этого тоже не происходит:

$ rsync -avu --partial-dir=Camera3 Camera/PRG001/ Camera2
sending incremental file list
rsync: failed to set times on "/mnt/win-d/Camera2/.": Operation not permitted (1)
./
MOV001.MOD
MOV001.MOI
MOV002.MOD
MOV002.MOI
PRG001.PGI
rsync: mkstemp "/mnt/win-d/Camera2/.MOV001.MOD.vonluu" failed: Operation not permitted (1)
rsync: mkstemp "/mnt/win-d/Camera2/.MOV001.MOI.QoPSh6" failed: Operation not permitted (1)
rsync: mkstemp "/mnt/win-d/Camera2/.MOV002.MOD.5zsu5H" failed: Operation not permitted (1)
rsync: mkstemp "/mnt/win-d/Camera2/.MOV002.MOI.YniqZj" failed: Operation not permitted (1)
rsync: mkstemp "/mnt/win-d/Camera2/.PRG001.PGI.f4GqTV" failed: Operation not permitted (1)

sent 17,669,953 bytes  received 675 bytes  35,341,256.00 bytes/sec
total size is 17,665,297  speedup is 1.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1]

Пишет что передал 17,5 Мб, но куда они все пропали? Если ntfs примонтировать без umask, то копирование проходит и даже timestamp'ы копируются. Если попробовать без опции -a, с опцией -r, копирование так же проходит (без сохранения timestamp'ов). По ссылке полный strace:

https://drive.google.com/open?id=0ByWS85CFyRGwRC1BZWwybDZadDA

И в нём я не вижу ни намёка на попытку создания нового файла.

Файлы я, конечно, уже давно скопировал с помощью cp, но привязался я к этой проблемы вовсе не из-за этого. Дело в том, что я пишу файловый менеджер (не ещё один Explorer-подобный или Norton-подобный, а действительно уникальный, ссылка на проект в профиле) и рассчитываю использовать rsync для копирования файлов. Это даст интересные плюшки как лёгкое докопирование и лёгкое обновление backup'а. И понятно, что файловый менеджер должен нормально отрабатывать копирование и на ntfs и на что угодно.

Когда пытаюсь делать mkstemp ручками никакой ошибки не происходит, временный файл создаётся. А мне нужно способ как кратчайшим путём узнать что rsync -a не пройдёт, и переключится на rsync -r. Есть идеи?

★★★★★

Последнее исправление: unDEFER (всего исправлений: 2)

смонтированную с опцией umask=0000

Если ntfs примонтировать без umask, то копирование проходит и даже timestamp'ы копируются.

В мане на mount.ntfs-3g стоит, что default umask и есть 0.

umask=value

Set the bitmask of the file and directory permissions that are not present. The value is given in octal. The default value is 0 which means full access to everybody.

Хотя ключевое слово здесь, наверное: that are not present.

gag ★★★★★
()

Короче, код mkstemp в rsync такой:

/* like mkstemp but forces permissions */
int do_mkstemp(char *template, mode_t perms)
{
    RETURN_ERROR_IF(dry_run, 0);
    RETURN_ERROR_IF(read_only, EROFS);
    perms |= S_IWUSR;

#if defined HAVE_SECURE_MKSTEMP && defined HAVE_FCHMOD && (!defined HAVE_OPEN64 || defined HAVE_MKSTEMP64)
    {
        int fd = mkstemp(template);
        if (fd == -1)
            return -1;
        if (fchmod(fd, perms) != 0 && preserve_perms) {
            int errno_save = errno;
            close(fd);
            unlink(template);
            errno = errno_save;
            return -1;
        }
#if defined HAVE_SETMODE && O_BINARY
        setmode(fd, O_BINARY);
#endif
        return fd;
    }
#else
    if (!mktemp(template))
        return -1;
    return do_open(template, O_RDWR|O_EXCL|O_CREAT, perms);
#endif
}

Т.е. после mkstemp идёт fchmod и если chmod не удался файл стирается (unlink).

Проверил, действительно chmod с umask=0000 chmod ругается «Операция не позволена», без umask=0000 работает (ничего не делает, но притворяется что всё сделал).

Тема закрыта.

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