Loading... <div class="tip share">请注意,本文编写于 1071 天前,最后修改于 424 天前,其中某些信息可能已经过时。</div> 之前的文章介绍了4B设置USB启动的方法和系统迁移到USB设备的方法,主要思路就是生成当前系统的最小备份镜像然后将镜像刷入USB设备,这样做对于U盘这样的设备还是很好的,但是对于大容量的移动硬盘是不适用的,镜像刷入硬盘后,之前的分区和数据都会被覆盖。这篇文章就讲一下如何在保留硬盘数据的情况下迁移树莓派系统。 > 数据无价,本教程的操作有一定的风险,开始前请备份重要数据!!! 本教程兼容官方系统、基地2.0系统、Ubuntu。 这篇文章只讲系统迁移,USB启动设置请参考**[这里](/21.html)** 或者**[这里](/17.html)** 。 想让树莓派正常启动至少需要两个分区,一个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`文件,这里不做说明。 本文转载至 [南寒天一](https://linuxer.top/archives/raspi-usb-disk-boot.html) 最后修改:2022 年 04 月 04 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