DOS/Windows 領域の mount がめんどくさい

考えるのが面倒で避けてきた日本語ファイル名を含む (V?FAT|NTFS) 領域の mount についてやっと分かってきたので整理。

※ 例によって嘘八百書いている可能性があるのでツッコミ希望1

まとめ

mount の option の効きどころ

  • mount の option で与える charset/locale は、mount する領域のファイル名のものではなく、「これに変換して扱う」という意味
    • 環境変数の言語設定に暗黙に従うのだと思っていたけど、これがそもそも間違っているらしい
  • ntfs の場合、ファイル名の保持は必ず Unicode(utf-16le?) で行われるので、codepage を指定する必要がない2
    • 恐らく iocharset/locale の設定によらず、ファイル名そのものは見える
    • つまり設定ミスに気づきにくい
      • → ext3 や ufs の領域にコピーしたらファイル名が読めない!という事態に
    • Windows を使っていてファイル名が SJIS に見えるのは Windows の API を経由したときに変換されているのか?
  • msdosfs/vfat の場合は fat 領域の codepage を指定するオプションがある
    • この codepage が DOS/Windows のバージョン(≒言語)によって異なる
    • 従って codepage が正しくセットされていないと日本語ファイル名が読めないという状況になる
      • → 逆に言うと日本語ファイル名が読めなくなることで mount option が間違っていることに気づきやすい
    • vfat も long filename の部分は Unicode で、short filename の部分で codepage を使う、という構造になっているらしい

オプションの記述方法

例えば日本語EUCの場合

localeja_JP.eucJP
charseteuc-jp

codepage については共通のはず。

FreeBSDの場合

FAT-L ja_JP.eucJP -D CP932 など
NTFS-C eucJP など

ntfs の charset は eucJP などのように書くらしい。euc-jp じゃないのか? locale の方になんとなく合わせてある? つか FreeBSD で charset つったらそういうもんだっけ。

FreeBSD 6.1-R の時点で、標準で利用できる mount ではマルチバイト文字を含むファイル名で書き込みはできない。

Linuxの場合

FAT-o iocgarset=euc-jp,codepage=cp932 など
NTFS-o iocharset=euc-jp など

実際には使うドライバ?によって違う。Linux の場合は ntfs を mount するためのツールがいっぱいあるので、それによっても変わってくると思う。(ますます面倒くさい。)

  1. と書いておいてもめったにツッコまれないのはきっと読んでいる人がいないんだろな。 

  2. だから msdosfs/vfat に比べてオプションが減っている 

More

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Develop Document Jekyll