FAT
文件分配表(FAT) - 文件系统 最初用于MS-DOS(和之后的,NT内核之前的Windows)。目前,FAT (FAT32) 的更新版本用于 USB 闪存盘。[1] 它已经进入 Linux 系统,并在 Linux kernel 中得到官方支持。
尽管 FAT32 缺乏现代文件系统中固有的许多功能,但该文件系统仍然可以在现代计算机中找到,例如,当使用 EFI系统分区时。2006 年,Microsoft 开发了新版本的 FAT (exFAT),该版本不兼容以前的版本。有关更多信息,请参阅 exFAT 文章。
安装
内核
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
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.EXT
或 FileName.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 — 定义主要的文件系统在哪里以及如何挂载它们(特别是在启动时)的配置文件。
外部资源
- /usr/src/linux/Documentation/filesystems/vfat.txt - Documentation on the VFAT filesystem included with the Linux kernel sources.
- FAT filesystem and Linux - from Wikipedia