1. 项目概述
作为一名长期使用树莓派进行各种开发项目的工程师,我经常遇到存储空间不足的问题。特别是当你在树莓派上运行数据库、Docker容器或者进行机器学习实验时,32GB的存储卡很快就会捉襟见肘。今天我要分享的是如何将树莓派5的系统从一张32GB的SD卡完整迁移到128GB的新卡上,并正确扩展文件系统以利用全部空间。
这个操作看似简单,但其中有很多细节需要注意。我曾经在第一次尝试时因为没有正确卸载挂载点导致数据损坏,也遇到过因为块大小设置不当导致克隆过程异常缓慢的情况。通过多次实践,我总结出了一套可靠的操作流程和注意事项,能够确保系统迁移过程安全高效。
2. 准备工作与环境检查
2.1 硬件准备
首先,你需要准备以下硬件:
- 树莓派5(其他型号也适用此方法)
- 原系统SD卡(示例中为32GB)
- 新的大容量SD卡(示例中为128GB)
- USB读卡器(用于连接新卡)
- 可靠的电源供应
- 网络连接(建议使用有线网络)
注意:新卡的容量必须大于或等于原卡的实际使用量,但可以大于原卡的总容量。也就是说,32GB卡可以克隆到64GB、128GB甚至更大的卡上,但不能克隆到16GB的卡上。
2.2 系统环境检查
在开始操作前,我们需要确认当前的存储设备状态。通过SSH连接到树莓派后,执行以下命令:
bash复制lsblk
这个命令会列出所有块设备的信息。在我的案例中,输出如下:
code复制NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 2G 0 loop
sda 8:0 1 116.5G 0 disk
└─sda1 8:1 1 116.5G 0 part /media/mzh/Lenovo
mmcblk0 179:0 0 29.3G 0 disk
├─mmcblk0p1 179:1 0 512M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 28.8G 0 part /
zram0 254:0 0 2G 0 disk [SWAP]
这里的关键信息:
mmcblk0是原系统SD卡,总容量29.3GBsda是通过USB连接的新SD卡,显示为116.5GBmmcblk0p2是系统根分区,挂载在/
3. 系统克隆过程详解
3.1 卸载新卡上的挂载点
在开始克隆前,必须确保新卡没有被挂载。从lsblk输出可以看到,我的新卡sda1被自动挂载到了/media/mzh/Lenovo。使用以下命令卸载:
bash复制sudo umount /dev/sda1
再次运行lsblk确认sda1的MOUNTPOINTS栏位为空:
code复制NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 1 116.5G 0 disk
└─sda1 8:1 1 116.5G 0 part
重要提示:如果跳过这一步直接克隆,可能会导致数据不一致或文件系统损坏。我曾经因为忽略这个步骤导致新卡无法启动,不得不重新开始整个过程。
3.2 使用dd命令进行克隆
核心克隆命令如下:
bash复制sudo dd if=/dev/mmcblk0 of=/dev/sda bs=4M status=progress conv=fsync
让我们分解这个命令的每个参数:
if=/dev/mmcblk0:输入文件,指定源设备(原系统卡)of=/dev/sda:输出文件,指定目标设备(新卡)bs=4M:块大小设置为4MB,这个值对克隆速度影响很大status=progress:显示实时进度信息conv=fsync:确保数据完全写入物理存储介质
关于块大小的选择:
- 默认
bs=512字节,速度极慢 bs=1M是常见选择,速度适中bs=4M在我的测试中表现最佳,但需要系统支持- 过大的值(如
bs=64M)可能导致缓冲区问题
在我的树莓派5上,使用bs=4M克隆32GB卡大约需要12-15分钟,而使用默认设置可能需要1小时以上。
3.3 克隆过程中的注意事项
-
保持电源稳定:克隆过程中断电可能导致两卡俱毁。建议使用优质电源,最好连接UPS。
-
避免其他操作:克隆期间不要运行其他占用I/O的程序,也不要断开SSH连接。
-
进度监控:
status=progress会显示进度,但如果你担心SSH超时,可以使用screen或tmux会话。 -
验证克隆结果:克隆完成后,可以运行
sync命令确保所有数据写入磁盘。
4. 更换SD卡与启动
克隆完成后,执行安全关机:
bash复制sudo poweroff
等待树莓派完全关机(所有LED灯熄灭),然后:
- 拔出原32GB SD卡
- 将新克隆的128GB卡从USB读卡器取出
- 将128GB卡插入树莓派的SD卡槽
- 重新上电启动
常见问题:如果启动后指示灯是红色而非绿色,可能是克隆不完整或卡接触不良。尝试用牙签轻按reset按钮2秒钟,如果指示灯变绿,系统应该能正常启动。
5. 扩展文件系统
5.1 为什么需要扩展文件系统
虽然我们已经将整个SD卡克隆到了更大的卡上,但文件系统仍然保持着原来的大小。这是因为:
- 克隆是逐扇区复制,包括分区表
- 原32GB卡的分区结构被完整复制到了128GB卡上
- 文件系统并不知道底层设备已经变大
使用df -h命令查看,你会发现根分区仍然显示为约28.8GB:
code复制Filesystem Size Used Avail Use% Mounted on
/dev/mmcblk0p2 29G 12G 16G 45% /
5.2 使用raspi-config扩展分区
树莓派提供了便捷的工具来扩展根分区:
bash复制sudo raspi-config nonint do_expand_rootfs
这个命令会:
- 检查根分区是否是最后一个分区
- 调整分区表以使用所有可用空间
- 不修改文件系统本身
5.3 调整文件系统大小
分区扩展后,还需要调整文件系统以使用新的空间:
bash复制sudo resize2fs /dev/mmcblk0p2
resize2fs命令会:
- 检测分区的新大小
- 在线调整ext4文件系统的大小
- 不需要卸载文件系统
5.4 验证扩展结果
最后,重启树莓派使更改生效:
bash复制sudo reboot
重启后,再次运行df -h,你应该能看到根分区已经扩展到接近128GB卡的实际可用空间(约110GB+):
code复制Filesystem Size Used Avail Use% Mounted on
/dev/mmcblk0p2 115G 12G 98G 11% /
6. 常见问题与解决方案
6.1 克隆速度异常缓慢
可能原因:
- 块大小设置不当
- USB读卡器或SD卡质量差
- 系统资源被其他进程占用
解决方案:
- 尝试不同的
bs值(1M, 2M, 4M) - 更换高质量的USB 3.0读卡器
- 使用
iotop检查是否有其他I/O密集型进程
6.2 新卡无法启动
可能原因:
- 克隆过程被中断
- 启动分区损坏
- 卡兼容性问题
解决方案:
- 重新执行完整克隆流程
- 检查
/boot/firmware分区内容 - 尝试不同品牌的SD卡
6.3 扩展分区后空间未增加
可能原因:
raspi-config命令未成功执行- 分区不是最后一个分区
- 文件系统类型不支持在线调整
解决方案:
- 手动使用
fdisk删除并重建分区 - 确保要扩展的分区是磁盘上的最后一个分区
- 对于非ext4文件系统,可能需要使用特定工具
7. 进阶技巧与优化建议
7.1 使用pv命令显示进度
如果你觉得dd的进度信息不够详细,可以结合pv命令:
bash复制sudo apt install pv
sudo pv -tpreb /dev/mmcblk0 | sudo dd of=/dev/sda bs=4M conv=fsync
这会显示:
- 已用时间
- 进度百分比
- 传输速率
- 预计剩余时间
7.2 克隆前检查磁盘健康状态
在克隆前检查原卡的SMART状态:
bash复制sudo apt install smartmontools
sudo smartctl -a /dev/mmcblk0
关注Media_Wearout_Indicator和Percent_Lifetime_Used等指标,确保原卡状态良好。
7.3 定期备份重要数据
虽然克隆可以创建完整的系统副本,但建议:
- 对重要数据使用
rsync进行增量备份 - 考虑使用
borgbackup等去重备份工具 - 将配置文件存储在版本控制系统(如git)中
7.4 性能优化建议
- 使用A2级别的SD卡获得更好的随机读写性能
- 考虑将频繁写入的目录(如
/var/log)挂载到tmpfs - 对于数据库应用,可以使用USB 3.0 SSD代替SD卡
通过以上步骤,你应该已经成功将树莓派系统迁移到了更大容量的SD卡上。这个过程虽然看起来有些技术性,但只要按照步骤小心操作,就能避免数据丢失和系统损坏的风险。我在多个树莓派项目中使用这个方法进行系统迁移,从未遇到过问题。