FAT

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page FAT and the translation is 53% complete.
Resources

ファイルアロケーションテーブル (FAT) - 当初は MS-DOS (および後の NT 以前の Microsoft Windows) で使用するために作られたファイルシステム。現在では USB フラッシュディスクで FAT の改訂版 (FAT32) が使われています。[1]FAT は既に Linux システムに歩み寄っており、Linux カーネルで公式にサポートされています。

FAT32 は現代的なファイルシステムに備わっている多くの機能を欠いていますが、このファイルシステムは現代的なコンピュータでもいまだに、例えば EFI システムパーティションを使用するときに見つけることができます。2006 年に Microsoft は FAT の新しいバージョン (exFAT) を開発しましたが、これには以前のバージョンと後方互換性がありません。さらなる情報については exFAT の記事を参照してください。

インストール

カーネル

カーネル FATサポートを有効にする (CONFIG_VFAT_FS)
File systems  --->
   DOS/FAT/NT Filesystems  --->
      < > MSDOS fs support
      <*> VFAT (Windows-95) fs support
      (437) Default codepage for FAT
      (iso8859-1) Default iocharset for FAT
      [ ]   Enable FAT UTF-8 option by default
   -*- Native language support  --->
      (iso8859-1) Default NLS Option
      <*>   Codepage 437 (United States, Canada)
      <*>   NLS ISO 8859-1  (Latin 1; Western European Languages)
      -*-   NLS UTF-8

設定スニペット

ファイル /etc/kernel/config.d/esp-linux6-1-111.config
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"

FAT パーティションマウントしようとする時には、ユーザーは codepage= オプションを mount に指定する必要があるかもしれません。上の例では United States と Canada 向けのコードページを使用していますが、それ以外のコードページも必要に応じて有効化できます。任意で、ユーザーがFAT用のデフォルトコードページをカーネル設定内で設定することもできます。使用する各コードページがカーネルで有効化されているか確認してください。

メモ
mountを通じて使用されたcodepageオプションはカーネルで使用されている設定を上書きします。

Default iocharset for fatUTF-8 に設定することは避けてください; それは推奨されません。代わりに、FAT パーティションをマウントする際に utf8=true オプションを渡すようにしましょう (これには CONFIG_NLS_UTF8 がカーネルで有効になっている必要があります)。より詳しい情報については mount(8) man ページを見るか、/usr/src/linux/Documentation/filesystems/vfat.rst にある適切なカーネルドキュメントを見てください。

Emerge

FATのユーザースペースユーティリティーを使うにはsys-fs/dosfstoolsパッケージが必要です:

root #emerge --ask sys-fs/dosfstools

使い方

フォーマット

FAT ファイルシステムを作成するには、mkfs.fat を使用してください:

user $mkfs.fat
mkfs.fat 4.2 (2021-01-31)
No device specified.
Usage: mkfs.fat [OPTIONS] TARGET [BLOCKS]
Create FAT filesystem in TARGET, which can be a block device or file. Use only
up to BLOCKS 1024 byte blocks if specified. With the -C option, file TARGET will be
created with a size of 1024 bytes times BLOCKS, which must be specified.
 
Options:
  -a              Disable alignment of data structures
  -A              Toggle Atari variant of the filesystem
  -b SECTOR       Select SECTOR as location of the FAT32 backup boot sector
  -c              Check device for bad blocks before creating the filesystem
  -C              Create file TARGET then create filesystem in it
  -D NUMBER       Write BIOS drive number NUMBER to boot sector
  -f COUNT        Create COUNT file allocation tables
  -F SIZE         Select FAT size SIZE (12, 16 or 32)
  -g GEOM         Select disk geometry: heads/sectors_per_track
  -h NUMBER       Write hidden sectors NUMBER to boot sector
  -i VOLID        Set volume ID to VOLID (a 32 bit hexadecimal number)
  -I              Ignore and disable safety checks
  -l FILENAME     Read bad blocks list from FILENAME
  -m FILENAME     Replace default error message in boot block with contents of FILENAME
  -M TYPE         Set media type in boot sector to TYPE
  --mbr[=y|n|a]   Fill (fake) MBR table with one partition which spans whole disk
  -n LABEL        Set volume name to LABEL (up to 11 characters long)
  --codepage=N    use DOS codepage N to encode label (default: 850)
  -r COUNT        Make room for at least COUNT entries in the root directory
  -R COUNT        Set minimal number of reserved sectors to COUNT
  -s COUNT        Set number of sectors per cluster to COUNT
  -S SIZE         Select a sector size of SIZE (a power of two, at least 512)
  -v              Verbose execution
  --variant=TYPE  Select variant TYPE of filesystem (standard or Atari)
  --invariant     Use constants for randomly generated or time based values
  --offset=SECTOR Write the filesystem at a specific sector into the device file.
  --help          Show this help message and exit

