Linux mkfs.msdos 命令

注意:mkfs.msdos是创建MS-DOS/FAT文件系统的工具,在大多数Linux系统中,它是mkfs.fatmkdosfs的符号链接。用于创建在Windows、Linux和macOS之间兼容的FAT文件系统。

命令简介

mkfs.msdos是dosfstools软件包中的工具,用于在Linux下创建MS-DOS/FAT文件系统。它可以创建FAT12、FAT16和FAT32文件系统,特别适合格式化需要在多个操作系统间共享的存储设备,如U盘、SD卡等。

命令语法

mkfs.msdos [选项] 设备 [块数]

常用选项

选项 说明
-F FAT类型 指定FAT类型:12, 16, 32
-n 卷标 设置卷标(最多11个字符)
-I 强制创建文件系统,不进行确认
-v 详细模式,显示更多信息
-c 在创建文件系统前检查坏块
-S 扇区大小 指定逻辑扇区大小(字节)
-s 每簇扇区数 指定每簇的扇区数
-r 根目录条目数 指定根目录条目数
-R 保留扇区数 指定保留扇区数
-f FAT数量 指定FAT表的数量(1或2)
-h 隐藏扇区数 指定隐藏扇区数
-m 消息文件 指定引导扇区的消息文件
-C 创建文件系统映像文件
-i 卷ID 指定卷ID(序列号)

FAT文件系统选择规则

FAT类型 容量范围 默认簇大小 适用场景
FAT12 0 - 16 MB 0.5 - 4 KB 软盘、小容量设备
FAT16 16 MB - 2 GB 2 - 64 KB 小容量U盘、SD卡
FAT32 512 MB - 2 TB 4 - 32 KB 大容量U盘、移动硬盘
VFAT 与FAT16/FAT32相同 与FAT16/FAT32相同 支持长文件名

使用示例

1. 基本FAT32格式化

# 创建FAT32文件系统(自动选择参数)
mkfs.msdos /dev/sdb1

# 或明确指定FAT32
mkfs.msdos -F 32 /dev/sdb1

2. 格式化并设置卷标

# 创建FAT32文件系统并设置卷标
mkfs.msdos -F 32 -n "USB_DRIVE" /dev/sdb1

# 设置短卷标(8.3格式)
mkfs.msdos -n "MYUSB" /dev/sdb1

3. 强制格式化不确认

# 强制格式化,不进行任何确认
mkfs.msdos -I /dev/sdb1

# 强制格式化FAT32
mkfs.msdos -F 32 -I /dev/sdb1

4. 检查坏块后格式化

# 先检查坏块,然后创建文件系统
mkfs.msdos -c /dev/sdb1

# 检查坏块并创建FAT32
mkfs.msdos -F 32 -c /dev/sdb1

5. 创建FAT16文件系统

# 创建FAT16文件系统
mkfs.msdos -F 16 /dev/sdb1

# 指定簇大小(每簇4个扇区,2KB)
mkfs.msdos -F 16 -s 4 /dev/sdb1

6. 创建FAT12文件系统(软盘)

# 创建1.44MB软盘的FAT12文件系统
mkfs.msdos -F 12 /dev/fd0

# 指定1.44MB软盘参数
mkfs.msdos -F 12 -S 512 -s 1 -r 224 /dev/fd0

7. 创建文件系统映像

# 创建空的映像文件
dd if=/dev/zero of=msdos.img bs=1M count=100

# 在映像文件上创建FAT32文件系统
mkfs.msdos -F 32 -C msdos.img 102400

# 挂载映像文件
mkdir /mnt/msdos_img
sudo mount -o loop msdos.img /mnt/msdos_img

8. 完整U盘格式化脚本

#!/bin/bash
# U盘格式化脚本
DEVICE="/dev/sdb1"
LABEL="MY_USB_DRIVE"
SIZE_MB=$(sudo blockdev --getsize64 $DEVICE 2>/dev/null | awk '{print int($1/1024/1024)}')

echo "设备: $DEVICE"
echo "大小: ${SIZE_MB}MB"

# 卸载设备
echo "卸载设备..."
sudo umount $DEVICE 2>/dev/null

# 根据大小选择FAT类型
if [ $SIZE_MB -lt 16 ]; then
    FAT_TYPE=12
    echo "使用FAT12文件系统"
elif [ $SIZE_MB -lt 512 ]; then
    FAT_TYPE=16
    echo "使用FAT16文件系统"
else
    FAT_TYPE=32
    echo "使用FAT32文件系统"
fi

# 格式化
echo "正在格式化..."
sudo mkfs.msdos -F $FAT_TYPE -n "$LABEL" -c -v $DEVICE

if [ $? -eq 0 ]; then
    echo "格式化成功完成!"
    echo "卷标: $LABEL"
    echo "文件系统: FAT$FAT_TYPE"
else
    echo "格式化失败!"
    exit 1
fi

不同FAT版本特性对比

特性 FAT12 FAT16 FAT32 VFAT
最大卷大小 32 MB 2 GB 2 TB(理论) 与FAT16/32相同
最大文件大小 32 MB 2 GB 4 GB - 1字节 与FAT16/32相同
长文件名支持 ❌ 不支持 ❌ 不支持 ❌ 不支持 ✅ 支持(255字符)
Windows兼容性 ✅ 所有版本 ✅ 所有版本 ✅ Windows 95 OSR2+ ✅ Windows 95 OSR2+
Linux兼容性 ✅ 优秀 ✅ 优秀 ✅ 优秀 ✅ 优秀
macOS兼容性 ✅ 优秀 ✅ 优秀 ✅ 优秀 ✅ 优秀
推荐使用场景 软盘、嵌入式 小容量U盘 大容量存储 现代跨平台

