JF Linux Kernel 2.4 Documentation: /usr/src/linux/Documentation/filesystems/vfat.txt

filesystems/vfat.txt

Windows NT および Windows 95 で使われる VFAT ファイルシステムを使う上での情報 [プレインテキスト版]


VFAT の使い方
----------------------------------------------------------------------
vfat ファイルシステムを利用するには、ファイルシステム種別 'vfat' を用
いてください。つまり、
  mount -t vfat /dev/fd0 /mnt

特別なパーティションのフォーマッタは必要ではありません。Linux でフォー
マットしたければ、mkdosfs を使用してください。


VFAT のマウントオプション
----------------------------------------------------------------------
codepage=###  -- FAT および VFAT 上で「短い名前」に変換する時の文字の
                 コードページを設定します。既定値はコードページ 437 が
                 使われます。これは、米国およびヨーロッパの一部諸国の
                 ための既定値です。
                 [訳注:短い名前とは、例えば "Program Files" に対する
                 PROGRA~1 といったものです。]
iocharset=name -- 8 ビット文字と 16 ビット Unicode 文字との変換に用い
                 る文字集合です。長いファイル名は Unicode フォーマット
                 でディスクに格納されますが、ほとんどの Unix は
                 Unicode を扱う方法を知りません。さらに UTF8 変換を行
                 う utf8 オプションがあります。
utf8=<論理値> -- UTF8 はファイルシステムで使っても安全な Unicode のエ
                 ンコード形式で、コンソールで用いられます。
                 [訳注: UTF8 は Unicode Transformation Format (UTF) の
                 ひとつで、UCS-2 を 8 ビット形式で表現したものです。情
                 報交換の用途に適しています。]
                 このオプションを用いることにより、ファイルシステムで
                 有効にできます。'uni_xlate' がセットされている場合、
                 UTF8 は無効になります。
uni_xlate=<論理値> -- 扱えない Unicode 文字を特別なエスケープシーケン
                 スに変換します。これは、どんな Unicode 文字で作成され
                 たファイル名でもバックアップおよびリストアを可能とし
                 ます。Linux が Unicode を現実にサポートするまでの代案
                 です。このオプションを用いず、変換ができない場合は、'?'
                 が使用されます。vfat ファイルシステム上で ':' 以外は
                 不正となるので、これがエスケープ文字に使用されていま
                 す。エスケープシーケンスは ':' と 16 進数 4 桁の
                 Unicode です。
posix=<論理値>  -- 'LongFileName' と 'longfilename' のような、綴りは同
                 じだが大文字小文字の違いのある名前の共存を許します。
                 POSIX ファイルシステムとの互換性については、8.3 形式
                 の矛盾を正確に扱えないので、現状、不具合があります。
nonumtail=<論理値> -- 8.3 形式の別名が作られる場合、ファイル名の末尾は,
                 通常 '~1' (か ~ の後に 2, 3, …がついたもの) となりま
                 す。このオプションがセットされていて、ファイル名が
                 "longfilename.txt" で "longfile.txt" がその時に存在し
                 ない場合、「短い名前」は 'longfi~1.txt' の代わりに
                 'longfile.txt' となります。
quiet         -- 特定の warning メッセージの出力を止めます。
check=s|r|n   -- 大文字小文字の区別をチェックする設定。
                 s: 厳密、大文字小文字を区別します。
                 r: 緩和、大文字小文字を区別しません。
                 n: 通常、既定値、現状大文字小文字を区別しません。
nocase        -- ディスク内には変更を加えず、8.3 形式の別名を返します。
                 既定では、小文字を返します。

<論理値>:0, 1, yes, no, true, false


すべき事
----------------------------------------------------------------------
* raw scanning している部分を除いて、代わりに、次のディレクトリエント
  リを常に用いるアプローチにする必要があります。あと raw scanning を使っ
  ているものはディレクトリの名前を変更するコードだけです。

* 8.3 の空間で POSIX ファイルシステムのサポートが動作するよう修正しま
  す。これはに新しいファイル名と古い別名の間に矛盾が起きる場合に別名の
  名前を変更する処理を含みます。これは非常に厄介です。


考えられる不具合
----------------------------------------------------------------------
* vfat_valid_longname は予約された名前を適切にチェックしません。
* ボリューム名がファイルシステムのルートディレクトリ内のディレクトリ名
  と同じ場合、時々ディレクトリ名は空のファイルとして表示されます。
* autoconv オプションは正しく動作しません。


バグの報告
----------------------------------------------------------------------
VFAT ファイルシステムで問題があれば、バグの報告を
chaffee@bmrc.cs.berkeley.edu へ送ってください。問題になったファイル名
および操作もお教えください。


テストスイート
----------------------------------------------------------------------
vfat ファイルシステムへの任意の修正を計画するなら、次の vfat ディスト
リビューションからテストスイートを入手してください。

  http://bmrc.berkeley.edu/people/chaffee/vfat.html

これは vfat ファイルシステムのかなりの部分をテストします。また、新しい
機能やテストされていない機能の追加のテストは歓迎します。


VFAT ファイルシステムの構造上の注意点
----------------------------------------------------------------------
(この資料は Galen C. Hunt <gchunt@cs.rochester.edu> より提供され、
Gordon Chaffee に少しだけ注釈されました)。

この資料は Windows NT 3.5 および Windows 95 で使用される拡張 FAT ファ
イルシステムについての私の知っている技術的概要をとても簡単に示します。
下記のいかなるものも正確であると保証しませんが、このように思えます。

拡張 FAT ファイルシステムは、DOS バージョン 6.223410239847 :-) までで
使用される FAT ファイルシステムとほとんど同一です。重要な変更は長いファ
イル名の追加です。これらの名前は、従来の 8.3 形式の短い名前に対し、255
文字までの長さと小文字をサポートします。