/dev/sdx9 パーティションを、ラベル "ESP" を付けて FAT32 ファイルシステムでフォーマットし、詳細な出力を表示するには:

root #mkfs.fat -v -F 32 -n "ESP" /dev/sdx9

FAT ファイルシステムは mount コマンドでマウントできるはずです。リサイズは sys-fs/fatresize を使用して行えます。

大文字と小文字の区別

オリジナルの FAT ファイルシステムでは、短いファイル名 (8.3 形式または SFN) のみが利用可能で、すべて大文字で保存されます。オリジナルの FAT ファイルシステムを使用するシステム (MS-DOS など) は、大文字と小文字を区別しませんでした。FAT に対する拡張である VFAT では、長いファイル名 (LFN) を利用できるようになっただけでなく、ファイル名に小文字も利用できるようになりました。VFAT は大文字と小文字の区別を保持しますが、互換性のために、既存のオペレーティングシステム (Microsoft Windows 95 および Windows NT など) は依然として大文字と小文字を区別せずに扱っていました。一方で、Unix は伝統的に大文字と小文字を厳密に区別していました。

Linux では、vfat はデフォルトでは大文字と小文字を区別せずに名前を扱います (緩和された (relaxed) マウントオプション check=r)。しかし、VFAT は厳密な (strict) 大文字と小文字の区別を行うマウントオプション check=s を付けてマウントすることもできますが、これは問題を発生させることがあります。

Manual mount options

警告
Using anything other than the default options will cause problems! You have been warned! See section Problem cases for details.

For short names of directories and files (8.3, i.e. "short filenames" or SFN) the behavior of how the name is stored in the filesystem and how it is displayed can be changed using mount option shortname, which defaults to mixed since Linux kernel 2.6.32 (December 2009).[2]

file system mount option display short name short name example store long name long name example
FAT12
FAT16
FAT32
VFAT
FILENAME.EXT
shortname=lower always forced to lower case filename.ext when the short name is not all upper case
shortname=win95 upper case FILENAME.EXT when the short name is not all upper case
shortname=winnt as is (original) FILENAME.EXT when the short name is not all lower case or all upper case
shortname=mixed as is (original) FILENAME.EXT when the short name is not all upper case
VFAT FILENA~1.EXT FileName.Ext
shortname=lower always forced to lower case when the short name is not all upper case FileName.Ext
shortname=win95 upper case when the short name is not all upper case FileName.Ext
shortname=winnt as is (original) when the short name is not all lower case or all upper case FileName.Ext
shortname=mixed as is (original) when the short name is not all upper case FileName.Ext
VFAT LONGNA~1.EXT long name.ext
shortname=lower always forced to lower case when the short name is not all upper case long name.ext
shortname=win95 upper case when the short name is not all upper case long name.ext
shortname=winnt as is (original) when the short name is not all lower case or all upper case long name.ext
shortname=mixed as is (original) when the short name is not all upper case long name.ext

A special case is an all lower case short filename, e.g. filename.ext. If it is created with shortname=winnt, no LFN VFAT entry will be created.

file system mount option store long name long name example display short name short name example
VFAT filename.ext FILENAME.EXT
shortname=winnt when the short name is not all lower case or all upper case as is (short name) FILENAME.EXT
shortname=lower always forced to lower case filename.ext
shortname=win95 upper case FILENAME.EXT
shortname=mixed as is FILENAME.EXT

If the file is created with shortname=lower|win95|mixed however, there will be a VFAT entry (LFN) and a short filename as well, e.g. FILENA~2.EXT. Whenever there is an LFN, VFAT will display the LFN, not the SFN. This is particularly tricky since the LFN entry might look like an 8.3 SFN, as in the example filename.ext.

file system mount option long name example display short name short name example
VFAT filename.ext FILENA~2.EXT
shortname=lower filename.ext lower case
shortname=win95 filename.ext upper case
shortname=winnt filename.ext as is
shortname=mixed filename.ext as is ~

Problem cases

With the default settings existing file systems will just work.[3] Firstly, VFAT currently defaults to relaxed case-checking (mount option check=r). This means that names for directories and files below the mount point will always work as long as they otherwise match in any possible combination of upper and lower case spelling, e.g. filename.ext will be found even when e.g. FILENAME.EXT or FileName.Ext is actually present, because the difference is only in case.

And secondly, short names (8.3, SFN) that are not all upper case will get an additional long filename entry to store the case correctly i.e. making VFAT case-preserving (mount option shortname=mixed).

重要
On platforms with UEFI this is especially important for compatibility with existing directories and files on the EFI System Partition (ESP), which is vital for the boot configuration. Systems using FAT and VFAT traditionally haven't been case-sensitive, hence it is to be expected that existing directories and filenames differ slightly in their use of upper and lower case letters. With the default settings for vfat, Linux is adapting to this convention and treats the whole mount point case-insensitive as well, i.e. /efi/EFI/boot/bootx64.efi (assuming the ESP is mounted under /efi) and other EFI bootloader paths will always work as expected.