高级配置选项

1. 指定扇区大小

# 指定512字节扇区(标准)
mkfs.msdos -S 512 /dev/sdb1

# 指定4096字节扇区(某些SSD或大容量设备)
mkfs.msdos -S 4096 /dev/sdb1

2. 指定簇大小

# 设置每簇8个扇区(4KB)
mkfs.msdos -s 8 /dev/sdb1

# 设置每簇64个扇区(32KB)
mkfs.msdos -s 64 /dev/sdb1

3. 自定义根目录条目数

# 设置根目录512个条目(默认224)
mkfs.msdos -r 512 /dev/sdb1

# FAT32通常不需要此选项,根目录大小可扩展
mkfs.msdos -F 32 -r 512 /dev/sdb1

4. 设置引导扇区消息

# 创建消息文件
echo "=== WARNING ===" > boot_msg.txt
echo "Do not remove during data transfer" >> boot_msg.txt

# 格式化时包含引导消息
mkfs.msdos -m boot_msg.txt /dev/sdb1

5. 设置卷ID(序列号)

# 设置自定义卷ID
mkfs.msdos -i 0x12345678 /dev/sdb1

# 使用随机生成的卷ID(默认)
mkfs.msdos /dev/sdb1

Windows兼容性注意事项

Windows对FAT32的特殊限制:
  • 32GB限制:Windows内置格式化工具限制FAT32最大32GB
  • 4GB文件限制:FAT32不支持单个文件大于4GB
  • 簇大小:Windows可能对簇大小有特殊要求
  • 卷标长度:Windows可能限制卷标为11个字符(8.3格式)

创建Windows兼容的大容量FAT32

# 使用第三方工具fat32format(Windows)或以下参数
# Linux下创建大容量FAT32(超过32GB)
sudo mkfs.msdos -F 32 -s 64 -n "BIG_USB" /dev/sdb1

# 或者使用exFAT(更好的大容量解决方案)
sudo mkfs.exfat -n "BIG_USB" /dev/sdb1

常见问题解决

1. "无法打开设备"错误

# 错误:mkfs.msdos: unable to open /dev/sdb1: Permission denied
# 解决方案:
# 使用sudo权限
sudo mkfs.msdos /dev/sdb1

# 或检查设备是否存在
ls -l /dev/sdb1

# 检查设备是否被挂载
mount | grep sdb1

2. "设备忙"错误

# 错误:mkfs.msdos: Device /dev/sdb1 is busy
# 解决方案:
# 卸载设备
sudo umount /dev/sdb1

# 强制卸载(如果普通卸载失败)
sudo umount -l /dev/sdb1

# 检查哪个进程在使用
sudo lsof | grep /dev/sdb1
sudo fuser -km /dev/sdb1  # 强制终止相关进程

3. "块数无效"错误

# 错误:mkfs.msdos: invalid number of blocks
# 解决方案:
# 检查设备大小
sudo fdisk -l /dev/sdb

# 使用自动计算的块数(不指定块数)
mkfs.msdos /dev/sdb1

# 或明确指定正确的块数
# 计算块数:总字节数 / 1024
BLOCKS=$(sudo blockdev --getsize64 /dev/sdb1 | awk '{print int($1/1024)}')
mkfs.msdos /dev/sdb1 $BLOCKS

4. Windows无法读取格式化后的U盘

# 可能原因:使用了Windows不支持的参数
# 解决方案:
# 使用标准参数重新格式化
sudo mkfs.msdos -F 32 -n "USB" /dev/sdb1

# 或者尝试FAT16(对于小容量设备)
sudo mkfs.msdos -F 16 -n "USB" /dev/sdb1

# 在Windows中使用磁盘管理工具重新格式化

与其他FAT格式化命令的关系

命令 说明 与mkfs.msdos的关系
mkfs.fat 创建FAT文件系统 通常是同一个命令的不同名称
mkdosfs 创建DOS文件系统 功能相同的不同命令
mkfs.vfat 创建VFAT文件系统 支持长文件名,功能相同
mformat Mtools的格式化工具 类似功能,使用DOS驱动器字母

重要注意事项

  • 数据丢失:格式化会永久删除设备上的所有数据
  • 备份重要数据:格式化前务必备份重要文件
  • 设备确认:仔细确认设备名,避免格式化错误设备
  • 4GB文件限制:FAT32不支持单个文件大于4GB
  • Windows兼容性:Windows对FAT32有额外限制(最大32GB)
  • 现代替代方案:对于大容量存储,考虑使用exFAT或NTFS
  • 安全移除:格式化后安全移除设备,避免数据损坏

安装dosfstools

# Debian/Ubuntu系统
sudo apt-get install dosfstools

# CentOS/RHEL系统
sudo yum install dosfstools

# Fedora
sudo dnf install dosfstools

# Arch Linux
sudo pacman -S dosfstools

# macOS (使用Homebrew)
brew install dosfstools

# 验证安装
which mkfs.msdos
ls -l $(which mkfs.msdos)  # 应该指向mkfs.fat或mkdosfs

相关命令

  • mkfs.fat - mkfs.msdos的常用别名
  • mkdosfs - 功能相同的另一个命令
  • fatlabel - 设置或显示FAT卷标
  • fsck.fat - 检查修复FAT文件系统
  • fdisk - 磁盘分区工具
  • parted - 高级分区编辑器
  • mount - 挂载文件系统
  • umount - 卸载文件系统
  • dd - 创建磁盘映像
  • losetup - 设置循环设备