
1. 项目概述为什么要在Ubuntu下折腾SD卡分区如果你手头有一张SD卡无论是给树莓派装系统、给相机做存储扩容还是想把它变成一个多功能的便携Linux启动盘大概率都绕不开“分区”和“格式化”这两个操作。在Windows下我们习惯用图形化的“磁盘管理”点点鼠标但在Ubuntu这类Linux系统中命令行工具才是最高效、最强大的武器。很多新手第一次用fdisk或parted时面对一堆命令和参数可能会发怵生怕一个手滑就把重要数据给清了。其实只要理解了磁盘、分区、文件系统这几个核心概念之间的关系整个过程就会变得清晰可控。简单来说分区就像在一张白纸SD卡上画几个格子规定每个格子的用途格式化则是给每个格子选择一种“内部装修风格”文件系统比如EXT4、FAT32、NTFS让操作系统能识别并往里面存数据。在Ubuntu下做这件事不仅能让你对Linux的存储管理有更深的理解其灵活性和可脚本化的特点在处理批量SD卡或执行复杂分区方案时效率远超图形界面。接下来我会以一个32GB的SD卡为例带你从插入卡片开始一步步完成查看、分区、格式化、挂载使用的全过程并分享我这些年踩过的坑和总结的实用技巧。2. 核心工具与概念解析fdisk、parted与文件系统在动手之前我们得先搞清楚手里有哪些工具以及它们各自擅长什么。Ubuntu下管理磁盘分区最常用的两个命令行工具是fdisk和parted。2.1 fdisk经典的分区表操作器fdisk是一个历史悠久、功能强大的分区工具主要用于操作MBR主引导记录分区表。对于小于2TB的磁盘SD卡完全在此范围它是轻量且直接的选择。它的工作模式是交互式的你指定要操作的设备如/dev/sdb然后进入一个命令行界面通过输入单个字母命令如n创建新分区d删除分区p打印分区表来一步步操作。这种模式对于初学者理解分区过程很有帮助因为每一步都需要你确认。但它的缺点是对GPTGUID分区表的支持是后来才加入的操作上不如parted原生支持GPT来得流畅。注意使用fdisk或任何磁盘工具前绝对、务必、一定要用lsblk或fdisk -l命令确认你操作的设备名。误操作系统盘通常是/dev/sda会导致灾难性数据丢失。SD卡通常显示为/dev/sdb或/dev/mmcblk0具体取决于读卡器类型。2.2 parted更现代的全能分区编辑器parted是一个更现代的工具它从一开始就同时支持MBR和GPT分区表。对于创建GPT分区、处理大于2TB的磁盘或者需要执行更复杂操作如调整分区大小而不丢失数据尽管仍需谨慎parted是更好的选择。parted可以以交互模式运行也支持直接命令行操作这对于写脚本实现自动化非常友好。例如一条命令就能完成创建GPT分区表、划分分区、设置文件系统类型标签的操作。在接下来的实操中我会重点演示parted的使用因为它代表了更通用的方法。2.3 文件系统选择EXT4、FAT32还是其他分区划好了你得决定每个分区用什么文件系统。这就像给房间铺地板不同的材料适合不同的用途FAT32 / exFAT兼容性之王。几乎所有的相机、车载音响、电视、Windows和macOS都能直接读写。FAT32有单个文件不能大于4GB的限制而exFAT解决了这个问题。如果你要做的是一个跨平台的数据交换盘选它们准没错。EXT4Linux的“原生”文件系统。性能、稳定性和功能如日志记录、权限管理都很好。如果你这个SD卡是专门给树莓派或其他Linux设备做系统盘或固定存储EXT4是最佳选择。但Windows和macOS默认无法直接读写EXT4需要安装第三方驱动。NTFSWindows的原生文件系统。在Linux下读写需要ntfs-3g驱动Ubuntu通常已预装。如果你需要在Linux和Windows之间频繁传输大文件且SD卡主要在Windows下使用可以考虑。对于本次演示我计划创建一个混合用途的SD卡一个小的FAT32格式的boot分区用于树莓派启动或存放UEFI引导文件剩余大部分空间作为一个EXT4格式的rootfs分区用于安装Linux系统或存放数据。这是一个非常经典且实用的分区方案。3. 实操全流程从识别设备到挂载使用现在我们进入实战环节。请准备好你的SD卡和读卡器并将其插入电脑。3.1 第一步准确识别SD卡设备插入SD卡后打开终端。我们首先需要找到系统分配给SD卡的设备标识符。方法一使用lsblk命令推荐lsblk这个命令会以树状图列出所有块设备。输出结果清晰易懂你可以看到设备名如sdb、大小以及其下的分区如sdb1。刚插入的、未分区的SD卡通常只显示一个设备条目没有子分区。请仔细核对容量确认哪一个是你的SD卡。例如输出可能是NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS ... sdb 8:16 1 29.7G 0 disk这里/dev/sdb就是我的32GB SD卡显示29.7G是厂商容量计算方式不同。方法二使用fdisk -l命令sudo fdisk -l这个命令需要sudo权限会列出更详细的信息包括磁盘标签类型、扇区大小等。在列表末尾你可以找到你的SD卡信息。同样通过容量来识别。重要核对在执行任何分区操作前再次确认设备名。你可以通过拔插SD卡对比lsblk命令执行前后的输出变化来100%确定设备名。假设我们确认SD卡是/dev/sdb。3.2 第二步使用parted进行分区我们将使用parted来创建GPT分区表并划分两个分区。启动parted并指定设备sudo parted /dev/sdb你会进入(parted)提示符。创建新的GPT分区表这会清除所有现有数据(parted) mklabel gpt输入yes确认。这一步相当于给SD卡一张空白的“分区规划图”GPT格式。创建第一个分区Boot分区 我们创建一个512MB的FAT32分区作为启动分区。(parted) mkpart primary fat32 1MiB 513MiBmkpart创建分区命令。primary分区类型为主分区GPT下其实没有主/逻辑分区之分但这里仍用primary。fat32设置文件系统类型为FAT32parted会据此设置分区标识符。1MiB 513MiB分区的起始和结束位置。这里有个关键技巧从1MiB1048576字节开始而不是0扇区或1MB开始。这是为了满足现代磁盘的“对齐”要求可以显著提升读写性能尤其是对SD卡这类闪存设备。结束位置起始大小513MiB - 1MiB 512MiB。创建第二个分区根文件系统分区 使用剩余的所有空间创建一个EXT4分区。(parted) mkpart primary ext4 513MiB 100%513MiB紧接上一个分区结束的位置。100%使用到磁盘的100%即剩余所有空间。查看分区结果并退出(parted) print确认分区表信息无误。你应该能看到两个分区例如/dev/sdb1和/dev/sdb2。(parted) quit退出parted。3.3 第三步格式化分区创建分区只是画好了格子现在要给每个格子“装修”。我们需要针对每个分区使用特定的mkfsmake filesystem命令。格式化Boot分区为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”。实操心得格式化命令执行速度很快。对于EXT4系统可能会提示“包含一个文件系统”等警告因为这是一个新创建的分区直接输入y确认即可。给分区起一个有意义的卷标是个好习惯尤其在同时管理多块磁盘时。3.4 第四步挂载与验证格式化完成后我们需要把分区挂载到系统的目录树上才能像普通文件夹一样访问它。创建挂载点 挂载点其实就是两个空目录。mkdir -p ~/sd_boot ~/sd_root挂载分区sudo mount /dev/sdb1 ~/sd_boot sudo mount /dev/sdb2 ~/sd_root验证挂载与读写使用df -h命令查看挂载情况确认/dev/sdb1和/dev/sdb2分别挂载到了你创建的目录。你可以通过文件管理器如Nautilus直接访问~/sd_boot和~/sd_root文件夹。尝试在里面创建、删除一个测试文件确保读写正常。touch ~/sd_boot/test.txt echo Hello from Boot ~/sd_root/hello.txt ls -lh ~/sd_boot/ ~/sd_root/卸载分区操作完成后 在安全移除SD卡前必须先卸载分区。sudo umount ~/sd_boot ~/sd_root或者直接弹出SD卡设备。4. 进阶技巧与深度解析掌握了基本流程后我们来看看一些更深入的操作和原理这能帮你应对更复杂的需求。4.1 分区对齐的奥秘与性能影响前面提到从1MiB开始分区这不仅仅是parted的默认推荐而是有深刻的硬件原因。现代存储设备SSD、SD卡、HDD的4K高级格式的物理读写单元页/块通常是4KB、8KB甚至更大。文件系统也有自己的块大小如4KB。如果分区的起始位置没有对齐到这些物理单元的边界一个简单的文件系统写操作就可能需要访问两个物理单元导致额外的读写开销这就是所谓的“不对齐”。这会显著降低性能并增加闪存设备的磨损。1MiB1048576字节是4KB、8KB、1MB等常见扇区/块大小的整数倍是一个安全的对齐边界。在parted中使用MiB、GiB这样的二进制单位IEC标准能确保计算出的位置是精确的。而MB、GB十进制单位在转换时可能产生无法对齐的小数。因此在分区时坚持使用MiB/GiB单位是保证最佳性能的一个简单而重要的习惯。4.2 使用fdisk进行MBR分区的详细步骤虽然GPT更现代但某些老旧设备如一些嵌入式开发板可能只支持MBR启动。用fdisk创建MBR分区的过程略有不同启动fdisksudo fdisk /dev/sdb输入o创建新的MBRDOS分区表会清空数据。输入n创建新分区选择p主分区分区号1起始扇区直接回车用默认通常是2048这个值也是对齐的然后输入512M作为大小。输入t更改分区类型选择分区1输入c将类型设置为W95 FAT32 (LBA)。再次输入n创建第二个分区选择p分区号2起始扇区回车用默认结束扇区也回车用默认使用所有剩余空间。输入p打印预览分区表。确认无误后输入w将更改写入磁盘并退出。之后同样需要使用mkfs.vfat和mkfs.ext4来格式化分区。可以看到fdisk的交互过程更琐碎对分区类型的设置也更为隐晦需要查类型代码。4.3 自动化脚本一键完成分区格式化如果你需要频繁地准备多张相同规格的SD卡比如为一批树莓派部署系统手动操作效率太低。我们可以将上述parted和mkfs命令写成一个Shell脚本。#!/bin/bash # 一键分区格式化SD卡脚本 (请谨慎使用务必确认设备名) # 使用方法sudo ./setup_sd.sh /dev/sdX DEVICE$1 if [ -z $DEVICE ]; then echo 错误请指定设备名例如 /dev/sdb exit 1 fi echo 警告此操作将完全清除设备 $DEVICE 上的所有数据 read -p 确认继续吗(输入大写的YES): CONFIRM if [ $CONFIRM ! YES ]; then echo 操作已取消。 exit 0 fi # 使用parted非交互模式操作 sudo parted -s $DEVICE mklabel gpt sudo parted -s $DEVICE mkpart primary fat32 1MiB 513MiB sudo parted -s $DEVICE mkpart primary ext4 513MiB 100% # 格式化 sudo mkfs.vfat -F 32 -n BOOT ${DEVICE}1 sudo mkfs.ext4 -L ROOTFS ${DEVICE}2 echo 分区与格式化完成 echo Boot分区: ${DEVICE}1 (FAT32, 卷标BOOT) echo 根分区: ${DEVICE}2 (EXT4, 卷标ROOTFS)将上述内容保存为setup_sd.sh赋予执行权限(chmod x setup_sd.sh)然后以sudo ./setup_sd.sh /dev/sdb方式运行。再次强调运行前双倍确认设备名5. 常见问题排查与数据恢复锦囊即使再小心操作磁盘也难免遇到问题。这里记录了几个我亲身经历过的典型场景和解决方法。5.1 问题一设备忙或资源正忙无法卸载/分区现象执行umount或parted时提示umount: /mount/point: target is busy或Error: Partition(s) on /dev/sdb are being used.原因与解决这意味着有进程正在访问该分区上的文件。可能是你终端当前工作目录就在挂载点里或者有文件管理器窗口正打开着它。首先离开挂载点目录cd ~关闭所有可能访问该分区的文件管理器窗口。如果还不行使用lsof命令查找并结束相关进程sudo lsof f -- /dev/sdb1 # 查找谁在使用/dev/sdb1 # 或者查找挂载点 sudo lsof ~/sd_boot找到进程ID后可以用kill -9 PID结束它或者更优雅地关闭相关程序。使用fuser命令强制卸载sudo fuser -km ~/sd_boot # -k 杀死访问该挂载点的进程-m 指定挂载点 sudo umount ~/sd_boot5.2 问题二分区后系统不识别或显示错误容量现象在Ubuntu下分区格式化正常但将SD卡插入其他设备如相机、Windows电脑后提示需要格式化或只显示部分容量。排查思路分区表类型不兼容某些老设备只认MBR分区表。如果你用了GPT就会无法识别。解决方案是用fdisk创建MBR分区表并重新分区。文件系统类型不兼容例如在Linux下格式化为EXT4的分区Windows自然不识别。确保数据交换分区使用FAT32/exFAT/NTFS。“隐藏”分区未删除有时SD卡里可能存在之前系统留下的多个分区但有些工具只显示了第一个。在Windows磁盘管理或Linux的gparted图形工具里查看确保所有旧分区都被删除再创建新分区。读卡器或SD卡兼容性问题尝试换一个读卡器或电脑USB口。劣质读卡器可能导致识别异常。5.3 问题三误操作导致数据丢失如何尝试恢复重要前提一旦发现误格式化或误删除立即停止一切写入操作不要往该SD卡里复制任何新文件因为新数据会覆盖旧数据的存储位置降低恢复成功率。恢复工具推荐testdisk这是命令行下的神器。它功能极其强大不仅可以恢复丢失的分区表这是最常见的误操作还能从分区中恢复被删除的文件。它通过扫描磁盘扇区来寻找残留的分区签名和文件系统结构。安装sudo apt install testdisk基本使用运行sudo testdisk /dev/sdb它会进入一个交互式菜单。选择磁盘分区表类型通常选Intel/PC for MBR或EFI GPT然后选择Analyse分析磁盘结构。如果找到丢失的分区可以将其Write写回分区表。photorec这是testdisk套件里的另一个工具专注于文件内容恢复 carving 。它不依赖文件系统而是通过识别文件头如JPEG、PDF、ZIP的特定字节来恢复文件。适合分区表严重损坏或格式化后的恢复但恢复的文件会丢失原始文件名和目录结构。恢复流程建议将受损的SD卡通过读卡器连接到电脑。使用dd或cat命令立即创建整个SD卡的磁盘映像到另一个安全的存储位置如电脑硬盘。这相当于给事故现场拍了张“快照”所有后续恢复操作都在这个映像文件上进行避免对原始SD卡的二次伤害。sudo dd if/dev/sdb of~/sd_card_backup.img bs4M statusprogress对映像文件sd_card_backup.img使用testdisk进行分区恢复尝试。如果分区恢复失败再对映像文件使用photorec进行文件内容恢复。数据恢复的成功率取决于数据被覆盖的程度。因此预防远胜于治疗。在执行sudo parted mklabel或sudo fdisk /dev/sdX然后输入d删除分区前养成条件反射般的确认习惯设备名对吗数据备份了吗5.4 问题速查表问题现象可能原因排查与解决步骤fdisk -l看不到SD卡物理连接问题读卡器故障卡锁1. 重新插拔SD卡和读卡器。2. 检查SD卡侧面的写保护锁是否在“解锁”位置。3. 换一个USB口或读卡器试试。4. 使用dmesg | tail查看内核日志看是否有设备识别错误。无法格式化提示“设备忙”分区被挂载或有进程占用1.cd ~离开挂载目录。2. 关闭文件管理器。3. 使用sudo umount -l /dev/sdb1懒卸载或fuser -km终止进程后卸载。Windows提示“需要格式化”文件系统不被Windows支持如EXT4分区表损坏1. 在Linux下检查文件系统类型。2. 如需跨平台格式化为exFAT/NTFS。3. 使用testdisk检查并修复分区表。分区后容量“缩水”存在未删除的旧分区分区未占用所有空间1. 使用sudo parted /dev/sdb print查看所有分区。2. 使用sudo gparted图形工具删除所有分区后重新创建。读写速度异常慢分区未对齐SD卡本身速度慢或假卡1. 确保分区起始于1MiB边界。2. 使用hdparm -tT /dev/sdb测试磁盘读取速度。3. 怀疑是假卡可用f3probe、f3write/f3read工具检测真实容量。6. 工具链扩展与图形化替代方案虽然命令行是终极武器但Ubuntu也提供了优秀的图形化工具适合不想记忆命令的用户。GParted这是parted的图形前端功能非常全面。你可以通过软件中心安装(sudo apt install gparted)。在GParted中所有操作创建、删除、调整大小、格式化都可以通过鼠标点击完成并且它会将多个操作列为一个待执行队列直到你最终确认才会一次性写入磁盘安全性更高。对于调整已有分区大小这种复杂操作GParted的直观界面尤其有帮助。GNOME Disks (磁盘实用工具)Ubuntu自带。它更侧重于磁盘的整体管理、SMART状态检测、创建磁盘映像和恢复映像。它的分区操作界面相对GParted简单但对于基本的创建、格式化分区也足够了。它的优势是集成在系统设置中开箱即用。命令行辅助工具lsblk最清晰的块设备列表工具我的最爱。blkid显示块设备的属性如UUID、文件系统类型、卷标在配置/etc/fstab自动挂载时非常有用。df -h查看已挂载文件系统的磁盘空间使用情况。mount/umount挂载和卸载文件系统的基础命令。我个人在大多数情况下仍然首选命令行因为其步骤明确、可记录、可脚本化。但在向不熟悉命令行的同事演示或者进行有风险的调整分区大小操作时GParted的图形化预览和操作队列能提供多一重安心。整个流程走下来从最初的谨慎试探到后来的熟练操作核心在于理解每个命令背后的意图。分区格式化不再是黑盒魔法而是一次对存储设备结构的清晰规划。无论是为嵌入式项目准备系统盘还是制作一个跨平台的数据备份工具这套在Ubuntu下打磨SD卡的方法都能让你游刃有余。最关键的是永远保持对/dev/sdX那几个字符的敬畏操作前多看一眼就能避免99%的悲剧。