Сам разобрался, решил с остальными поделиться.
Когда мы монтируем флешку в консоли, мы вводим mount -t vfat /dev/sdb1 /mnt/flash
. При этом, русские имена файлов «кракозябрами», если не добавить параметр -o iocharset=utf8,codepage=866
. Почему iocharset это именно utf8, ведь во времена FAT этой кодировки не было? Потому что этот параметр указывает ту кодировку, в которую будет «переведена» исходная, и надо указать системную кодировку. Начиная с Red Hat 8.0 (а это примерно 2000 год) это UTF-8, соответственно и надо указывать utf8 (обратите внимание, без тире). Но если ваша система использует кодировку koi8r, то надо указывать её. Codepage 866 это русский регион (а например для США это 437).
Кодировка ASCII разделена на две половины. Первые 128 символов это английский алфавит, а также цифры, знаки препинания, символы псевдографики и так далее. Вторые 128 символов это буквы национального алфавита. В разных странах - разные кодировки.
Если у вас Gentoo, или любая другая конфигурация с самосборным ядром, то кодировку для FAT можно задать прямо в ядре. И тогда при монтировании флешки не придётся указывать те дополнительные параметры. В любом случае, во время автоматического монтирования при помощи системной слубжы HAL или udisks, всё само определяется и монтируется правильно.
Теперь давайте разберёмся, что такое vfat. Почему мы указываем именно её, а не fat16 или fat32? Что вообще за файловая система такая? vfat это расширение для FAT16 и FAT32, позволяющее в один и тот же момент хранить имя файла как короткое, так и длинное. Появилось в Windows 95. Подробнее тут: https://ru.wikipedia.org/wiki/FAT#VFAT Если очень хочется примонтировать без vfat, а только с поддержкой коротких имён, то -t msdos
. Естественно только FAT12 и FAT16.
Теперь exFAT. Эта файловая система появилась в 2006 году в Windows Mobile, Windows XP SP3 и Windows Vista. Дело в том, что релиз FAT32 не решил проблему с потерей полезного места на больщих дисках, а только отодвинул наступление этой проблемы. В exFAT эта проблема радикально решена, и флешки могут быть до 2 Тб размером.
В Linux есть 2 драйвера: exfat-fuse, exfat-nofuse. Первый создан сообществом по спецификации. Второй создан Samsung-ом для устройств на базе Android, скачать исходный код можно на сайте http://opensource.samsung.com/, введя название любой прошивки для любого смартфона и планшета. Там будет полный образ ядра Linux со всеми изменениями - в том числе и директория fs/exfat до ядра 4.4, и fs/sdfat начиная с ядра 4.4. Однако на Github всё уже есть: другие люди всё уже скачали и выложили отдельно (слава GPL). https://github.com/dorimanx/exfat-nofuse Кроме того, там наложено куча патчей со всякими улучшениями!
Кодировку указывать не надо: в exFAT это UTF-16, как и в NTFS. Но теперь надо указывать кое-что другое: ID вашего пользователя и группы. Для Debian это -o uid=1000,gid=1000
, для openSUSE gid равен 100. Хорошо что в форке на гитхабе нас избавили от необходимости так делать! А в оригинальном коде, если вы этого не сделаете, то вы не сможете записать файл на флешку. А если запишете от root, то не сможете прочитать этот файл на компьютере с Windows.
Но откуда такие проблемы? Дело в том, что в exFAT появился ACL... Это расширенные права. Если вы помните Norton Commander или Windows 95, вы помните что в «Свойствах файла» есть 4 галочки: «Только чтение», «Архивный», «Системный» и «Скрытый». Всего лишь 4, и всё так просто. Расширенные права добавляют ещё хренову кучу свойств файла...