LINUX.ORG.RU

Файловая система FAT и кодировка в именах файлов

 , ,


1

2

Сам разобрался, решил с остальными поделиться.

Когда мы монтируем флешку в консоли, мы вводим 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, и всё так просто. Расширенные права добавляют ещё хренову кучу свойств файла...

Ответ на: комментарий от ZenitharChampion

Спокойствие, только спокойствие…

Почитал man mount. Насколько я понял, без codepage=866 shortnames (типа PROGRA~1) на русском будут кракозябрами.

greenman ★★★★★ ()
Последнее исправление: greenman (всего исправлений: 2)

Детства моего чистые глазенки, эх. Первая половина двухтысячных, пытаюсь разобраться, что это за зверь такой линукс. (слака, вроде девятой или десятой версии). и вечные приколы с монтированием - то кракозябры, то вообще не отображаются не ascii-имена.А распаковать зип с кириллическим содерджимым и сейчас проблемс.

Avial ★★★★ ()

exFAT не exFAT

Пару-тройку лет назад у меня возникла необходимость шарить здоровый внешний хдд между виндой 7 и свежим линукс минтом, и я стал выбирать файловую систему. Фат32 отпал из-за больших файлов, а нтфс не хотелось. Решился на exfat как на недооцененный, как тогда показалось, вариант. В течение недели выяснилось, что хоть эта фс и родная для винды, она ее периодически как-то портила, что приходилось прогонять fsck (долго и муторно).

Происходило это вот как. На обычной работе с мелкими файлами этого не увидеть. Ребут туда, ребут обратно, все ок. Но иногда, при копировании файлов порядка нескольких гб или закачке торрентов в винде, ребут в линукс показывал, что фс повреждена. При этом винда считала, что все норм. Детали я не копал, но мне стало стремно за данные, которые хоть и были файлопомойкой, но так глупо терять их не хотелось. И я вернулся на нтфс, где проблема исчезла. Был ли это плохой драйвер, или проблема в контроллере usb, или в самой винде - хз. Так что возможно, что exFAT, кроме как для чтения карт памяти, юзать не стоит.

anonymous ()
Ответ на: exFAT не exFAT от anonymous

Re: exFAT не exFAT

Ты же сам пишешь, что в Windows всё было в порядке - значит её драйвер exfat корректно работал с данными на файловой системе.

А в linux была проблема - значит реализация драйвера exfat в Linux не поддерживала некоторые возможности файловой системы. Microsoft же сама не написала драйвер для Linux, возможно какие-то особенности не реализованы были в драйвере для Linux.

anonymous ()

Почему iocharset это именно utf8

зенитар такой зенитар

Когда мы монтируем флешку в консоли

но зачем? зачем? весь мир на пороге третьего десятилетия третьего тысячелетия, но некоторые до сих пор познают мир из пещеры.

novitchok ★★★★★ ()
Ответ на: комментарий от novitchok

но зачем? зачем?

То есть ради того, чтобы подключить флешку мне вытаскивать комп с антресоли, подключать монитор и ставить де? Ну вас в буй с вашим тысячелетием.

Deleted ()
Ответ на: комментарий от anonymous

Ну вот смотри, если я выбрад для файлохранилища Linux, то мне не надо форматировать HDD этого файлохранилища в NTFS. Можно форматнуть в ext4. Когда я буду обращаться к этому файлохранилищу из Windows по сети, то всё прекрасно прочитается

ZenitharChampion ★★★★★ ()
Последнее исправление: ZenitharChampion (всего исправлений: 1)
Ответ на: комментарий от ZenitharChampion

Когда я буду обращаться к этому файлохранилищу из Windows, то всё прекрасно прочитается

Как ты к хранилищу будешь обращаться? Подключишь диск по USB или по сети, через samba?

anonymous ()
Ответ на: комментарий от ZenitharChampion

Ну раз по сети, то писать про Windows и ext4 вообще смысла нет. Т.к. по сети Windows будет подключаться к хранилищу по сетевому протокоду SMB2, smb3 (Samba).

А на какой файловой системе физически лежат файлы, которые расшариваются по сети - дело 10. И в случае, если расшаривать будет Linux, то лучше использовать файловую систему родную для Linux.

NTFS - неродная, с ней будут проблемы.

anonymous ()
Ответ на: комментарий от Avial

А распаковать зип с кириллическим содерджимым и сейчас проблемс.

Давным-давно есть соответствующие патчи и неофициальные версии unzip'а (которые нужно собирать с ICONV=1).

Например: http://antinode.info/ftp/info-zip/unzip610c08a_l_sM.zip

В следующей версии Slackware соответствующие патчи будут сразу из коробки (уже в -current). Если в Вашем дистрибутиве такого ещё нет, то пишите его маинтейнерам.

saahriktu ★★★★★ ()
Ответ на: комментарий от ZenitharChampion

У меня был внешний хдд и дуалбут, это я непонятно написал просто.

Ну а кто там виноват, это еще посмотреть надо [было]. Винда вполне может не следовать собственной спецификации, ей в первой что ли. Я просто предупреждаю читателя, что видимая рабочесть решения не оказалась таковой, и было это весьма недавно.

anonymous ()
Ответ на: комментарий от anonymous

Хм. Ну тут сложно. Винда же только FAT и NTFS понимает. А в линуксе NTFS у меня работает хорошо. В 2009 были проблемы при chkdsk, когда долго что-то исправляло, если поработать с этой ФС из Линукса. Больше проблем не было

ZenitharChampion ★★★★★ ()
Ответ на: комментарий от Deleted

Разные зиповщики кому как взбредет пишут имена. Один пишет как есть, указывая латин-1, другой пишет правильно, третий укажет 850, а запишет в 1252 (да, именно так). unar из /dev/random эту инфу возьмет?

anonymous ()
Ответ на: комментарий от ZenitharChampion

У меня тоже нтфс работала хорошо, но медленнее. А тут еще хдд через усб. Вот я и искал варианты быстрее, иначе не стал бы и заморачиваться.

anonymous ()

codepage=866

Это требуется только для fat12/16. На fat32 имена берутся из lfn, а они там в utf16.

Codepage 866 это русский регион

Codepage — это кодовая страница кириллических алфавитов (русского, украинского, беларусского).

Кодировка ASCII разделена на две половины. Первые 128 символов это английский алфавит, а также цифры

Первые 128 символов ASCII составляют всю кодировку ASCII безо всяких половин, потому что кодировка ASCII 7мибитная.

Сам разобрался

Плохо разобрался, старайся лучше.

gremlin_the_red ★★ ()
Ответ на: комментарий от int13h

Кириллические имена файлов не нужны.

Только если ты являешься «автором» этих файлов. В противном случае, получаешь то, что получаешь, а не то, что хочется.

Deleted ()