Linux mkdosfs 命令

注意:mkdosfs命令用于创建MS-DOS/FAT文件系统。在许多Linux发行版中,mkdosfsmkfs.fat是同一个命令的别名,用于创建FAT12、FAT16和FAT32文件系统。

命令简介

mkdosfs是一个用于在Linux下创建MS-DOS/FAT文件系统的工具。它是dosfstools软件包的一部分,可以创建FAT12、FAT16和FAT32文件系统,适用于U盘、SD卡等需要在多个操作系统间共享的存储设备。

命令语法

mkdosfs [选项] 设备 [块数]

常用选项

选项 说明
-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 - 32 MB 0.5 - 4 KB 小于32MB时自动选择
FAT16 32 MB - 2 GB 2 - 64 KB 32MB-2GB时自动选择
FAT32 512 MB - 2 TB 4 - 32 KB 大于512MB时自动选择

使用示例

1. 基本FAT32格式化

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

# 或明确指定FAT32
mkdosfs -F 32 /dev/sdb1

2. 格式化并设置卷标

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

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

3. 强制格式化不确认

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

# 强制格式化FAT32
mkdosfs -F 32 -I /dev/sdb1

4. 检查坏块后格式化

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

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

5. 创建FAT16文件系统

# 创建FAT16文件系统
mkdosfs -F 16 /dev/sdb1

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

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

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

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

7. 创建文件系统映像

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

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

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

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 32 ]; 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 mkdosfs -F $FAT_TYPE -n "$LABEL" -c -v $DEVICE

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

高级配置选项

1. 指定扇区大小

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

# 指定4096字节扇区(某些SSD)
mkdosfs -S 4096 /dev/sdb1

2. 指定簇大小

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

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

3. 自定义根目录条目

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

# FAT32通常不需要此选项,因为根目录大小可扩展

4. 设置引导扇区消息

# 创建消息文件
echo "My USB Drive - Do not remove during transfer" > boot_msg.txt

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

FAT文件系统限制

限制项 FAT12 FAT16 FAT32
最大卷大小 32 MB 2 GB 2 TB(理论)
最大文件大小 32 MB 2 GB 4 GB - 1
最大文件数 4,077 65,517 约4百万
根目录最大文件数 512 512 无限制
簇大小范围 0.5-4 KB 2-64 KB 4-32 KB

与其他命令的关系

命令 说明 与mkdosfs的关系
mkfs.fat 创建FAT文件系统 通常与mkdosfs是同一个命令
mkfs.vfat 创建VFAT文件系统 支持长文件名,功能更强大
mformat Mtools的格式化工具 类似功能,但使用DOS驱动器字母
fatlabel 设置FAT卷标 mkdosfs的-n选项可设置卷标
dosfsck 检查修复FAT文件系统 创建后的维护工具

常见问题解决

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

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

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

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

2. "设备忙"错误

# 错误:mkdosfs: Device /dev/sdb1 is mounted
# 解决方案:
# 卸载设备
sudo umount /dev/sdb1

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

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

3. "块数无效"错误

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

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

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

4. 大容量U盘格式化问题

# Windows可能无法读取大于32GB的FAT32
# 解决方案:
# 方法1:使用exFAT(跨平台支持)
sudo mkfs.exfat /dev/sdb1

# 方法2:使用NTFS(Linux/Windows)
sudo mkfs.ntfs /dev/sdb1

# 方法3:强制FAT32(某些工具支持)
# 使用fat32format工具(Windows)
# 或使用特殊参数

重要注意事项

  • 数据丢失:格式化会永久删除设备上的所有数据
  • 备份重要数据:格式化前务必备份重要文件
  • 设备确认:仔细确认设备名,避免格式化错误设备
  • 4GB文件限制:FAT32不支持单个文件大于4GB
  • Windows兼容性:Windows对FAT32有额外限制(如最大32GB)
  • SSD优化:对于SSD设备,考虑使用对齐的扇区大小

安装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

# 从源码编译
wget https://github.com/dosfstools/dosfstools/releases/download/v4.2/dosfstools-4.2.tar.gz
tar -xzf dosfstools-4.2.tar.gz
cd dosfstools-4.2
./configure
make
sudo make install

相关命令

  • mkfs.fat - mkdosfs的别名
  • fatlabel - 设置FAT卷标
  • fsck.fat - 检查修复FAT文件系统
  • fdisk - 磁盘分区工具
  • parted - 高级分区编辑器
  • mount - 挂载文件系统
  • umount - 卸载文件系统
  • dd - 创建磁盘映像
  • losetup - 设置循环设备