If only Linux is installed and all file references remain exactly the same, everything should also work with strict case-checking (mount option check=s). However, since the VFAT file system stores two filenames in some but not all cases, one short (8.3, SFN) and one long name (LFN), conventions regarding the management of those names can cause additional problems. The obvious example is the use of shortname=winnt, which will convert a short filename in all lower case to a standard FAT filename in all upper case, and skip creating an LFN counterpart. For example, the filename bootx64.efi would be stored as traditional 8.3 short filename (SFN) BOOTX64.EFI only. Additionally, shortname=winnt will display short filenames as is, so the originally written bootx64.efi doesn't exist, and together with strict case-checking this will cause big problems under Linux.

トラブルシューティング

ファイルの転送速度が遅い

ファイルの転送速度 (iotop を使って確認できます) が遅い場合は、ファイルシステムが async ファイルシステムオプションを使ってマウントされているか確認してください。/etc/fstab (または、autofs を使用している場合は /etc/autofs/auto.misc) システムファイルを編集し、必要に応じて、おそらくそこにあると思われる sync マウントオプションを削除してください。デフォルトでは、ファイルシステムは async マウントオプションを使ってマウントされます。

メモ
ファイルシステムの sync マウントオプションは、デフォルトの async マウントオプションよりも遅い転送速度に制限します。 sync マウントオプションはフラッシュメディアの寿命を縮めることもあります!man mount のオプション sync の説明を確認してください。

まだファイルの転送速度が遅い場合は、flush マウントオプションを使ってファイルシステムを再マウントしてみてください:

root #mount -o remount,flush /path/to/mountpoint

オペレーティングシステム互換性のある他のファイルシステム

UDFTools を利用して UDF ファイルシステムを試してみてください。これには sys-fs/udftools と Linux カーネル UDF ファイルシステムドライバが必要です。近年 mkudffs に、Microsoft 関連オペレーティングシステムとの互換性を改善する、モックパーティションの作成に関する修正コードが追加されました。より古い Linux カーネルを使用している場合、互換性を改善するためには、ブロックサイズが 512 に設定されていることを確認してください。モックパーティションを作成するために必要な --bootarea=mbr を除き、ほとんどのオプションは互換性のためデフォルトになっています。

root #mkudffs --bootarea=mbr --label=your_label /dev/device_file

Samsung の F2FS ファイルシステムも試してみてください。

UTF-8/UTF-16 文字によるハードウェアのバグ

Sometimes hardware firmware bugs will occur on embedded devices (eg. car radios) when reading their required formatted FAT/FAT32 filesystems containing UTF-8 characters. A workaround is to ensure initially mounting the FAT filesystem using (current default) mount options codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro.

For short filenames, codepage=437 is IBM-PC characters or basically ASCII. For long filenames, iocharset=iso8859-1 specifies ASCII. The option shortname=mixed is default, and can also try shortname=win95 option. Of which, are all current defaults. Additionally to further remedy UTF-8/UTF-16 incompatible characters, use a loop with sed to replace all incompatible UTF-8/UTF-16 characters with an underscore or other ASCII character. (See this replace_chars.sh script.)

参考までに、このバグは Sony のカーラジオで発生しました。MEX-GS610BT モデルのラジオは、UTF-8/UTF-16 文字を含む USB フラッシュメディア/ドライブを読もうとしたときにハードリセットします。

前述の通り、codepage、iocharset、または utf8 マウントオプションを使うかどうかについてのさらなる説明については、 Linux カーネルの vfat のソースコードドキュメンテーション /usr/src/linux/Documentation/filesystems/vfat.txt を確認してください。

ファイルとフォルダがソートされない

FAT/FAT32 ファイルシステムにファイルを書き込んで、別のデバイスでそのファイルシステムを読み込んだとき、ファイルとフォルダがソートされずに表示されることがあります。ふつう、見る人はファイルとフォルダをアルファベット順にソートされた状態で見たいでしょう。sys-fs/fatsort をインストールして、次のコマンドを実行してください:

root #fatsort /dev/device_file

関連項目

  • ExFAT — マイクロソフトがつくった、USB スティックメモリのようなフラッシュメモリ記憶媒体に合わせたファイルシステム
  • ext4 — オープンソースのディスクファイルシステムで、extended filesystem シリーズの最新バージョンです。
  • btrfs — 耐障害性、自己修復特性、管理のしやすさに焦点を当てつつ、先進的な機能を実装することも主眼としている、Linux 向けのコピーオンライト (CoW) ファイルシステムです。
  • removable media — システムから容易に取り除くことができるメディア
  • /etc/fstab — 特にブート時において、どのようにそしてどこに主要なファイルシステムがマウントされるかを定義する設定ファイルです。

外部資料

参照