FAT

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

文件分配表(FAT) - 文件系统 最初用于MS-DOS(和之后的,NT内核之前的Windows)。目前,FAT (FAT32) 的更新版本用于 USB 闪存盘。[1] 它已经进入 Linux 系统,并在 Linux kernel 中得到官方支持。

尽管 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

Snippet

文件 /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"

当计划使用 mount 挂载FAT 分区 时,用户可能需要在 mount 中指定一个代码页(codepage=)选项。在上面的示例中,使用了美国和加拿大的代码页,但是可以启用其他代码页。另一个可选项是在内核配置中为 FAT 设置默认代码页。请确保要使用的每个代码页值都已在内核中启用。

附注
通过 mount 使用代码页(codepage)选项将覆盖内核中使用的设置。

避免将Default iocharset for fat(FAT的默认字符集)设置为UTF-8:这并不推荐。相反,请在挂载FAT分区时设置utf8=true(这要求内核选项CONFIG_NLS_UTF8启用)。有关更多信息,请参见 mount(8) 手册页或参见 /usr/src/linux/Documentation/filesystems/vfat.rst 中的相应内核文档。

Emerge

sys-fs/dosfstools包用于用户空间的FAT实用程序:

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

使用 FAT32 文件系统格式化 /dev/sdx9 分区,标签为 “ESP”,并显示详细输出:

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

应该可以使用 mount命令挂载FAT文件系统。可以使用 sys-fs/fatresize 调整大小。

区分大小写

在原始 FAT 文件系统中,只能使用短文件名(8.3 或 SFN),并且它们仅以全部大写形式存储。使用原始 FAT 文件系统的系统不区分大小写(如 MS-DOS)。作为 FAT 的扩展,VFAT 不仅允许使用长文件名 (LFN),还允许在文件名中使用小写字母。VFAT 保留大小写,但出于兼容性原因,现有操作系统(例如 Microsoft Windows 95 和 Windows NT)仍然将文件名视为不区分大小写。另一方面,Unix 传统上严格区分大小写。

在 Linux 中,vfat 默认将名称视为不区分大小写(挂载选项check=r意为宽松)。然而,VFAT 也可以通过严格大小写检查来挂载,使用挂载选项check=s,但这可能会导致问题。

手动挂载选项

警告
使用默认选项以外的任何选项都可能会导致问题!已经警告过你了!详情请参见 Problem cases 章节。

对于目录和文件的短名称(8.3,即“短文件名”或 SFN),可以使用挂载选项 shortname 更改名称在文件系统中的存储方式和显示方式,从 Linux 内核 2.6.32(2009 年 12 月)开始,该选项默认为 mixed[2]

文件系统 挂载选项 显示短文件名 短文件名示例 储存长文件名 长文件名示例
FAT12
FAT16
FAT32
VFAT
FILENAME.EXT
shortname=lower 始终强制小写 filename.ext 当短名称不全为大写时
shortname=win95 大写 FILENAME.EXT 当短名称不全为大写时
shortname=winnt 原样显示 FILENAME.EXT 当短名称不全小写或全大写时
shortname=mixed 原样显示 FILENAME.EXT 当短名称不全为大写时
VFAT FILENA~1.EXT FileName.Ext
shortname=lower 始终强制小写 当短名称不全为大写时 FileName.Ext
shortname=win95 大写 当短名称不全为大写时 FileName.Ext
shortname=winnt 原样显示 当短名称不全小写或全大写时 FileName.Ext
shortname=mixed 原样显示 当短名称不全为大写时 FileName.Ext
VFAT LONGNA~1.EXT long name.ext
shortname=lower 始终强制小写 当短名称不全为大写时 long name.ext
shortname=win95 大写 当短名称不全为大写时 long name.ext
shortname=winnt 原样显示 当短名称不全小写或全大写时 long name.ext
shortname=mixed 原样显示 当短名称不全为大写时 long name.ext

特殊情况是全小写的短文件名,例如 filename.ext。如果它是使用 shortname=winnt 创建的,则不会创建 LFN VFAT 条目。

文件系统 挂载选项 存储长文件名 长文件名示例 显示短文件名 短文件名示例
VFAT filename.ext FILENAME.EXT
shortname=winnt 当短名称不是 全部小写 或全部大写时 原样显示(短文件名) FILENAME.EXT
shortname=lower 始终强制小写 filename.ext
shortname=win95 大写 FILENAME.EXT
shortname=mixed 原样显示 FILENAME.EXT

但是,如果文件是用 shortname=lower|win95|mixed 创建的,则会有一个 VFAT 条目(LFN)和一个短文件名,例如 FILENA~2.EXT 。只要有 LFN,VFAT 就会显示 LFN,而不是 SFN。这一点尤其棘手,因为 LFN 条目可能看起来像 8.3 SFN,如示例 filename.ext 中的情况。

