之前的文章介绍了4B设置USB启动的方法和系统迁移到USB设备的方法,主要思路就是生成当前系统的最小备份镜像然后将镜像刷入USB设备,这样做对于U盘这样的设备还是很好的,但是对于大容量的移动硬盘是不适用的,镜像刷入硬盘后,之前的分区和数据都会被覆盖。这篇文章就讲一下如何在保留硬盘数据的情况下迁移树莓派系统。

数据无价,本教程的操作有一定的风险,开始前请备份重要数据!!!

本教程兼容官方系统、基地2.0系统、Ubuntu。

这篇文章只讲系统迁移,USB启动设置请参考这里或者这里

想让树莓派正常启动至少需要两个分区,一个FAT32分区,一个ext4分区(f2fs、btrfs也可以,看自己需要),FAT32分区存放BootLoader内核配置文件等,ext4分区为roofs挂载为根节点。我们现在要调整硬盘,把这两个分区规划出来,FAT32分区大小256M足够了多了没用,ext4分区看自己需求,建议16g以上。使用工具为DiskGenius。

打开DiskGenius,可以看到我这块硬盘目前有三个分区:
20200601120707.png

我的规划是留三个150G分区,剩下的用来迁移系统,这里注意一下,FAT32分区最好是整个磁盘第一个分区,ext4分区无所谓,所以这里调整第一个分区,在前面划出一部分空间备用,在第一分区上点击右键,选择调整分区大小
20200601121537.png

在弹出对话框中改变分区大小,让分区前出现空闲空间:
20200601121751.png

执行完之后的分区如下:
20200601122254.png

在空闲分区处新建一个NTFS分区并设置为主分区,然后保存更改:
20200601141744.png

我要迁移的系统是无桌面的,所以15G是完全够用的。
现在磁盘的调整已经完成,下面的操作在树莓派上进行,把要迁移的SD卡插到树莓派上启动,然后将调整好的硬盘插到USB接口上。

后面的操作都需要root权限,执行sudo -i切换到root用户:

#切换到root
sudo -i

#查看磁盘情况
lsblk

20200601143115.png

可以看到我的硬盘设备为sda,下面对sda进行分区操作,创建FAT32和ext4分区:

#使用cfdisk操作硬盘
#操作时根据具体情况将/dev/sda替换为自己的设备
cfdisk /dev/sda

用上下方向键选择我们创建的15.8G的NTFS分区,用左右按键选择Delete操作,然后回车:

20200601143345.png

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

20200601143541.png

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

20200601143634.png
20200601143704.png
20200601143720.png

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

20200601143831.png

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

磁盘的准备工作已经完成了,现在开始迁移系统。

先执行lsblk查看我们新建的分区:
20200601144347.png

从输出我们可以看出两个分区分区别为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)

20200601144841.png

编辑/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,脚本会花费一定的时间,具体时间看迁移系统的大小,执行成功后如下图:
20200601150619.png

替换fstab文件中的PARTUUID,编辑/mnt/etc/fstab文件,将/boot/对应的PARTUUID修改为sda1sda3对应的PARTUUID如果是ubuntu系统,这步可以忽略

执行blkid
20200601151148.png

我修改后的结果为:
20200601151427.png

把改变同步到磁盘中:

cd

#同步磁盘
sync

#反挂载/mnt
umount /mnt

把硬盘插到电脑上,替换最新BootLoader,地址:https://github.com/Hexxeh/rpi-firmware,下载zip包,解压后把里面的fixup*.datstar*.elf文件拷贝到硬盘256M的FAT32分区替换原文件。

取下树莓派的SD卡,插上移动硬盘,上电。

启动后查看磁盘信息lsblk:
20200601152235.png

如果希望数据盘自动挂载,自行修改/etc/fstab文件,这里不做说明。

本文为原创文章,版权归 Kevin's Blog 所有,转载请联系博主获得授权。

©著作权归作者所有

发表评论