現状の Windows 95 ファイルシステムにおける従来の FAT エントリを記述し
ます。

        struct directory { // Short 8.3 names 
                unsigned char name[8];          // file name 
                unsigned char ext[3];           // file extension 
                unsigned char attr;             // attribute byte 
                unsigned char lcase;            // Case for base and extension
                unsigned char ctime_ms;	        // Creation time, milliseconds
                unsigned char ctime[2];	        // Creation time
                unsigned char cdate[2];	        // Creation date
                unsigned char adate[2];	        // Last access date
                unsigned char reserved[2];      // reserved values (ignored) 
                unsigned char time[2];          // time stamp 
                unsigned char date[2];          // date stamp 
                unsigned char start[2];         // starting cluster number 
                unsigned char size[4];          // size of the file 
        };

lcase フィールドは、8.3 形式の名前のベースおよび/もしくは拡張子が大文
字化されるべきか明示します。このフィールドは、Windows 95 で使用されて
いるようには見えませんが、Windows NT は使用します。ファイル名の大文字
小文字は Windows NT から Windows 95 への完全な互換性はありません。また、
逆方向の互換性も完全ではありません。8.3 形式の namespace に合わせ、
Windows NT 上で小文字により書かれたファイル名は、Windows 95 上では大文
字で見えます。

"start" および "size" の値は実際にはリトルエンディアンの整数値であるこ
とに注意してください。この構造体のフィールドの記述は公開情報で、他のと
ころでも見つけられます。

拡張 FAT システムで、Microsoft は、拡張された名前を持つファイルに特別
なディレクトリエントリを挿入しました (古い 8.3 形式のスキームに適合す
るどんな名前も特別なエントリは持っていません)。私はこれらの特別なエン
トリをスロットと呼びます。基本的に、スロットはファイルの拡張された名前
の 13 文字までを保持する特別にフォーマットされたディレクトリです。スロッ
トは関連するファイルについたファイルのディレクトリエントリに関する付加
的なラベルと考えてください。Microsoft はファイルの別名として 8.3 エン
トリを、ファイル名として拡張されたスロットのディレクトリエントリを参照
することを選んでいます。

スロットのディレクトリエントリに関する C 構造体を示します。

        struct slot { // Up to 13 characters of a long name 
                unsigned char id;               // sequence number for slot 
                unsigned char name0_4[10];      // first 5 characters in name 
                unsigned char attr;             // attribute byte
                unsigned char reserved;         // always 0 
                unsigned char alias_checksum;   // checksum for 8.3 alias 
                unsigned char name5_10[12];     // 6 more characters in name
                unsigned char start[2];         // starting cluster number
                unsigned char name11_12[4];     // last 2 characters in name
        };

スロットの配置が少し奇妙に見えるのは、古いソフトウェアとの互換性を維持
した Microsoft の努力の表われです。古いソフトウェアがパニックしないよ
うに、スロットを偽装しなければなりません。このための手段は:

        1) スロットのディレクトリエントリ用の属性バイトは、いつも 0x0f
           に設定されます。これは "hidden", "system", "read-only",
           "volume label" の属性を持つ古いディレクトリエントリに相当し
           ます。ほとんどの古いソフトウェアは "volume label" ビットが
           設定されたディレクトリエントリを無視します。実際のボリュー
           ムラベルエントリの他の 3 ビットはセットされません。

        2) クラスタの頭は DOS ファイルでは有り得ない 0 にいつも設定さ
           れます。

拡張 FAT システムは前のバージョンへの互換性があるので、ディレクトリエ
ントリを修正することは古いソフトウェアでできます。手段はスロットの有効
性を保証しなければなりません。拡張 FAT システムは、8.3 ディレクトリエ
ントリに属していることを下記で実際に確認できます。

        1) ポジショニング。ファイル用のスロットはいつもすぐに、それら
           に対応する 8.3 ディレクトリエントリを処理します。さらに、各
           スロットは、拡張ファイル名の中にその順番をマークする id を
           持っています。ファイル "My Big File.Extension which is
           long" に関する 8.3 ディレクトリエントリおよびそれに対応する
           長い名前のスロットをとても簡略に示します。

                <proceeding files...>
                <slot #3, id = 0x43, characters = "h is long">
                <slot #2, id = 0x02, characters = "xtension whic">
                <slot #1, id = 0x01, characters = "My Big File.E">
                <directory entry, name = "MYBIGFIL.EXT">

           スロットは最後から最初の順で格納されることに注意してくださ
           い。スロットは 1 から N で番号付けされます。N 番目のスロッ
           トは最後のものとして 0x40 と論理和されます。

        2) チェックサム。各スロットは "alias_checksum" の値を持ちます。
           チェックサムは次のアルゴリズムを使用して、8.3 の名前から計
           算されます。

                for (sum = i = 0; i < 11; i++) {
                        sum = (((sum&1)<<7)|((sum&0xfe)>>1)) + name[i]
                }

        3) 最終のスロットに空き領域がある場合、Unicode の NULL(0x0000)
           が最後の文字の後ろに格納されます。その後に、最後のスロット
           の中の未使用の文字部分はすべて Unicode の 0xFFFF に設定され
           ます。

最後に、拡張された名前が Unicode で格納されることに注意してください。
各 Unicode 文字は 2 バイトです。
======================================================================
日本語訳:野本浩一 <hng@ps.ksky.ne.jp>
    校正:武井伸光さん <takei@webmasters.gr.jp>
          Seiji Kanekoさん <skaneko@a2.mbn.or.jp>
          後藤正徳さん <gotom@debian.or.jp>
          中野武雄さん <nakano@apm.seikei.ac.jp>

Linux カーネル 2.4 付属文書一覧へ戻る