之前的文章介绍了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 所有,转载请联系博主获得授权。