资讯动态

Linux下SD卡分区实战:从fdisk到parted的完整指南

发布时间:2026/8/12 13:01:38 来源:尧图企业网站定制
1. 项目概述为什么要在Linux下分区SD卡如果你手头有一张SD卡无论是准备给树莓派做系统盘还是想把它格式化成多个分区来分别存放数据和备份在Linux系统下操作都是一个高效且透明的选择。与Windows下依赖图形化工具不同Linux的命令行工具提供了更精细的控制权你能清楚地知道每一个操作步骤背后的原理这对于嵌入式开发、服务器维护或者仅仅是学习Linux系统管理来说都是非常宝贵的实践经验。我遇到过很多新手面对fdisk、parted这些命令感到畏惧但其实一旦理解了磁盘、分区、文件系统这几个核心概念整个过程就像搭积木一样清晰。今天我就以一张32GB的SD卡为例带你走一遍从识别设备到完成分区的完整流程并分享一些我踩过坑才总结出来的实操技巧。2. 核心概念与工具选型解析在动手之前我们必须搞清楚几个关键概念这能帮你理解每一步在做什么而不是机械地输入命令。2.1 磁盘、分区与文件系统它们是什么关系你可以把整张SD卡想象成一块空地物理磁盘。直接在这块空地上盖房子存放文件是不现实的因为太混乱了。我们首先需要在这块空地上划分出几个有明确边界的小区分区。最后在每个小区里我们还要建立一套管理规则比如道路怎么修、门牌号怎么编这套规则就是文件系统如ext4, FAT32, NTFS。所以流程是物理磁盘 - 创建分区 - 在分区上创建文件系统。在Linux中一切皆文件磁盘设备也不例外。你的SD卡插入后通常会被识别为/dev/sdX如sdb,sdc或/dev/mmcblkX如mmcblk0。如何区分简单来说通过USB读卡器连接的SD卡通常是/dev/sdX格式而直接插入笔记本SD卡槽或某些嵌入式板载卡槽的可能是/dev/mmcblkX格式。这是第一个容易混淆的点。2.2 分区表类型MBR vs. GPT在划分小区分区之前我们还需要一张总规划图这张图就是分区表。它记录了分区的数量、大小和起始位置。主要有两种MBR (Master Boot Record)传统格式历史悠久兼容性极好。但有两个主要限制最多只支持4个主分区可以通过扩展分区和逻辑分区绕开但稍复杂单个分区最大支持2TB。GPT (GUID Partition Table)现代格式是UEFI启动的标配。它没有分区数量限制实际操作系统会有限制支持远超2TB的磁盘容量并且自带备份更安全可靠。对于SD卡如果你的用途是树莓派旧版通常使用MBR因为其Bootloader可能只认MBR。通用数据存储或现代UEFI设备优先选择GPT。容量小于2TB两者皆可但GPT是未来趋势。2.3 工具选择fdisk vs. partedLinux下最常用的两个分区工具是fdisk和parted。fdisk经典、交互式命令行工具。它简单直观通过问答式菜单进行操作非常适合初学者理解分区过程。但它对GPT的支持是后来加入的在某些老版本系统中可能不是默认选项需要使用gdisk命令处理GPT。parted更强大、支持非交互式脚本化操作的工具。它从一开始就原生支持MBR和GPT并且能处理更多高级功能如调整已有分区大小。它的命令语法更直接但学习曲线稍陡。我的建议是如果你是第一次操作从fdisk开始它能帮你建立清晰的概念。当你需要批量操作或处理复杂分区时再转向parted。本文将以fdisk针对GPT分区表和parted两种方式分别演示。重要警告分区操作会永久性擦除磁盘上的数据请务必在操作前通过lsblk或fdisk -l命令反复确认你操作的是正确的设备比如/dev/sdb而不是你的系统盘通常是/dev/sda。误操作会导致数据丢失无法轻易恢复。3. 完整实操流程从识别到挂载现在我们进入实战环节。请准备好你的SD卡和Linux环境可以是实体机、虚拟机或者通过SSH连接的远程服务器。3.1 第一步准确识别SD卡设备插入SD卡后打开终端。我们需要找到系统分配给SD卡的设备名。方法A使用lsblk命令推荐lsblk这个命令会以树状图列出所有块设备磁盘和分区。输出类似NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 732M 0 part /boot └─sda3 8:3 0 464.6G 0 part / sdb 8:16 1 29.7G 0 disk这里sda是我的系统硬盘下面有三个分区。sdb就是我刚插入的、29.7G的SD卡它目前还没有任何分区下面没有├─或└─开头的行。RM列为1表示是可移动设备这也能辅助判断。方法B使用fdisk -l命令需要sudo权限sudo fdisk -l这个命令会列出所有磁盘的详细信息。你需要在一堆输出中找到你的SD卡通常是通过容量来判断。例如Disk /dev/sdb: 29.7 GiB, 31914983424 bytes, 62333952 sectors Disk model: USB3.0 CRW -SD Units: sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x00000000这里明确指出了设备是/dev/sdb容量29.7GiB并且当前的分区表类型是dos即MBR。记录下你的SD卡设备名假设为/dev/sdb。接下来的所有操作都将基于这个设备名请务必根据你的实际情况替换3.2 第二步卸载已挂载的分区如果存在如果这张SD卡之前被使用过并且系统自动挂载了它的分区比如在文件管理器里打开了我们必须先卸载它否则分区工具无法修改它。# 首先检查SD卡是否有分区被挂载 lsblk /dev/sdb # 如果看到类似 sdb1 后面有 MOUNTPOINT比如 /media/username/XXX就需要卸载 # 卸载分区将 sdb1 替换为你的实际分区名 sudo umount /dev/sdb1 # 如果有多个分区如 sdb2, sdb3也需要逐一卸载 sudo umount /dev/sdb2确保所有相关分区都卸载成功后再进行下一步。3.3 第三步使用fdisk创建GPT分区方案一假设我们打算将这张32GB的SD卡分成两个区一个16GB的ext4分区用于Linux数据一个16GB的FAT32分区用于跨平台共享。启动fdisk并指定设备sudo fdisk /dev/sdb你会进入fdisk的交互式命令行提示符变为Command (m for help):。创建新的GPT分区表这会清除所有现有数据 输入g然后按回车。这会创建一个新的GPT磁盘标签分区表。终端会提示Created a new GPT disklabel (GUID: ...)。创建第一个分区16GB, ext4输入n创建新分区。分区号直接按回车接受默认值1。第一个扇区直接按回车接受默认值通常是2048为对齐留出空间。设置分区大小输入16G然后回车。这表示分区从起始位置向后延伸16GB。此时第一个分区创建完成。默认分区类型是“Linux filesystem”这正合我们意对应ext4。创建第二个分区剩余空间 FAT32再次输入n创建第二个分区。分区号、起始扇区都直接按回车接受默认值它会自动接在上一个分区之后。结束扇区直接按回车表示使用所有剩余空间。现在我们需要更改这个分区的类型。输入t然后回车。选择分区号2。输入分区类型代码L来列出所有已知类型代码。在列表中寻找“Microsoft basic data”或“W95 FAT32 (LBA)”其代码通常是b或c。我们输入c对应W95 FAT32 LBA。终端会提示Changed type of partition Linux filesystem to W95 FAT32 (LBA)。检查分区布局 输入p打印当前的分区表检查一下是否和你预期的一致。应该能看到两个分区sdb1和sdb2大小和类型正确。将更改写入磁盘关键一步 确认无误后输入w然后回车将分区表写入磁盘并退出fdisk。这是一个不可逆的操作如果发现错了可以输入q不保存退出。3.4 第四步使用parted创建分区方案二如果你更喜欢parted的直接或者需要脚本化可以这样做启动partedsudo parted /dev/sdb创建GPT分区表mklabel gpt输入yes确认。创建第一个分区mkpart primary ext4 1MiB 16GiBprimary是分区类型主分区。ext4是文件系统类型parted会记录这个信息但实际格式化仍需单独进行。1MiB 16GiB是分区的起始和结束位置。这里强烈建议使用MiB/GiB为单位并从1MiB开始这能保证分区的最佳性能对齐。创建第二个分区mkpart primary fat32 16GiB 100%100%表示用到磁盘末尾。查看与退出print # 查看分区表 quit # 退出parted3.5 第五步在分区上创建文件系统格式化分区只是划好了地盘现在要给每个地盘建立管理规则文件系统。我们需要针对每个分区单独操作。格式化第一个分区为ext4sudo mkfs.ext4 /dev/sdb1命令会执行输出一些信息最后显示Writing superblocks and filesystem accounting information完成。格式化第二个分区为FAT32sudo mkfs.vfat -F 32 /dev/sdb2-F 32参数指定了FAT32格式。对于大于32GB的分区Windows的format命令可能不允许用FAT32但Linux的mkfs.vfat通常可以不过出于兼容性考虑大分区更推荐exFATsudo mkfs.exfat /dev/sdb2。3.6 第六步挂载并使用新分区格式化后分区就可以使用了。你可以手动挂载到任意目录。# 创建两个挂载点目录 sudo mkdir -p /mnt/data_ext4 sudo mkdir -p /mnt/data_fat32 # 挂载分区 sudo mount /dev/sdb1 /mnt/data_ext4 sudo mount /dev/sdb2 /mnt/data_fat32 # 检查挂载结果 df -h /dev/sdb1 /dev/sdb2现在你就可以通过/mnt/data_ext4和/mnt/data_fat32这两个目录来访问SD卡上的两个分区了。向里面复制文件试试吧。想让SD卡插入时自动挂载这需要修改/etc/fstab文件但考虑到SD卡可能在不同机器间插拔自动挂载配置容易因设备名/dev/sdb可能变成/dev/sdc变化而出错。更现代的方案是使用文件系统的UUID或LABEL来标识分区但这属于进阶内容初期建议手动挂载更安全。4. 高级技巧与深度解析掌握了基本流程后我们来看看一些能提升效率、避免问题的进阶知识。4.1 分区对齐为什么从1MiB开始在之前parted的示例中我特意让分区从1MiB开始而不是0扇区或1扇区。这叫做分区对齐。现代存储设备SSD、SD卡、高级格式硬盘的物理扇区大小通常是4KB4096字节。如果分区的起始位置不是4KB的整数倍那么一个文件系统逻辑块比如4KB可能会跨越两个物理扇区。当读写这个块时设备就需要进行两次操作严重降低性能这种现象称为“读写放大”。从1MiB1048576字节正好是4096的整数倍开始可以确保分区与绝大多数存储设备的物理结构对齐从而获得最佳性能。fdisk的新版本在创建GPT分区时默认起始扇区就是20482048扇区 * 512字节/扇区 1MiB已经帮我们做了对齐。4.2 使用UUID或LABEL挂载的稳定性在/etc/fstab中用/dev/sdb1这样的设备名来挂载是非常不可靠的因为设备名sda,sdb,sdc取决于系统检测到设备的顺序。今天你的SD卡是sdb明天插了个U盘可能就变成sdc了。更稳定的方法是使用UUID全局唯一标识符或LABEL卷标。查看分区的UUID和LABELsudo blkid /dev/sdb1 /dev/sdb2输出类似/dev/sdb1: UUIDa1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8 TYPEext4 /dev/sdb2: UUID1234-ABCD TYPEvfat在格式化时指定LABEL可选但推荐sudo mkfs.ext4 -L MyLinuxData /dev/sdb1 sudo mkfs.vfat -F 32 -n MySharedData /dev/sdb2之后在/etc/fstab中就可以这样写UUIDa1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8 /mnt/data_ext4 ext4 defaults 0 2 LABELMySharedData /mnt/data_fat32 vfat defaults,uid1000,gid1000,umask022 0 0这样无论设备名怎么变系统都能准确找到并挂载正确的分区。4.3 处理已分配全盘空间的分区表有时候你可能会遇到一种情况SD卡显示有一个分区占用了全部容量比如/dev/sdb1但你用fdisk删除这个分区并创建新分区表时可能会失败或报错。这通常是因为旧的分区信息还被内核缓存着。解决方法使用wipefs命令清除设备上的所有文件系统签名和分区表信息然后让内核重新读取。# 谨慎操作确认/dev/sdb是你的SD卡 sudo wipefs -a /dev/sdb # 然后通知内核重新读取分区表 sudo partprobe /dev/sdb # 或者更彻底地可以断开再重新连接SD卡硬件执行完wipefs后设备在lsblk里会显示为一个没有任何分区的纯净磁盘此时再使用fdisk或parted进行操作就会非常顺利。5. 常见问题与排查技巧实录即使按照步骤操作也可能会遇到各种问题。这里记录了几个我亲身经历过的“坑”及其解决办法。5.1 问题fdisk中看不到新建的分区或者lsblk不显示现象在fdisk里用w命令保存退出后立刻用lsblk查看发现分区如sdb1没有出现。原因内核没有及时更新内存中的分区表信息。解决运行sudo partprobe /dev/sdb命令通知内核重新读取/dev/sdb的分区表。如果还不行最彻底的方法是物理上重新拔插一次SD卡或者使用sudo udevadm trigger。5.2 问题无法格式化提示“Device or resource busy”现象运行mkfs命令时报错/dev/sdb1 is apparently in use by the system; will not make a filesystem here!。原因该分区正在被系统使用最常见的原因就是它被自动挂载了比如桌面环境文件管理器的自动挂载功能。解决使用lsblk或mount | grep sdb1确认分区是否被挂载。使用sudo umount /dev/sdb1卸载它。如果卸载失败检查是否有终端窗口的当前工作目录pwd正在该分区下或者是否有程序正在访问该分区内的文件。关闭这些程序或切换到其他目录。5.3 问题Windows无法识别Linux创建的分区现象在Linux下分好区并格式化的SD卡插到Windows电脑上只显示其中一个分区通常是FAT32那个或者提示需要格式化。原因文件系统不支持Windows默认不支持ext2/3/4文件系统。所以ext4分区在Windows下不可见是正常的。分区表问题如果你创建的是GPT分区表而你的Windows系统是较旧的Legacy BIOS模式可能无法正确识别。“隐藏”的ESP/MSR分区如果你不小心创建了EFI系统分区ESP或Microsoft保留分区MSRWindows可能会表现出奇怪的行为。解决对于需要在Windows和Linux间共享的数据请使用FAT32、exFAT或NTFS分区。确保SD卡的分区表类型MBR/GPT与目标设备兼容。对于最大兼容性老设备用MBR。在Linux下用sudo fdisk -l /dev/sdb仔细检查分区类型。确保数据分区的类型是“Microsoft basic data”代码0700in MBR 或EBD0A0A2-B9E5-4433-87C0-68B6B72699C7in GPT。5.4 问题分区后容量“缩水”了现象一张标称32GB的SD卡分区格式化后在文件管理器里显示只有29.7GB左右可用。原因这是完全正常的并非操作错误。厂商的“GB”是十进制1GB 10^9 bytes而操作系统的“GiB”是二进制1GiB 2^30 bytes。32,000,000,000 bytes ≈ 29.8 GiB。此外文件系统本身如ext4的inode表、日志区和分区表也会占用少量空间。解决无需解决这是预期行为。你可以通过df -h和sudo fdisk -l对比查看总容量基本是匹配的。5.5 快速问题排查清单问题现象可能原因排查命令/步骤找不到/dev/sdb设备SD卡未识别、接触不良、读卡器故障dmesg | tail查看内核日志重新插拔换读卡器或接口fdisk命令报错或无响应设备被锁定、有进程占用sudo lsof | grep /dev/sdb查看占用进程sudo umount卸载所有分区格式化速度极慢或报I/O错误SD卡物理损坏、寿命将至sudo badblocks -sv /dev/sdb检测坏块慎用会写数据写入文件时提示“只读文件系统”文件系统损坏、SD卡写保护开关打开检查SD卡侧面的物理锁尝试sudo fsck /dev/sdb1修复文件系统最后分享一个我自己的习惯在对任何存储设备进行分区操作前如果里面有重要数据我一定会先用dd或rsync做一次完整的磁盘或文件备份。命令看起来复杂但dd if/dev/sdb of~/sd_card_backup.img bs4M statusprogress这一行命令可能在某天会救你于水火。分区有风险操作需谨慎但一旦掌握了原理和工具你就能完全掌控这些存储介质让它们在你的项目中发挥最大效用。

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

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

免费获取报价