之前的文章介绍了4B设置USB启动的方法和系统迁移到USB设备的方法,主要思路就是生成当前系统的最小备份镜像然后将镜像刷入USB设备,这样做对于U盘这样的设备还是很好的,但是对于大容量的移动硬盘是不适用的,镜像刷入硬盘后,之前的分区和数据都会被覆盖。这篇文章就讲一下如何在保留硬盘数据的情况下迁移树莓派系统。
数据无价,本教程的操作有一定的风险,开始前请备份重要数据!!!
本教程兼容官方系统、基地2.0系统、Ubuntu。
想让树莓派正常启动至少需要两个分区,一个FAT32分区,一个ext4分区(f2fs、btrfs也可以,看自己需要),FAT32分区存放BootLoader、内核、配置文件等,ext4分区为roofs挂载为根节点。我们现在要调整硬盘,把这两个分区规划出来,FAT32分区大小256M足够了多了没用,ext4分区看自己需求,建议16g以上。使用工具为DiskGenius。
打开DiskGenius,可以看到我这块硬盘目前有三个分区:
我的规划是留三个150G分区,剩下的用来迁移系统,这里注意一下,FAT32分区最好是整个磁盘第一个分区,ext4分区无所谓,所以这里调整第一个分区,在前面划出一部分空间备用,在第一分区上点击右键,选择调整分区大小
在弹出对话框中改变分区大小,让分区前出现空闲空间:
执行完之后的分区如下:
在空闲分区处新建一个NTFS分区并设置为主分区,然后保存更改:
我要迁移的系统是无桌面的,所以15G是完全够用的。
现在磁盘的调整已经完成,下面的操作在树莓派上进行,把要迁移的SD卡插到树莓派上启动,然后将调整好的硬盘插到USB接口上。
后面的操作都需要root权限,执行sudo -i切换到root用户:
#切换到root
sudo -i
#查看磁盘情况
lsblk
可以看到我的硬盘设备为sda,下面对sda进行分区操作,创建FAT32和ext4分区:
#使用cfdisk操作硬盘
#操作时根据具体情况将/dev/sda替换为自己的设备
cfdisk /dev/sda用上下方向键选择我们创建的15.8G的NTFS分区,用左右按键选择Delete操作,然后回车:

然后创建FAT32分区,用上下方向键选择调整出来的Free space,用左右按键选择New操作,然后回车:

输入分区大小:256M,回车,然后上下键选择刚创建的分区,左右键选择Type操作,回车,选择类型c,回车:



然后创建ext4分区,用上下方向键选择Free space,用左右按键选择New操作,回车,使用默认大小,回车:

然后用左右按键选择Write操作,弹出提示输入yes,回车后按q退出:

磁盘的准备工作已经完成了,现在开始迁移系统。
先执行lsblk查看我们新建的分区:
从输出我们可以看出两个分区分区别为sda1(FAT32)和sda3(ext4),现在开始格式化分区:
#更新源
apt update
#安装需要的软件
apt install -y dosfstools rsync
#格式化FAT32分区
#根据实际情况替换/dev/sda1为自己的设备
mkfs.vfat -F 32 -n `dosfslabel /dev/mmcblk0p1 | tail -n 1` /dev/sda1
#格式化ext4分区
#根据实际情况替换/dev/sda3为自己的设备
mkfs.ext4 /dev/sda3
e2label /dev/sda3 `e2label /dev/mmcblk0p2 | tail -n 1`现在迁移boot分区:
#挂载sda1到/mnt/
#根据实际情况替换/dev/sda1为自己的设备
mount /dev/sda1 /mnt/
#拷贝boot分区文件
cp -rf `findmnt -n /dev/mmcblk0p1 | awk '{print $1}'`/* /mnt/拷贝完boot分区文件后,要替换cmdline.txt中的PARTUUID:
执行blkid,找到sda3的PARTUUID(根据自己情况确定PARTUUID)

编辑/mnt/cmdline.txt文件,将root=PARTUUID=xxx中的xxx替换自己的执行结果,我的修改结果为root=PARTUUID=a8bf0107-03。如果是ubuntu系统,这步可以忽略。
同步根分区:
cd
#同步磁盘
sync
#反挂载/mnt
umount /mnt
#挂载sda3到/mnt/
#根据实际情况替换/dev/sda3为自己的设备
mount /dev/sda3 /mnt/具体的同步工作需要写一个脚本来操作,创建文件syncrootfs.sh,内容如下:
#!/bin/bash
boot_mnt=`findmnt -n /dev/mmcblk0p1 | awk '{print $1}'`
rsync --force -rltWDEgop --delete --stats --progress \
--exclude ".gvfs" \
--exclude "$boot_mnt" \
--exclude "/dev" \
--exclude "/media" \
--exclude "/mnt" \
--exclude "/proc" \
--exclude "/run" \
--exclude "/snap" \
--exclude "/sys" \
--exclude "/tmp" \
--exclude "lost\+found" \
/ /mnt
if [ ! -d $boot_mnt ]; then
mkdir $boot_mnt
fi
if [ -d /snap ]; then
mkdir /mnt/snap
fi
for i in boot dev media mnt proc run sys boot; do
if [ ! -d /mnt/$i ]; then
mkdir /mnt/$i
fi
done
if [ ! -d /mnt/tmp ]; then
mkdir /mnt/tmp
chmod a+w /mnt/tmp
fi
sync执行文件bash syncrootfs.sh,脚本会花费一定的时间,具体时间看迁移系统的大小,执行成功后如下图:
替换fstab文件中的PARTUUID,编辑/mnt/etc/fstab文件,将/boot和/对应的PARTUUID修改为sda1和sda3对应的PARTUUID。如果是ubuntu系统,这步可以忽略。
执行blkid:
我修改后的结果为:
把改变同步到磁盘中:
cd
#同步磁盘
sync
#反挂载/mnt
umount /mnt把硬盘插到电脑上,替换最新BootLoader,地址:https://github.com/Hexxeh/rpi-firmware,下载zip包,解压后把里面的fixup*.dat和star*.elf文件拷贝到硬盘256M的FAT32分区替换原文件。
取下树莓派的SD卡,插上移动硬盘,上电。
启动后查看磁盘信息lsblk:
如果希望数据盘自动挂载,自行修改/etc/fstab文件,这里不做说明。
本文为原创文章,版权归 Kevin's Blog 所有,转载请联系博主获得授权。