Ubuntu下SD卡分区格式化全攻略:从fdisk到parted实战指南 1. 项目概述为什么要在Ubuntu下折腾SD卡分区如果你手头有一张SD卡无论是准备给树莓派装系统、给相机扩容还是想把它变成一个便携的Linux启动盘大概率都绕不开“分区”和“格式化”这两个步骤。在Windows下我们习惯用图形化的“磁盘管理”点点鼠标就搞定但到了Ubuntu这类Linux系统里很多人就有点犯怵了面对命令行工具fdisk或parted感觉像是在拆解一个精密仪器生怕一步操作失误就把卡里的数据全弄丢了。我之所以写这篇东西是因为最近帮好几个朋友处理SD卡时发现他们要么是直接用dd命令烧录镜像导致卡容量“缩水”要么是想调整分区大小却无从下手。其实在Linux环境下管理SD卡分区一旦掌握了核心命令和背后的逻辑比图形界面更高效、更精准。这篇文章就是把我这些年踩过的坑、总结的经验用最直白的方式捋一遍。无论你是刚接触Ubuntu的新手还是想深入了解磁盘管理的开发者都能在这里找到可以直接“抄作业”的步骤和必须知道的“避坑指南”。我们将从最基础的识别SD卡设备开始一步步深入到使用fdisk进行分区、用mkfs进行格式化最后还会聊聊如何用parted处理大容量卡和调整分区大小这些进阶操作。放心我不会只扔给你一堆命令每个命令是干什么的、为什么这么用、按错了怎么办我都会讲清楚。2. 核心工具与概念解析认识你的“手术刀”在动手之前我们得先搞清楚要和谁打交道以及我们手里的工具都是干嘛的。在Linux中一切皆文件磁盘设备也不例外。2.1 存储设备在Linux中的标识当你把SD卡通过读卡器插入Ubuntu电脑后系统会把它识别为一个块设备并分配一个设备文件通常位于/dev/目录下。关键是如何从一堆设备中准确找到你的SD卡。设备命名规则对于通过USB接口连接的SD读卡器最常见的设备名是/dev/sdX其中X是一个小写字母如a,b,c等。系统会根据检测顺序分配字母。你的第一块内置硬盘可能是sda那么SD卡就可能是sdb或sdc。如何精准识别最可靠的方法是使用lsblk列出块设备命令。在插入SD卡前后各执行一次lsblk对比输出多出来的那个设备就是你的SD卡。这个命令会以树状结构显示设备、分区及其挂载点非常清晰。lsblk输出可能类似这样NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi └─sda2 8:2 0 465.3G 0 part / sdb 8:16 1 29.7G 0 disk └─sdb1 8:17 1 29.7G 0 part /media/user/MY_SD上面例子中sda是我的内置硬盘下面有两个分区。sdb就是我的SD卡它下面有一个分区sdb1并且被自动挂载到了/media/user/MY_SD。请务必记住你的SD卡设备名例如sdb后续所有危险操作都基于这个名称千万不能选错重要提示所有对/dev/sdX设备的操作都是直接对磁盘底层数据进行操作一旦执行格式化、删除分区等命令数据将立即丢失且难以恢复。操作前请务必双重确认设备标识并确保已备份重要数据。2.2 分区表类型MBR vs GPT就像一本书需要目录一样磁盘也需要一个“分区表”来记录各个分区的起止位置和类型。主流的有两种MBR传统的主引导记录。它历史悠久兼容性极好几乎所有系统都支持。但它有两个主要限制一是最多只支持4个主分区可以通过扩展分区和逻辑分区绕开二是无法管理超过2TB的磁盘。对于容量通常小于2TB的SD卡MBR完全够用也是很多嵌入式设备如树莓派的默认要求。GPTGUID分区表。这是现代标准没有MBR的那些限制支持几乎无限数量的分区能管理超大容量磁盘。如果你的SD卡容量很大比如1TB或者你希望使用更现代的分区方案GPT是更好的选择。对于SD卡我的个人建议是除非有特殊需求如容量大于2TB或需要非常多分区否则优先使用MBR。因为其兼容性最好特别是在各种单板计算机、相机、车载设备上GPT支持可能不完善。2.3 核心命令行工具介绍我们将主要使用两个工具经典的fdisk和更强大的parted。fdisk轻量级、交互式的分区工具。它简单直接适合大多数SD卡分区场景尤其是MBR分区表。它的操作是“对话式”的输入命令后需要等待它执行并给出新的提示符。对于新手我强烈建议从fdisk开始因为它每一步都会让你确认。parted功能更全支持MBR和GPT并且可以非交互式地执行命令写脚本更方便。它还能直接调整已有文件系统的大小需要文件系统本身支持如ext4。但它的交互模式对新手不那么友好。此外格式化工具我们主要用mkfs系列命令如mkfs.vfat创建FAT32分区、mkfs.ext4创建ext4分区等。3. 实战操作使用fdisk进行分区与格式化这是最经典、最常用的流程。我们假设你的SD卡设备是/dev/sdb并且这是一张全新的或者你已备份好数据、准备重新规划的卡。3.1 第一步卸载所有已挂载的分区在操作磁盘之前必须确保该磁盘上的所有分区都没有被系统使用即未挂载。如果前面lsblk命令显示有MOUNTPOINTS就需要卸载。sudo umount /dev/sdb1 sudo umount /dev/sdb2 # 如果有多个分区逐一卸载或者使用udisksctl更优雅地卸载udisksctl unmount -b /dev/sdb13.2 第二步启动fdisk并查看现状使用sudo权限启动fdisk操作你的SD卡sudo fdisk /dev/sdb你会进入fdisk的交互界面命令行提示符会变成Command (m for help):。首先输入p并回车打印当前的分区表。对于一张新卡或已清空的卡这里会显示“没有定义分区”。3.3 第三步创建新的分区表如果需要如果这是一张旧卡或者你想彻底改变分区方案比如从MBR换成GPT需要先创建新的分区表这会清除所有现有分区。在Command提示符下输入g并回车创建一个新的GPT分区表。或者输入o并回车创建一个新的MBRDOS分区表。创建完成后再次输入p查看应该显示为空。3.4 第四步创建新分区现在开始创建分区。假设我们创建两个分区一个512MB的FAT32启动分区sdb1和一个占用剩余空间的ext4根分区sdb2。输入n并回车开始新建分区。它会问分区类型。对于MBR主分区Primary和逻辑分区Logical的选择如果你分区数少于4个直接选主分区p即可。输入p并回车。分区号直接回车接受默认值1。第一个扇区直接回车从磁盘起始位置开始默认值。最后一个扇区这里可以指定大小。输入512M并回车表示创建一个大小为512MB的分区。这样第一个分区sdb1就创建好了。再次输入n创建第二个分区。分区类型选p主分区。分区号回车用默认的2。第一个扇区直接回车紧接上一个分区之后开始。最后一个扇区直接回车使用所有剩余空间。现在输入p查看你应该能看到两个分区的详细信息包括它们的起始结束位置、扇区数和ID。3.5 第五步设置分区类型可选但重要分区类型Partition type是一个十六进制代码用于标识这个分区的用途。虽然现代Linux不那么依赖它但一些引导程序或特定设备如树莓派会检查它。输入t并回车修改分区类型。选择分区号1。输入类型代码c对应W95 FAT32 (LBA)这是FAT32分区常用的类型。或者你也可以输入L来列出所有类型代码。选择分区号2。输入类型代码83对应Linux原生文件系统。3.6 第六步保存并退出仔细检查p命令打印的信息确认无误后输入w并回车将分区表写入磁盘并退出。这是一个不可逆的操作如果发现错了可以输入q不保存直接退出然后重新开始。退出fdisk后系统可能会提示你需要重新读取分区表。你可以使用partprobe /dev/sdb命令通知内核更新分区信息或者直接重启系统通常不需要。3.7 第七步格式化分区分区只是划好了“地盘”还需要在上面创建“文件系统”即格式化才能存储文件。格式化第一个分区FAT32sudo mkfs.vfat -F 32 -n BOOT /dev/sdb1-F 32指定FAT32格式。-n BOOT给这个分区设置一个卷标名字为“BOOT”方便识别。格式化第二个分区ext4sudo mkfs.ext4 -L ROOTFS /dev/sdb2-L ROOTFS设置卷标为“ROOTFS”。至此使用fdisk进行分区和格式化的核心流程就完成了。你可以用lsblk -f命令查看新分区的文件系统类型和标签。4. 进阶与排错应对复杂场景和常见问题掌握了基本流程我们来看看一些更复杂的情况和容易踩的坑。4.1 使用parted处理大容量卡与调整分区parted工具在处理GPT分区和调整已有分区大小时更有优势。它支持更直观的大小单位如GB, MB。使用parted创建GPT分区sudo parted /dev/sdb在(parted)提示符下mklabel gpt # 创建GPT分区表 mkpart primary fat32 1MiB 513MiB # 创建FAT32分区从1MB开始到513MB留出1MB对齐空间 set 1 boot on # 为第一个分区设置boot标志某些系统需要 mkpart primary ext4 513MiB 100% # 创建ext4分区用完剩余空间 print # 查看分区表 quit # 退出注意parted命令是立即生效的没有单独的“保存”步骤所以操作要更谨慎。调整分区大小危险操作 假设你想缩小sdb2ext4分区以腾出空间创建一个新分区。必须首先卸载分区并检查文件系统sudo umount /dev/sdb2 sudo e2fsck -f /dev/sdb2 # 强制检查ext4文件系统缩小文件系统本身这是关键必须在缩小分区空间之前做sudo resize2fs /dev/sdb2 15G # 将文件系统缩小到15GB假设目标大小使用parted缩小分区边界sudo parted /dev/sdb resizepart 2 16GB # 将第2个分区的结束位置设为16GB给文件系统留点余量 quit这个顺序不能错先缩小文件系统再缩小分区。反过来会导致数据丢失。扩大分区则顺序相反先扩大分区再扩大文件系统。4.2 常见问题与排查技巧实录问题1SD卡插入后无法识别lsblk里看不到。可能原因与排查读卡器或USB口问题换一个USB口或读卡器试试。有些老旧的读卡器对SDXC大容量卡支持不好。卡本身物理损坏尝试在其他电脑或设备上读取。分区表严重损坏系统可能将其识别为未知设备。可以尝试使用sudo fdisk -l或sudo parted -l查看所有设备有时会以“未知设备”列出。可以使用testdisk等工具尝试修复或恢复数据。问题2使用dd命令写入镜像后SD卡容量“变小”了。原因dd是逐扇区复制它会把镜像文件的分区表原封不动地写到SD卡上。如果镜像文件原本是4GB那么你的128GB的SD卡在系统看来也就只有4GB可用空间了。解决方案这就是我们需要学习分区的原因。写入镜像后你可以用fdisk或parted删除镜像后面的空白分区如果有的话然后创建一个新的分区或者直接扩展最后一个分区的大小如果它是ext4等可扩展的文件系统。更简单的方法是对于树莓派等系统很多官方镜像在首次启动时会自动调用raspi-config等工具扩展根分区。问题3格式化时提示“设备忙”或“找不到有效的文件系统超级块”。排查设备忙百分之九十九是因为分区还被挂载着。用lsblk确认并用umount彻底卸载。超级块错误这通常意味着这个分区之前被错误地格式化或者已经损坏。你可以尝试用sudo mkfs.ext4 -F /dev/sdb2-F强制创建来重新格式化。注意这会摧毁所有数据。问题4分区后Windows系统不识别SD卡。原因Windows默认只能识别MBR分区表上的第一个FAT/NTFS主分区。如果你在Linux下创建了多个分区或者把分区放在了扩展分区里Windows可能只显示第一个分区或者直接提示需要格式化。解决方案如果需要在Windows和Linux间共享SD卡最简单的方案是只创建一个使用MBR分区表的FAT32或exFAT分区。FAT32有单文件4GB的限制exFAT没有但兼容性稍差旧系统或设备可能不支持。问题5操作失误误删了分区或格式化了有数据的卡。紧急处理立即停止一切写入操作不要往卡里存任何新东西。使用数据恢复工具在Ubuntu上可以安装testdisk或photorec。testdisk擅长恢复分区表和被删除的分区photorec擅长按文件类型恢复文件。它们都是免费开源的强大工具。恢复过程将SD卡设为只读如果硬件支持或者连接到另一台电脑作为从盘进行恢复操作这是最安全的方式。我个人在实际操作中的体会是磁盘分区是个“细活儿”耐心和谨慎比什么都重要。每次执行w写入或parted的修改命令前深呼吸再核对一遍设备名和分区参数。对于重要数据盘的操作我习惯先在一个虚拟机的虚拟磁盘上演练一遍流程。另外给分区起一个有意义的卷标-n或-L参数是个好习惯在文件管理器里一目了然能有效避免混淆。最后记住那句老话备份、备份、再备份。在你敲下回车键之前确保数据已经安全地待在另一个地方。