资讯动态

Linux下用fdisk格式化SD卡:分区、格式化与踩坑指南

发布时间:2026/10/16 13:06:16 来源:尧图企业网站定制
手里的SD卡要格式化这个需求我在不同朋友那里被问过很多次。有人在某开发板上折腾启动镜像有人想把行车记录仪的存储卡重新分区还有人干脆忘了卡里之前写了什么只想彻底清空。到了Linux下从插卡那一刻起就全是命令行操作——设备名是哪个、分区怎么建、最后又该格式化成什么文件系统每一步都有讲究。这篇文章就用fdisk工具把整套流程走一遍从识别设备到挂载验证包含我实际踩过的坑和常用的命令。如果你是第一次在Linux下格式化SD卡顺着读就好如果你已经敲过不少命令可以直接跳到第2章看分区表的部分。会用fdisk的人很多但把SD卡这个特定场景讲透、把兼容性问题讲明白的内容很少这篇就是来补上这个缺口的。1. 格式化前的准备先认清你的卡和读卡器1.1 设备识别为什么你的卡有时叫sdb有时叫mmcblk0插上读卡器之后Linux怎么知道卡在哪个设备节点答案不唯一这正是新手最容易懵的地方。通过USB读卡器接入的SD卡会被内核按SCSI磁盘来处理设备名通常是/dev/sda、/dev/sdb之类如果是开发板自带的SDIO卡槽设备名往往变成/dev/mmcblk0分区也变成/dev/mmcblk0p1。同一个物理卡两种完全不同的命名规则这不是系统错乱是总线类型不同。我的习惯是先跑一条lsblk把挂载点、大小、设备名一次看清。示例输出大致长这样NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 119.2G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi sdb 8:16 1 29.7G 0 disk └─sdb1 8:17 1 29.7G 0 part看到sdb那一行29.7G基本可以确定这就是那张要动手的卡。为什么强调容量因为很多人的电脑上同时插着U盘、移动硬盘甚至虚拟光驱设备名会顺延排列看名字远不如看容量准。卡上如果有分区lsblk会把分区列在设备下面像sdb1用SDIO卡槽的时候则会是mmcblk0p1这种带p的格式。如果lsblk输出一片迷雾再用dmesg看一眼内核日志搜sd/mmc这些关键字能看到内核识别卡的全过程。这个方法在卡插上但系统没反应的时候尤其好用能区分是读卡器坏了、卡没插好还是驱动有问题。1.2 卸载与保护格式化前必须做的三件事第一件事是确认卡上没有任何分区还挂在系统里。用mount | grep /dev/sdb或者直接看lsblk的MOUNTPOINT列。如果有挂载先umount /dev/sdb1把它卸掉。这里要提醒一句不要用umount -l这种懒卸载表面看是卸了实际还在占用紧接着mkfs大概率报device busy。第二件事是找写保护锁。很多SD卡侧面有个小拨杆转到LOCK位置之后整卡变成只读你以为自己卡坏了其实只是锁上了。拨回去再重新插一次让读卡器重新识别一次状态。开发板上如果老是提示只读文件系统先检查卡套上的锁不要急着怀疑卡损坏。第三件事是想清楚一个关键问题你到底要整卡格式化还是只格式化某个分区这个决定直接决定后面的命令。如果卡里之前有分区表而新用途只需要一个大分区那就按第2章流程先把旧分区全部删除再重新建一个如果只换文件系统不换分区结构可以跳过fdisk直接用mkfs处理目标分区即可。我见过不少人拿着只改文件系统的需求去删分区删除分区表那一步就把数据全毁了。注意格式化不可逆动手之前把卡里需要的数据全部拷出来。命令行下误格式化整盘的事故几乎每天都有人在社区里发帖。2. 使用fdisk创建分区表从一张白卡到可用分区2.1 为什么分区选fdisk而不是直接dd或mkfsLinux下面搞分区的工具不少fdisk、gdisk、parted还有直接拿mkfs对整卡格式化的野路子。为什么我在SD卡这个场景优先推荐fdisk主要是兼容性和习惯问题。fdisk长年默认操作MBR分区表而绝大多数相机、行车记录仪、老开发板引导程序只认MBR。MBR意味着最多4个主分区对一张SD卡来说完全够用。如果你手里的卡大于2TB这种极端场景才需要换成gdisk去建GPT但那基本不是SD卡会遇到的场景。工具适用分区表特点fdiskMBR最经典交互式操作新手友好gdiskGPT适合大容量磁盘和UEFI引导场景partedMBR/GPT支持脚本化批量操作直接mkfs无分区表简单粗暴但兼容性差为什么不建议直接mkfs整卡直接mkfs.vfat /dev/sdb不带分区号在某些场景能用但它生成的设备没有有效分区表很多消费类设备根本不认。Windows也不会把它当可移动磁盘正确显示。所以结论很明确除非你有特殊目的否则先分区再格式化永远稳一点。MBR和GPT的取舍也在这里说清楚。MBR的起始扇区、分区ID都有固定结构fdisk在里面加了很多防呆检查。GPT是为大容量硬盘设计的分区表本身在盘上有备份。SD卡小于32GB时不需要GPT继续用MBR就好超过32GB且明确要给新设备用再考虑gdisk。2.2 fdisk交互式操作流程每一步命令的含义进入fdisk的命令是sudo fdisk /dev/sdb注意这里操作的是整块设备/dev/sdb不是分区/dev/sdb1。分区表是写在整块卡最开头几个扇区里的你只有对整块设备操作才能重建分区表。进入交互界面后第一步永远是p打印当前分区表确认你要动的就是这张卡。如果卡里已经有分区用d删掉如果一张老卡有好几个分区d命令会反复询问分区号直到全部删光。删除全部旧分区之后输入n新建分区。fdisk会问分区类型SD卡一般选p主分区就好。扩展分区e在MBR里是为了绕过4个主分区限制才用的普通SD卡没必要碰。分区号默认1。起始扇区建议直接回车fdisk新版默认从2048开始。这里的2048不是拍脑袋定的是现代磁盘4K物理扇区对齐的标准起点对齐之后读卡器的性能会更稳定。结束扇区可以输入29G这种相对大小也可以直接回车把剩余空间全给这个分区。如果你后面还想留一个分区放数据这里就按规划好的大小填。创建完成后再p看一眼确认大小、分区号都没错最后w写入并退出。到这一步分区表才算真正写进卡里。q是不保存退出w才是保存这两个字母千万别搞混搞混了前面的操作就白做了。Command (m for help): p Disk /dev/sdb: 29.7 GiB, 31914983424 bytes, 62334030 sectors Disk model: SD Card Reader Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x1c5d7e2f Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 62334029 62331982 29.7G 83 Linux Command (m for help): w The partition table has been altered. Syncing disks.上面是完整操作之后打印出来的分区表。第一行Disklabel type: dos表示MBR分区表Start列从2048开始说明4K对齐生效Id 83是Linux文件系统的分区类型标识。如果这个分区要作为引导分区或者给Windows系统用有些场景需要把Id改成0c或0bW95 FAT32不过fdisk下不用刻意改mkfs之后类型会自动匹配。这里再补充一个操作小技巧fdisk支持命令行直接传参比如fdisk -l /dev/sdb只查看分区表不进入交互界面适合快速确认设备。交互界面里输入m能看到全部命令帮助不确定的时候先按m查一下比乱按强得多。2.3 分区表生效与“设备忙”的真相fdisk退出后系统往往会提示“Kernel still reading table”之类的信息意思是内核还抱有旧分区表。这是正常现象不用panic。这时直接重新插拔读卡器或者执行partprobe让内核重新读一遍分区表sudo partprobe /dev/sdb做完之后lsblk一般就能看到新分区。如果partprobe也提示设备忙多半是还有进程占用底层设备用lsof /dev/sdb查是谁占着找到并释放它。有个很常见的问题分区分好、w退出了但/dev/sdb1这个节点不存在。原因基本就是上面这个——分区表没重新加载。开发板上没有图形桌面的环境我一般就用重新插拔解决简单直接。3. 创建文件系统选对格式这张卡才算真正可用3.1 文件系统选型这张卡到底给谁用分区建好只是第一步没有文件系统的分区对操作系统来说仍是一张空壳。选文件系统时先问一句这张卡格式化之后插到哪里用我给开发板做启动卡时boot分区通常是FAT32因为很多引导程序第一个读取的就是这个分区根文件系统分区用ext4因为要支持Linux的权限、日志和软链接。如果卡片最终要在行车记录仪、相机、老年机这些设备上使用老老实实用FAT32兼容性最高。文件系统优点缺点适用场景FAT32兼容性最好所有系统都认单个文件最大4GB相机、行车记录仪、跨平台交换exFAT支持超大文件跨平台较好老系统不支持Linux需额外驱动大视频素材、大容量卡ext4Linux原生支持权限和日志Windows/macOS不识别开发板根文件系统、数据存储FAT32的缺点是单文件不能超过4GB如果确定需要拷贝高清视频素材那就上exFAT。Linux下先装exfatprogs再mkfs.exfat技术上没有任何障碍。如果只是Linux自己用不考虑其他设备ext4显然更合适。很多人忽略了一个点SD卡本身有磨损均衡机制ext4的日志机制会让写入次数变多但现代卡基本都能承受不用过分担心。3.2 mkfs格式化实战核心命令与参数解析分区结构确定之后格式化命令其实很简单。以两个分区为例第一个分区做FAT32启动分区第二个分区做ext4根文件系统sudo mkfs.vfat -F 32 -n BOOT /dev/sdb1 sudo mkfs.ext4 -L rootfs /dev/sdb2-F 32这个参数在mkfs.vfat里代表FAT32位宽。默认情况下mkfs.fat会根据分区大小自动选FAT12/16/32但SD卡场景中为了兼容性我会手动指定FAT32。卷标-n注意最多11个字符不要写中文和空格。-L是ext4的卷标参数长度限制和FAT32不一样但同样建议用简单英文。如果确实需要无分区整卡格式化mkfs.vfat默认会拒绝操作并提示设备不是分区这时可以加上-I参数强制。但这个操作只适合对整卡裸格式化前面说的消费类设备兼容问题依然存在我不会把它当默认方案。簇大小是另一个容易被忽略的参数。mkfs.fat在自动模式下会根据分区容量选择簇大小分区越大簇越大。簇太大会导致每个文件占用的最小空间变大小文件一多就白白浪费空间簇太小则可能超出某些老设备的支持范围。一般用途保持默认就行不建议手动乱调。实在想调用-s指定每簇扇区数例如-s 8代表每簇8个扇区即4KB簇。3.3 整卡格式化与分区格式化的边界这里专门说一个很容易造成数据丢失的边界场景一张卡原来有两个分区其中一个分区有数据你把另一个分区删了重新格式化看起来没事实际上一旦误删或误写数据恢复会变得极其困难。分区表的改动不像文件删除没有回收站。真到动手前能备份就备份不能备份就再确认一次容量和设备名。如果卡之前装过别的系统镜像比如用dd写入过整卡镜像分区表往往被镜像自带的分区表覆盖这时fdisk里看到的分区和容量可能和预期不符。按d把分区全删必要时用o新建空白MBR分区表再走n/w流程。如果你发现删除分区时系统一直提示失败先确认有没有系统进程还开着这个设备lsof /dev/sdb能查出来。4. 挂载验证与问题排查格式化完不等于万事大吉4.1 挂载、测速与文件系统校验格式化完成后别急着拔卡先挂载验证一遍sudo mkdir -p /mnt/sdcard sudo mount /dev/sdb1 /mnt/sdcard df -h /mnt/sdcard看到容量和已用空间正常就说明文件系统没有创建错误。之后可以随手做一个读写测试我用dd大法sudo dd if/dev/zero of/mnt/sdcard/test.bin bs1M count64 convfdatasync sync sudo dd if/mnt/sdcard/test.bin of/dev/null bs1M count64第一段测写入速度第二段测读取速度。数值低于标称速度不代表一定坏了但会比预期差很多就需要怀疑卡的质量。测完把临时文件删掉。再教一个文件系统自检命令。卸载分区后执行sudo umount /mnt/sdcard sudo fsck.vfat -v /dev/sdb1如果返回clean说明文件系统各项结构正常。这一步对长期使用的卡很有用因为嵌入式设备经常直接断电FAT32的目录结构很容易出现交叉链接或丢失簇定期扫一遍能提前发现隐患。4.2 常见问题速查表现象常见原因解决办法格式化时报device busy分区还在挂载umount所有分区再试插到相机不识别分区表或文件系统不对确认MBRFAT32卡变成只读写保护锁/寿命到期/卡受损拨锁、换读卡器、查坏块容量小于标称厂商换算差异正常现象不必担心把U盘当成SD卡格式化设备认错格式化前lsblk核对容量分区表没生效仍在读取内核缓存旧表重新插拔或partprobe把U盘当成SD卡格式化这条是我见过最惨烈的翻车现场。某个朋友拿着读卡器想格式化一张小卡结果系统里同时挂着U盘两个设备都是/dev/sdb大小的样子一个没看清直接mkfs.vfat /dev/sdb1把U盘清了。所以不管多急lsblk看一眼容量和型号再动手永远值得。还有坏块问题。如果频繁出现格式化成功但写入时报I/O错误用badblocks -w对整卡做一遍破坏性扫描。注意这个命令会清空所有数据必须在格式化之前跑。SD卡是有寿命的大量视频监控或者频繁覆写会让坏块提前出现这种卡直接换新修不好。4.3 保留分区表的备份习惯最后分享两个我坚持了很久的习惯。第一个是分区表备份。分区表本身不大却在整张卡的结构中举足轻重我每次分好区都会顺手执行sudo sfdisk -d /dev/sdb sdb_partition_backup.txt把分区布局保存成纯文本。以后只要用sudo sfdisk /dev/sdb sdb_partition_backup.txt就能原样恢复分区结构这对折腾启动卡的人特别有用因为很多发行版引导分区号错一位就起不来。恢复分区表之后再格式化指定分区数据虽然回不来但整个卡的布局不用重新费脑子想。第二个习惯是把关键操作留在有屏幕的地方做。很多开发板只有串口跑fdisk时手滑按错键就是不可逆的。我的做法是将卡插到电脑上操作分好区、写好文件系统再插回开发板。这样就算命令行打错了还有很大概率能救回来。我个人在这些年里用fdisk处理过很多张SD卡踩过的坑写满了半本笔记。最深的体会是命令本身不难难的是每次都确认“这次动手的对象没有弄错”。格式化一张卡可能只要几分钟但动手之前多想三十秒能帮你省下后面整晚的数据恢复时间。这套流程我到现在依旧在用它也一直没有让我失望。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