Типичный набор опций монтирования vfat для UTF-8 локали (пропускаем опции значение по-умолчанию которых нас устаривает):
uid=user_name,gid=group_name,fmask=0113,dmask=0002,codepage=866,utf8,shortname=winnt,quiet
Для не-UTF8 локали, а это скорей всего KOI8-R локаль (не забывая теперь обязательное для RHEL/CentOS 'utf8=no'):
uid=user_name,gid=group_name,fmask=0113,dmask=0002,codepage=866,iocharset=koi8-r,utf8=no,shortname=winnt,quiet
или учитывая что 'uni_xlate' отключает 'utf8', тем боле что уж лучше видеть закодированные имена файлов/директорий с которыми можно как-то обращаться чем неразличимые строчки из '?':
uid=user_name,gid=group_name,fmask=0113,dmask=0002,codepage=866,iocharset=koi8-r,uni_xlate,shortname=winnt,quiet
user_name и group_name - имена пользователя и группы которым предоставляется доступ на чтение/запись в монтируемый раздел FAT/FAT32 в соответствии с установленными fmask и dmask
Общие опции монтирования варьируются в зависимости от того, монтируем через командную строку или через запись в /etc/fstab, или в зависимости от необходимости автомонтирования при загрузке, режима rw/ro, или предоставления возможности монтирования/размонтирования раздела пользователями. Обычно используются: rw,async
В целях безопасности для FAT/FAT32 разделов можно явно указать: nodev,nosuid,noexec
Для ускорения можно использовать: noatime,nodiratime
Опции монтирования перечислены в man mount(8) в разделах 'Mount options for fat' и 'Mount options for vfat'.
Mount options for fat
=====================
blocksize=512 / blocksize=1024 / blocksize=2048
Set blocksize (default 512).
Размер блока ввода/вывода.
uid=value and gid=value
Set the owner and group of all files. (Default: the uid and gid of the current process.)
Поскольку в FAT/FAT32 нет поддержки прав владения и доступа к файлам и директориям, то весь
раздел по-умолчанию монтируется с идентификаторами uid и gid владельца процесса
осуществляющего монтирование. Можно указать нужного пользователя и группу от имени которого
будет монтироваться раздел FAT/FAT32. Это могут быть как числовые значения идентификаторов
так и имена пользователя/группы, по крайней мере из командной строки проходит простое
задание имени пользователя/группы.
umask=value
Set the umask (the bitmask of the permissions that are not present). The default is the umask
of the current process. The value is given in octal.
dmask=value
Set the umask applied to directories only. The default is the umask of the current process.
The value is given in octal.
fmask=value
Set the umask applied to regular files only. The default is the umask of the current process.
The value is given in octal.
umask, dmask, fmask - маски прав доступа для файлов/директорий (umask) либо отдельно для
директорий (dmask) и отдельно для файлов (fmask). Фактически через них устанавливаются права
владельца (u), группы (g) и прочих пользователей (o) для всех файлов и дерикторий на монтируемом
разделе vfat. Задаётся в виде восьмиричного числа. (Кстати запись восьмеричного значения
не обязательно должна начинаеться с нуля.)
check=value
Three different levels of pickyness can be chosen:
r[elaxed]
Upper and lower case are accepted and equivalent, long name parts are truncated
(e.g. verylongname.foobar becomes verylong.foo), leading and embedded spaces are
accepted in each name part (name and extension).
n[ormal]
Like "relaxed", but many special characters (*, ?, <, spaces, etc.) are rejected.
This is the default.
s[trict]
Like "normal", but names may not contain long parts and special characters that
are sometimes used on Linux, but are not accepted by MS-DOS are rejected.
(+, =, spaces, etc.)
Управляет проверкой создаваемых имён файлов/директорий на разделе vfat, чтоб они соответсвовали
принятым в FAT/FAT32 правилам и ограничениям. По-умолчанию 'n[ormal]'.
codepage=value
Sets the codepage for converting to shortname characters on FAT and VFAT filesystems.
By default, codepage 437 is used.
Параметр монтирования который лучше указать. Задаёт досовскую кодовую страницу в которой
сохраняются создаваемые короткие (в формате 8.3) досовские имена файлов и директорий.
Тем кто ещё работал в досе и настраивал её эту цифру не забыть - для нормального
чтения/сохранения русских имён - codepage=866
conv=b[inary] / conv=t[ext] / conv=a[uto]
The fat file system can perform CRLF<-->NL (MS-DOS text format to UNIX text format) conversion
in the kernel. The following conversion modes are available:
binary - No translation is performed. This is the default.
text - CRLF<-->NL translation is performed on all files.
auto - CRLF<-->NL translation is performed on all files that don’t have a "well-known
binary" extension. The list of known extensions can be found at the beginning
of fs/fat/misc.c (as of 2.0, the list is:
exe, com, bin, app, sys, drv, ovl, ovr, obj, lib, dll, pif, arc, zip, lha, lzh,
zoo, tar, z, arj, tz, taz, tzp, tpz, gz, tgz, deb, gif, bmp, tif, gl, jpg, pcx,
tfm, vf, gf, pk, pxl, dvi).
Programs that do computed lseeks won’t like in-kernel text conversion.
Several people have had their data ruined by this translation. Beware!
For file systems mounted in binary mode, a conversion tool (fromdos/todos) is available.
Попытки облегчить перенос текстовых файлов из UNIX-like системы в MS-DOS путём автоматичексой
замены CRLF<-->NL на лету. Лучше пользоваться если нужно для конкретных файлов командными
утилитами конвертации dos2unix и unix2dos из одноимённых пакетов, или же универсальной iconv
идущей в составе пакета glibc-common.
cvf_format=module
Forces the driver to use the CVF (Compressed Volume File) module cvf_module instead of
auto-detection. If the kernel supports kmod, the cvf_format=xxx option also controls
on-demand CVF module loading.
cvf_option=option
Option passed to the CVF module.
cvf_format, cvf_option - параметры указывающие на конкретный модуль CVF и его опций
для загрузки ядром. Что это такое не хочется разбираться.
debug
Turn on the debug flag. A version string and a list of file system parameters will be printed
(these data are also printed if the parameters appear to be inconsistent).
Судя по описанию включает вывод строки с версией и параметрами файловой системы при
монтировании раздела FAT/FAT32.
fat=12 / fat=16 / fat=32
Specify a 12, 16 or 32 bit fat. This overrides the automatic FAT type detection routine.
Use with caution!
Вместо автоопределения типа FAT можно указать конкретную её версию.
iocharset=value
Character set to use for converting between 8 bit characters and 16 bit Unicode characters.
The default is iso8859-1.
Long filenames are stored on disk in Unicode format.
Вот этот параметр следует указать, если используется не-UTF8 пользовательская/системная локаль.
Как написано длинные имена файлов и директорий сохраняются в разделе VFAT в формате Юникод.
Для того чтобы при передаче в настроенные на не-UTF8 локаль пользовательске приложения,
символы из Юникод конвертировались в подходящий для этой локали восьмибитный код, необходимо
задать нужную табицу преобразования iocharset.
По-умолчанию, если не указывать, iocharset=ascii, т.е. подразумевается что длинные имена
файлов/каталогов состоят из символов из набора ASCII, для которых производится тривиальное
(один-в-один) преобразование кодов Unicode<-->ASCII.
Для KOI8-R локали следует указать таблицу преобразования символов в коды KOI8-R из символов
Юникод - iocharset=koi8-r (посмотреть можно в /usr/share/i18n/charmaps/KOI8-R.gz).
Задание iocharset имеет смысл только если в системе (или для конкретного пользователя,
для которого монтируется раздел) используется не-UTF8 локаль.
Для UTF-8 локали опцию iosharset пропускаем и монтировать раздел необходимо со специально
предназанченной для этого случая самостоятельной опцией 'utf8' (см. описание далее).
quiet
Turn on the quiet flag. Attempts to chown or chmod files do not return errors, although they fail.
Use with caution!
Подавляет сообщения об ошибке при попытке выполнить 'chown' или 'chmod' для файлов на разделе
FAT/FAT32. Вообще, хоть и предупреждают пользоваться этой опцией с осторожностью, но она делает
повседневную работу с разделами vfat более удобной, прозрачно пропуская запросы приложений
на выполнение неподдерживаемых FAT/FAT32 функций, которые время от времени постоянно возникают.
Например, при создании резервной копии редактируемого файла в gedit или при использованиий rsync
с обычной опцией '-a'. Просто нужно помнить что раздел с которым работаешь - FAT/FAT32 и
учитывать, что помещённые на него файлы всегда приобретают владельца и режим доступа указанный
при монтировании. В отсутствие этой опции помнить об этом также приходится, потому что постоянно
получаешь ошибки выполнения операции бэкапа (нужно например специально прописывать опции rsync)
или предупреждения при перемещении файлов из-за невозможности сменить их владельца и время.
Осмотрительность надо проявлять при обратных операциях - получения файлов с разделов vfat
с установкой владельца.
sys_immutable, showexec, dots, nodots, dotsOK=[yes|no]
Various misguided attempts to force Unix or DOS conventions onto a FAT file system.
Различные с переменным успехом попытки привести в соответсвие Unix- и DOS- соглашения для
файловой системы FAT. Пример и описание использования параметра 'showexec' можно посмотреть в этой одной из редких не содержащих ошибочных сведений статье: http://citkit.ru/articles/147/
Mount options for vfat
======================
uni_xlate
Translate unhandled Unicode characters to special escaped sequences. This lets you backup
and restore filenames that are created with any Unicode characters. Without this option,
a ’?’ is used when no translation is possible. The escape character is ’:’ because it is
otherwise illegal on the vfat filesystem. The escape sequence that gets used, where u is
the unicode character, is: ’:’, (u & 0x3f), ((u>>6) & 0x3f), (u>>12).
Это тоже полезная опция при работе в не-UTF8 локали. В длинных именах файлов/директорий
могут встречаться любые символы Юникод, в том числе и не попадающие в тот набор из 256
символов, который указан в таблице конвертации в параметре iocharset=. Такие символы
отображаются как ’?’, или если указана данная опция они представляются специальными
escape-последовательностями. Символ экранирования - двоеточие ’:’, потому что он запрещён
в досовских именах и точно никогда в них не встречается. Потенциально при этой включённой
опции можно управляться с файлами имена которых содержат любые из символов Юникод.
Имена выглядят забавно: например файл с именем 'тест' будет показываться
как ':0442:0435:0441:0442'. Фаил с таким именем можно создать, скопировать,
записать, переименовать например в ':0442:0435:0441:0441', и это будет досовское имя 'тесс'.
Но вот например синхронизация директорий с такими escape-последовательностями в имени
с помощью rsync не будет работать, очевидно потому что rsync ничего не знает о подобных
преобразованиях имён.
posix
Allow two files with names that only differ in case.
Разрешает создание двух файлов с именами различающимися только регистром.
nonumtail
First try to make a short name without sequence number, before trying name~num.ext.
При создании короткого досовского имени пытается сначала создать его без обычных тильды
с номером в конце имени.
utf8
UTF8 is the filesystem safe 8-bit encoding of Unicode that is used by the console.
It can be be enabled for the filesystem with this option.
If ‘uni_xlate’ gets set, UTF8 gets disabled.
Включает UTF-8 кодирование символов Юникод при передачи их в пользовательские приложения
работающие в UTF-8 локали. Очевидно что это то, что нужно в обычных условиях.
Если установлена опция 'uni_xlate', то опция 'utf8' отключается.
Теоретически в UTF-8 локали можно не использовать опцию 'utf8', а задать iocharset=utf8.
В исходниках fs/fat/inode.c встречаем такое предупреждение:
1105 /* UTF-8 doesn't provide FAT semantics */
1106 if (!strcmp(opts->iocharset, "utf8")) {
1107 printk(KERN_ERR "FAT: utf8 is not a recommended IO charset"
1108 " for FAT filesystems, filesystem will be case sensitive!\n");
1109 }
После монтирования раздела проверить опции с которыми он смонтировался можно по 'cat /proc/mounts'.
shortname=[lower|win95|winnt|mixed]
Defines the behaviour for creation and display of filenames which fit into 8.3 characters.
If a long name for a file exists, it will always be preferred display. There are four modes:
lower - Force the short name to lower case upon display;
store a long name when the short name is not all upper case.
win95 - Force the short name to upper case upon display;
store a long name when the short name is not all upper case.
winnt - Display the shortname as is;
store a long name when the short name is not all lower case or all upper case.
mixed - Display the short name as is;
store a long name when the short name is not all upper case.
The default is "lower".
Определяет то, как создаются и отображаются имена файлов и директорий которые сами по себе
имеют формат 8.3. Если для файла существует длинное имя, то будет выводиться оно,
т.к. всегда имеет приоритет. Имеется четыре режима, как описано. По-умолчанию - "lower".
Думается что более естественно использовать "winnt".
---
В RedHat/CentOS замечена одна особенность: vfat раздел всегда монтируется с включённой опцией 'utf8', даже если она не указана в командной строке. Это происходит также в не-UTF8 локали, что приводит к тому что имена файлов состоящие из не-ascii символов отображаются неверно (как обычно это выглядит когда юникод строку пытаются вывести с помощью какой-либо кодовой таблицы из 256 восьмибитовых символов). Это является результатом патча бага Анаконды https://bugzilla.redhat.com/show_bug.cgi?id=181963, когда вместо исправления ошибки в настройках инсталляторя просто пропатчили ядро на предмет чтобы по умолчанию vfat разделы монтировались с включённой опцией 'utf8', т.к. типа всё равно все уже давно работают только в UTF-8 локали. Но при этом забыли упомянуть в man-странице как отключать эту опцию https://bugzilla.redhat.com/show_bug.cgi?id=515149
В том же fs/fat/inode.c можно посмотреть недокументированные параметры, которые можно задать для управления опциями, в том числе для отключения 'utf8':
905 static match_table_t vfat_tokens = {
906 {Opt_charset, "iocharset=%s"},
907 {Opt_shortname_lower, "shortname=lower"},
908 {Opt_shortname_win95, "shortname=win95"},
909 {Opt_shortname_winnt, "shortname=winnt"},
910 {Opt_shortname_mixed, "shortname=mixed"},
911 {Opt_utf8_no, "utf8=0"}, /* 0 or no or false */
912 {Opt_utf8_no, "utf8=no"},
913 {Opt_utf8_no, "utf8=false"},
914 {Opt_utf8_yes, "utf8=1"}, /* empty or 1 or yes or true */
915 {Opt_utf8_yes, "utf8=yes"},
916 {Opt_utf8_yes, "utf8=true"},
917 {Opt_utf8_yes, "utf8"},
918 {Opt_uni_xl_no, "uni_xlate=0"}, /* 0 or no or false */
919 {Opt_uni_xl_no, "uni_xlate=no"},
920 {Opt_uni_xl_no, "uni_xlate=false"},
921 {Opt_uni_xl_yes, "uni_xlate=1"}, /* empty or 1 or yes or true */
922 {Opt_uni_xl_yes, "uni_xlate=yes"},
923 {Opt_uni_xl_yes, "uni_xlate=true"},
924 {Opt_uni_xl_yes, "uni_xlate"},
925 {Opt_nonumtail_no, "nonumtail=0"}, /* 0 or no or false */
926 {Opt_nonumtail_no, "nonumtail=no"},
927 {Opt_nonumtail_no, "nonumtail=false"},
928 {Opt_nonumtail_yes, "nonumtail=1"}, /* empty or 1 or yes or true */
929 {Opt_nonumtail_yes, "nonumtail=yes"},
930 {Opt_nonumtail_yes, "nonumtail=true"},
931 {Opt_nonumtail_yes, "nonumtail"},
932 {Opt_err, NULL}
933 };
No comments:
Post a Comment