Сам разобрался, решил с остальными поделиться.
Когда мы монтируем флешку в консоли, мы вводим 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).
Upd: Оказывается, достаточно указывать -o utf8
. Товарищ greenman в третьем комментарии написал, что, согласно man mount
, в этом случае «кракозябрами» будут видны только короткие имена файлов
Кодировка ASCII разделена на две половины. Первые 128 символов это английский алфавит, а также цифры, знаки препинания, символы псевдографики и так далее. Вторые 128 символов это буквы национального алфавита. В разных странах - разные кодировки.
Если у вас Gentoo, или любая другая конфигурация с самосборным ядром, то кодировку для FAT можно задать прямо в ядре. И тогда при монтировании флешки не придётся указывать те дополнительные параметры. В любом случае, во время автоматического монтирования при помощи системной слубжы HAL или udisks, всё само определяется и монтируется правильно.
Теперь давайте разберёмся, что такое vfat. Почему мы указываем именно её, а не fat16 или fat32? Что вообще за файловая система такая? vfat это расширение для FAT 12/16/32, позволяющее в один и тот же момент хранить имя файла как короткое, так и длинное. Появилось в Windows 95. Подробнее тут: https://ru.wikipedia.org/wiki/FAT#VFAT Если очень хочется примонтировать без vfat, а только с поддержкой коротких имён, то -t msdos
(например жёсткий диск или CF-карта с DOS-ом)
Теперь exFAT. Эта файловая система появилась в 2006 году в Windows Mobile, Windows XP SP3 и Windows Vista. Дело в том, что релиз FAT32 не решил проблему с потерей полезного места на больщих дисках, а только отодвинул наступление этой проблемы. В exFAT эта проблема радикально решена, и флешки могут быть до 2 Тб размером.
В Linux есть 2 драйвера: exfat-fuse, exfat-nofuse. Первый создан сообществом по спецификации, и работает через FUSE. Второй создан Samsung-ом для устройств на базе Android, скачать исходный код можно на сайте http://opensource.samsung.com/, введя название любой прошивки для любого смартфона и планшета. Там будет полный образ ядра Linux со всеми изменениями - в том числе и директория fs/exfat до ядра 4.4, и fs/sdfat начиная с ядра 4.4. Однако на Github всё уже есть: другие люди всё уже скачали и выложили отдельно (слава GPL). Кроме того, там наложено куча патчей со всякими улучшениями!
Кодировку указывать не надо: в exFAT это UTF-16, как и в NTFS. Но теперь надо указывать кое-что другое: ID вашего пользователя и группы. Для Debian это -o uid=1000,gid=1000
, для openSUSE gid равен 100. Хорошо что в форке на гитхабе нас избавили от необходимости так делать! А в оригинальном коде, если вы этого не сделаете, то вы не сможете записать файл на флешку. А если запишете от root, то не сможете прочитать этот файл на компьютере с Windows.
Но откуда такие проблемы? Дело в том, что в exFAT появился ACL... Это расширенные права. Если вы помните Norton Commander или Windows 95, вы помните что в «Свойствах файла» есть 4 галочки: «Только чтение», «Архивный», «Системный» и «Скрытый». Всего лишь 4, и всё так просто. Расширенные права добавляют ещё хренову кучу свойств файла...