文件系统 挂载选项 长文件名示例 显示短文件名 短文件名示例
VFAT filename.ext FILENA~2.EXT
shortname=lower filename.ext 小写
shortname=win95 filename.ext 大写
shortname=winnt filename.ext 原样显示
shortname=mixed filename.ext 原样显示 ~

问题案例

使用默认设置,现有文件系统将 “正常工作”。[3]首先,VFAT 目前默认为宽松的大小写检查(挂载选项 check=r)。这意味着挂载点下的目录和文件的名称将始终有效,只要它们在大写和小写拼写的任何可能组合中匹配,例如 filename.ext 即使在例如 FILENAME.EXTFileName.Ext 存在时也会被找到,因为差异仅在大小写上。

其次,并非全部大写的短名称(8.3、SFN)将获得一个额外的长文件名条目以正确存储大小写,即进行 VFAT 大小写保留(挂载选项 shortname=mixed)。

重要
在使用UEFI的平台上,这对于兼容EFI系统分区(ESP)上的现有目录和文件尤为重要,这对于启动配置至关重要。使用 FAT 和 VFAT 的系统传统上不区分大小写,因此现有目录和文件名在使用大小写字母时会略有不同。在 vfat 的默认设置下,Linux 适应了这一习惯,并将整个挂载点也视为不区分大小写,即 /efi/EFI/boot/bootx64.efi (假设 ESP 挂载在 FAT 下)。(假定 ESP 挂载在 /efi 下),其他 EFI 引导加载器路径将始终按预期运行。

如果只安装了 Linux 系统,且所有文件引用完全相同,那么在严格的大小写检查(挂载选项 check=s)下,一切正常。不过,由于 VFAT 文件系统在某些情况下(并非所有情况下)存储两个文件名,一个短文件名(8.3,SFN)和一个长文件名(LFN),因此有关这些名称管理的约定可能会导致额外的问题。一个明显的例子是使用 shortname=winnt 将全小写的短文件名转换为全大写的标准 FAT 文件名,而跳过创建对应的 LFN。例如,文件名 bootx64.efi 将只存储为传统 8.3 短文件名 (SFN) BOOTX64.EFI。此外,shortname=winnt 将按原样显示短文件名,因此最初写入的 bootx64.efi 并不存在,再加上严格的大小写检查,这将在 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=你的标签 /dev/设备文件

请尝试三星的F2FS文件系统。(译注:该文件系统在Windows上不可访问,谨慎行事。)

UTF-8/UTF-16 字符硬件错误

有时,嵌入式设备(如车载收音机)在读取包含 UTF-8 字符的所需格式化 FAT/FAT32 文件系统时会出现硬件固件错误。解决方法是确保最初使用(当前默认)挂载选项codepage=437,iocharset=iso8859-1,shortname=mixed,error=remount-ro挂载 FAT 文件系统。

对于短文件名,codepage=437是 IBM-PC 字符或基本 ASCII。对于长文件名,iocharset=iso8859-1指定 ASCII。选项 shortname=mixed 是默认值,也可以尝试 shortname=win95 选项。这些都是当前的默认值。此外,为进一步解决 UTF-8/UTF-16 字符不兼容的问题,可使用 sed 循环将所有不兼容的 UTF-8/UTF-16 字符替换为下划线或其他 ASCII 字符。(参见 replace_chars.sh脚本)。

作为参考,索尼汽车收音机曾遇到过此错误。MEX-GS610BT 型收音机在尝试读取包含 UTF-8/UTF-16 字符的 USB 闪存媒体/驱动器时会出现硬重置。

如前所述,请参阅 Linux 内核 vfat 源代码文档 /usr/src/linux/Documentation/filesystems/vfat.txt,了解有关使用 codepage、iocharset 或 utf8 挂载选项的进一步解释。

未排序的文件和文件夹

向 FAT/FAT32 文件系统写入文件时,用于读取文件系统的设备可能会将文件和文件夹显示为未排序。 通常,查看器更喜欢看到按字母顺序排序的文件和文件夹。安装 sys-fs/fatsort 并执行以下命令:

root #fatsort /dev/设备文件

另请参阅

  • ExFAT — 一个微软创建的、为闪存介质优化的文件系统
  • ext4 — 一个开源的磁盘文件系统并且是扩展系列文件系统的最新版本。
  • btrfs — 一个写入时复制(CoW) 的 Linux 文件系统 ,旨在实现高级功能的同时专注于容错、修复和易于管理等功能。
  • removable media — any media that is easily removed from a system.
  • /etc/fstab — 定义主要的文件系统在哪里以及如何挂载它们(特别是在启动时)的配置文件。

外部资源

参照