Linux mkfs.msdos 命令
注意:mkfs.msdos是创建MS-DOS/FAT文件系统的工具,在大多数Linux系统中,它是mkfs.fat或mkdosfs的符号链接。用于创建在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 - 设置循环设备