3

Общий ресурс NFS монтируется с помощью команды mount server:/share x:
Файл (кириллица) «Новый текстовый документ.txt», созданный с помощью общего ресурса samba (и использующего UTF-8), отображается как «РќРѕРІС‹ Р№ С‚РµРєСЃС‚РѕРІС ‹Р№РґРѕРєСѓРјРµРЅС‚.txt» в Windows через общий ресурс NFS.
Как заставить Windows использовать UTF-8?

3 ответа3

3

Вы можете использовать fuse-convmvfs: смонтировать папку на сервере с помощью fuse-convmvfs (входная кодировка - utf8, выходной - cp1251) и настроить nfsd для использования преобразованной FS

пример:

> convmvfs /mnt/converted-folder -o srcdir=/path/to/source/foleder, icharset=utf8,ocharset=cp1251

> vi /etc/exports
/mnt/converted-folder 192.168.1.*(rw,sync)
2

Нет решения с NFS-клиентом Microsoft в Windows 7

В этом случае нет способа решить вашу проблему, даже метод, указанный в "Правильном ответе" на этот вопрос. Это не ошибка, это задумано, чтобы создать барьер, с которым вы сталкиваетесь. Невозможно, чтобы разработчик NFS Client предложил вариант использования BIG5, EUC-KR, EUC-JP, ksc5601, GB18030, SHIFT-JIS и просто забыл UTF-8 и продолжал забывать исправлять его в течение десятилетия. Все эти кодировки используются различными версиями Windows, кроме UTF-8, что не случайно. Фактически, Microsoft намерена создать старую версию UNIX и Windows, чтобы ускорить миграцию с Unix на Windows, и необходимо тщательно измерить, что это не дает конкурентной Linux простой среды для существования. Любые функции, отличающие Linux от Unix, или современные Unix, отличные от старых, которые должны быть заменены, исключаются. Это точность в маркетинге, хорошо выполненная работа.

Позвольте мне показать вам, как заблокированы все пути:

Чтобы обойти клиентскую сторону не пойдет:

Идея состоит в том, чтобы найти программное обеспечение, которое может динамически перекодировать имена файлов, например, вставляя себе слой между FS и ОС. Или найдите программное обеспечение, которое может настроить среду для другого программного обеспечения для использования этой файловой системы. Никакое известное программное обеспечение Windows не может сделать это. Это не работает, потому что в отличие от Linux, который позволяет каждому приложению использовать различную кодировку, Windows настраивает кодировку для FILESYSTEM.

Для обхода сервера нет пути:

Большинство серверов NFS являются Linux. Теоретически можно использовать fuse-convmvfs, чтобы создать зеркало файловой системы и экспортировать его. Олег Лобач продемонстрировал код для этого, и он помечен как корректный без теста. Это не работает, потому что NFS-сервер Linux может экспортировать файловую систему FUSE только в NFSv4, а не в NFSv2/v3, в то же время Windows 7 (а также Services for Unix v3.5) поддерживают только NFSv2/v3, но не NFSv4. Я продемонстрировал это ограничение подробно в другом ответе.

Проблема разработана в TechNet:

Имя файла POSIX - это не ASCII, а поток байтов. То же самое касается имен файлов в файловых системах NFS. Интерпретация байтового потока как имени файла в определенном наборе кодов оставляется в качестве упражнения для клиентского приложения. Если поток байтов имени файла представляет собой допустимую строку UTF-8, но клиентское приложение установило кодовый набор, скажем, ISO-8859-5, любая проблема связана с ошибкой приложения. Но мы говорим о Windows. В Windows интерпретация имени файла не предоставляется приложению. Скорее, байтовый поток с именем файла, отправляемый с сервера NFS на клиентский компьютер Windows, должен быть преобразован в строку UTF-16, чтобы ОС могла его переваривать. Поэтому интерпретация байтового потока имени файла должна выполняться клиентской службой NFS для каждой точки монтирования. Приложение не имеет права голоса. И вот проблема. Если для создания имен файлов используется удаленный кодовый набор UTF-8, как это делается по умолчанию в течение многих лет в мире POSIX, то нет шансов получить правильное имя файла с точки зрения приложения Windows, поскольку интерпретация имени файла уже сделана клиентом Windows NFS, который не позволяет преобразование из UTF-8 в UTF-16. Фактически, клиент NFS поддерживает только ограниченное число преобразований кодового набора в UTF-16, причем все они довольно старомодны. Это не просто конкретный сценарий. Эта проблема возникает во всех сценариях, в которых вы обращаетесь к общим ресурсам NFS на компьютерах, настроенных на использование MBCS, таких как UTF-8 или GB-18030, из клиентов Windows NFS.

Есть решения, если вы выберете переключатель:

Лучшее решение, конечно, отказаться от Windows. Это не важно в наше время, и глобальная тенденция больше не выпускает программное обеспечение только для Windows. Если вы застряли в старых приложениях Windows, вы можете изменить свое требование:

  • Переключение клиента NFSv2/v3: вы можете установить dokan user-land mount driver для Windows, затем Neko NFS drive, который сопоставляет NFS с драйвером устройства с опцией "Unicode". Нажмите эту опцию, чтобы заставить работать UTF8. Он поддерживает NFSv2 и v3, но не v4. Он еще не поддерживает символическую ссылку (как клиент Microsoft).

  • Siwtch NFSv4 Client: вы можете оставить встроенный NFS Client для бесплатной эталонной реализации NFS 4.1 для Windows от UMICH CITI, хотя его сложно установить, но он должен либо устранить проблему (поскольку NFS4 явно требует UTF-8), либо сделать это возможным использовать обходной путь fuse-convmv, упомянутый выше.

  • Переключение ОС: в Windows Server 2012 добавлена поддержка сервера NFS 4.1, поэтому есть вероятность, что в них также включен клиент NFS 4.1.

Оба коммутатора не будут работать, если ваш сервер поддерживает только NFSv3, например, если вы используете OpenWRT (даже последняя версия сервера OpenWRT по-прежнему не может выполнять NFSv4).

0

Я просто хотел отметить, что я попробовал UFS-клиент UMICH CITI, но столкнулся с проблемами безопасной загрузки.

При попытке запустить:

bcdedit /set testsigning on

в соответствии с инструкциями, я получил следующую ошибку:

An error has occurred setting the element data.
The value is protected by Secure Boot policy and cannot be modified or deleted.

Поэтому, если вы не хотите связываться с настройками безопасной загрузки, я не рекомендую пытаться использовать клиент CITI.

Оптимальным решением для этого было бы, чтобы CITI подписал драйвер, чтобы его можно было использовать без тестового режима. Но учитывая, что он довольно старый, я не думаю, что это произойдет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .