У меня есть домашний файловый сервер, на котором работает FreeNAS 8. Несколько дней назад я использовал rsync для загрузки всей своей библиотеки iTunes с Mac, чтобы я мог загружать свою библиотеку по сети, а не с медленного USB-накопителя. В основном это сработало, и iTunes теперь работает намного лучше, но у меня возникают проблемы с доступом к любым песням, в которых есть символы, отличные от ascii (я впервые заметил проблему при загрузке треков Queensrÿche). Файлы будут отображаться в Finder, но при любой попытке доступа к ним они исчезнут, пока я не подключусь к серверу.
После некоторого исследования я выяснил, что это потому, что OSX использует другой порядок символов UTF, чем Linux. Файловые системы OSX используют Unicode Normalization Form D (NFD), где linux использует Form C (NFC). Rsync не конвертирует эти формы, когда он выполняет копирование с моего Mac на сервер, теперь, когда iTunes пытается получить доступ к файлу со специальным символом по сети, файлы на сервере имеют неправильную кодировку, и afpd сообщает, что они не не существует.
Как лучше всего решить эту проблему? Можно ли заставить rsync выполнять преобразование Unicode при загрузке базовой библиотеки на сервер? Могу ли я настроить afpd для передачи / получения имен файлов в формате NFD? Есть ли простое решение для изменения имен файлов на сервере? Я нашел кое-что о программе с именем convmv, но не знаю, смогу ли я запустить ее на FreeNAS.
Вы можете использовать rsync --iconv
возможность конвертировать между UTF-8 NFC и NFD, по крайней мере, если вы используете Mac. Есть специальный utf-8-mac
набор символов, обозначающий UTF-8 NFD. Итак, чтобы скопировать файлы с Mac на NAS, вам нужно запустить что-то вроде:
rsync -a --iconv=utf-8-mac,utf-8 localdir/ mynas:remotedir/
Это преобразует все локальные имена файлов из UTF-8 NFD в UTF-8 NFC на удаленном сервере. На содержимое файлов это не повлияет.
В настоящее время я использую rsync --iconv
как это:
Вы должны выполнить эту команду с машины OS X:
rsync -a --delete --iconv=UTF-8-MAC,UTF-8 'username@server.ip.address.here:/home/username/path/on/server/' /Users/username/path/on/machine/
Вы должны выполнить эту команду с машины OS X:
rsync -a --delete --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ 'username@server.ip.address.here:/home/username/path/on/server/'
Примечание: Если вы используете версию 3.0.0 или новее rsync,
--iconv
вариант, упомянутый в других ответах, явно является лучшим решением.
Что-то, что должен работа - это синхронизация между исходным каталогом и смонтированная удаленная файловая система (SMB, NFS, AFP), которые rsync будет рассматривать как локальную файловую систему.
Однако я не знаю, насколько хорошо это работает на практике, и вам нужно обойти различные проблемы, например, алгоритм дельта-передачи не будет использоваться по умолчанию (поскольку источник и место назначения являются «локальными») (возможно - no-all-file будет работать?), вы должны проверить, например, что SMB эффективно сохраняет время модификации и т. д.
Не используйте rsync для копирования файлов на NAS. Когда вы используете rsync для копирования файлов, имена файлов будут храниться на вашем NAS в формате UTF NFD (то есть в формате OSX), но сервер Samba, работающий на вашем NAS, понимает только имена файлов в формате UTF NFC. Используйте интерфейс CIFS / SMB (Samba) для копирования файлов, и все будет хорошо.
По своему опыту я рекомендую использовать SMB вместо ssh. Iconv решает проблему с кодировкой, но все еще существует проблема с разрешенными символами в разных системах:
Исходное имя файла на Mac:
https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s
После копирования с помощью rsync через SMB:
-as seen by Mac (over SMB): https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s
-as seen by Ubuntu (over SMB): https-img-9gag-fun.9cache.comphotoadK9jzN_460s
-as seen by Windows10 (over SMB): https-∀∀img-9gag-fun.9cache.com∀photo∀adK9jzN_460s
-as seen by Ubuntu server locally: https-img-9gag-fun.9cache.comphotoadK9jzN_460s
После копирования с помощью rsync через ssh (с ant без флага iconv):
-as seen by Mac (over SMB): H0INHQ~6
-as seen by Ubuntu (over SMB): H0INHQ~6
-as seen by Windows10 (over SMB): H0INHQ~6
-as seen by Ubuntu server locally: https-::img-9gag-fun.9cache.com:photo:adK9jzN_460s