如何克隆树莓派系统到较小的硬盘/SD卡上(如何分区、设置修复引导)

2024-03-02 08:04

本文主要是介绍如何克隆树莓派系统到较小的硬盘/SD卡上(如何分区、设置修复引导),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近有个老固态硬盘空下来了,虽然写入速度没那么快,但是足够满足千兆网络了,所以我就想把现在给树莓派使用的固态硬盘换下来。由于一些设置很浪费时间,所以我不打算重装系统。此外这个老固态是 120GB 的,要小于正在使用的固态硬盘(512GB),所以一些常见的复制硬盘的方法就不能使用了。

本文只需要使用树莓派,但是我是使用 SSH 访问树莓派的,所以截图会是 macOS 的样式。

在写完文章后,我自己又照着重新弄了一遍,确定没啥问题,但还是建议读者先对重要文件进行备份,以防万一。

为什么不使用dd或SD card copier

本文不会使用 CLI 程序dd或 GUI 应用程序 SD card copier。

不使用dd因为这些程序复制的时候,是把整个盘复制了,这就导致写入肯定会失败(目标盘小于目的盘)。而且速度很慢,就算尽量减少传输经过的控制器数量和提高传输接口,但是从固态写固态也就是 30~45MB/s(不优化的话就 15~20MB/s)。

但是SD card copier 没有这个问题。不使用 SD card copier 是因为我还要插 HDMI 的线,而且不适合平时备份等操作,所以想研究一下使用 CLI 的方式。如果你能使用桌面模式,那么推荐直接使用 SD card copier 应用程序。而且这种方法要快很多,速度能稳定在 50~70MB/s。

原理

本文的方法和 SD card copier 原理是一样的:先在目标硬盘上分两个区,启动区(名称为bootfs,格式为 Windows_FAT_32)和使用区(也被称为根区名称为rootfs,格式为 Linux),然后使用rsync复制,这样速度也快很多。

如果在树莓派上使用lsblk -f(这里只是为了演示,后面会介绍一个信息更详细的工具)查看硬盘的结构和文件系统可以看到:

请添加图片描述

如果你好奇树莓派的启动分区bootfs为啥不使用 ext4 文件系统,这是因为要求最小为 16 GiB,但是启动区占这么大有点离谱了。此外,使用 FAT32 这种在 Windows、Linux、macOS 上都可以读取的文件系统,也方便更改一些设置(树莓派可以通过修改启动区bootfs中的文件来修改一些配置的,比如 HDMI 级别等)。

由于启动需要,我们需要分区是按照“启动区-使用区”的顺序存在于硬盘上。所以我们需要先格式化出启动区,再将剩余部分格式化为使用区。

第一步:分区和新建文件系统

首先将两个盘连到树莓派上,记得将目标硬盘格式化成 Linux 可以识别的文件系统(Mac 上可以使用磁盘工具格式化为 exFAT,或者使用 Raspberry Pi Imager 将其格式化成 FAT32)。

接下来使用parted工具进行分区,倒不是因为可以进行交互操作,主要是可以显示更详细的分区信息,而且设置一些参数也更方便。

首先使用sudo parted -l命令当前连接的硬盘信息:

请添加图片描述

第一部分是系统盘,我们可以看到其中的每个分区的大小、起始地址、终止地址、文件系统等等信息。第二部分是我们的目标硬盘。

然后我们使用下面的命令在目标硬盘生成相似分区结构:

sudo parted /dev/sdb --script 'mklabel msdos mkpart primary fat32 4194.5kB 541MB mkpart primary ext4 541MB 120GB print quit'
  • /dev/sdb是目标盘的设备名称。不要使用/dev/sdb1,这是已存在的分区名称。
  • 使用--script则不会进入交互模式,这样一条命令即可完成操作。需要注意官方没有使用这个选项,但是如果按照上面的内容,不使用该选项,直接尾接后面的命令,那么会摧毁整个硬盘的分区(会有提示)。
  • mklabel msdos设置分区模式为 MBR 格式。这里不使用gpt是因为系统上就是msdos(从上图的Partition Table可以看到这个信息)。
  • mkpart primary fat32 4194.5kB 541MB 这部分是划分启动区的命令,primary表示是独立分区(或者称为“主分区”,对应的是“扩展分区”)。使用fat32文件系统,起始地址使用4194.5kB,因为树莓派启动是从第 8192 块开始的,但是parted显示的数值是有误差的,以sudo fdisk -l的显示内容为准。终止地址和系统盘的终止地址一样就行。
  • mkpart primary ext4 541MB 120GB这部分是划分根区的命令,使用ext4文件系统,起始地址就是启动区的终止地址,但是终止地址是硬盘的大小,也就是和最开始图中显示的终止地址一样。
  • print会打印出分区信息。
  • exit会退出parted

需要注意个命令不能拆成两个,因为退出后再使用mkpart会抹除原有分区,这样最后还是生成一个分区。

显示如下:

请添加图片描述

这时工作还未全部完成,我们需要手动给两个分区手动创建一下FAT32ext4文件系统,如下:

sudo mkfs.vfat -F 32 /dev/sdb1
sudo mkfs.ext4 -L rootfs /dev/sdb2

如果不进行这一步,那么会出现一些很奇怪的问题。前面分区的信息中,正确显示了我们是创建了一个供ext4使用的分区,编号为2。但是如果你用sudo parted -l查看一下,会发现如下情况,File system一栏中,第二个分区没有任何信息:

请添加图片描述

这时候加载这个分区发现会提醒以下错误信息:

$ sudo mount /dev/sdb2 /mnt/rootfs/
mount: /mnt/rootfs: wrong fs type, bad option, bad superblock on /dev/sdb2, missing codepage or helper program, or other error.dmesg(1) may have more information after failed mount system call.
mount: (hint) your fstab has been modified, but systemd still usesthe old version; use 'systemctl daemon-reload' to reload.

所以手动创建。

第二部:使用rsync进行复制

在使用rsync进行复制之前,需要将两个分区加载一下。

首先是在/mnt/目录下新建一个目录,用来装载根分区:

sudo mkdir /mnt/rootfs 

然后装载根分区:

sudo mount /dev/sdb2 /mnt/rootfs/

那么从哪复制(同步)到哪呢?还记得文章第一张图中的内容吗?显示了系统盘上两个分区对应的目录:/boot/firmware(启动分区)和/(根分区)。

首先是启动分区:

sudo rsync -axHAWXS --numeric-ids --info=progress2 --exclude={"/mnt/","/boot/firmware/"} /* /mnt/rootfs

这里的选项意思如下:

  • a是存档模式,这会递归读取目录,不破坏符号链接、权限等信息。
  • x表示不会跨越文件系统的边界。
  • H保留硬连接。
  • A保留ACL(访问控制表)。
  • W禁用网络传输使用的增量算法。由于这里是都是本地路径,所以可以提高速度。
  • S 可以有效地处理稀疏文件,这样传输完占用的空间更少。(不用这个的话,所有源文件可能 8GB,但是目的文件总和可能有 10GB)
  • numeric-ids使用数字 ID,而不是映射。
  • info=progress2会显示传输进度和信息,而且是整个传输的进度和信息,而不是每个文件的统计信息。
  • 有几个目录不需要复制,因为是重复的,所以要使用--exclude=来排除它们。在很多关于系统克隆的文章中,列出了其他可以忽略的目录/dev/sys/proc,但是在我花了两个小时抢救之后,可以确定像/dev/sys/proc这些都是不能忽略的,(关于如何抢救如果写了一篇博客我会在这里列出链接)

这里解释一下排除的两个目录。

  • 第一个/mnt/是避免重复复制,因为这里就是复制的目的地。不然会复制两次甚至更多次。
  • 最后一个/boot/firmware/是因为这部分内容是启动的内容,我们后面单独复制(一起复制可能会跳过这部分)。

在复制/sys/目录下的部分文件会提示一堆错误。这些错误不用管,因为不能读取(显示没权限)或者是虚拟文件。详细内容可以看看这个帖子:Why does rsync fail to copy files from /sys in Linux? - Unix & Linux stackexchange

由于前面排除了一些目录,所以这里需要手动创建它们:

sudo mkdir /mnt/rootfs/mnt /mnt/rootfs/boot/firmware

然后就可以装载启动分区了:

sudo mount /dev/sdb1 /mnt/rootfs/boot/firmware/

然后就是复制启动分区,这里大部分选项和启动分区中的选项一样:

sudo rsync -axHAWXS --numeric-ids --info=progress2 /boot/firmware/* /mnt/rootfs/boot/firmware/

如果你比较细心的话,会发现原先红色的软链接文件现在变蓝了:

请添加图片描述

可以靠这个现象判断是否复制成功。但是并不是所有的文件都能这样判断的,比如说/proc/中的一些软链接文件可能需要后续自动更新和生成才能变红。

第三步:修复/etc/fstab/boot/cmdline.txt

/etc/fstab文件会列出启动时自动挂载的所有磁盘分区。由于我们是直接复制的,UUID 对不上,所以需要手动进行修改。

使用sudo fdisk -l可以在Disk identifier部分看到硬盘的标识符,这个我们后面需要用:

请添加图片描述

可以看到/dev/sdb1/dev/sdb2两个分区的 UUID。根据这个内容对相应的文件进行修改,需要注意修改的文件是/mnt/rootfs/etc/fstab(路径可能会有所不同),而不是系统盘中的/etc/fstab

/mnt/rootfs/etc/fstab的两个PARTUUID=的后面修改成对应的内容即可,如下(下图是没改完的,按理说两个 UUID 只有后面编号不同):

请添加图片描述

然后修改/mnt/rootfs/boot/cmdline.txt(这是个软链接,实际文件在firmware中)中的相应部分(下图中高亮部分):

请添加图片描述

这时候就一切完工了。我们可以关机、拔掉原来的硬盘启动试试看(一定要拔掉旧的,不然可能会用旧的启动分区来启动新的,我在实验的时候遇到过,然后又抢救了一回硬盘)。

可以看到能直接使用,几乎没什么区别,使用sudo fdisk -l查看硬盘可以看到现在的/dev/sda是这个硬盘了。

请添加图片描述

希望能帮到有需要的人~

参考资料或扩展阅读

本文虽然我付出了不少的时间和精力进行实验和尝试,但是也要感谢很多人编写的博客为我提供了思路和解决方案。

How can I change the volume name of a FAT32 filesystem? - Unix & Linux stackexchange:这篇帖子介绍了如何给 FAT32 修改分区名。

How to Format Disk Partitions in Linux - Dejan Tucakov:从这篇文章中我才知道某些命令行分区工具并不会创建文件系统,然后我发现parted也是。

Clone File System Hierarchy to Another Disk With Rsync - Francesco Galgani:这篇文章介绍了如何使用rsync克隆磁盘,也为我解决了很多rsync复制的问题,还为我调整启动引导提供了灵感。文章主要是关于大众设备上的 Linux 系统,所以只提及了/etc/fstab,而且引导是通过 GRUB。树莓派自己的系统的引导是通过config.txtcmdline.txt文件进行的。如果你想尝试 GRUB 引导启动树莓派,那么可以看看这个贴子GRUB on RPi 4 - Raspberry Pi Forums(我没有尝试,对内容实际意义不做保证)。

The config.txt file - Raspberry Pi Documentation:这是config.txt的官方文档,虽然本文没使用到config.txt,但是在这篇文档中介绍了树莓派的大致启动流程,我也是从中发现cmdline.txt,才能完成最后的修复工作。

Raspberry Pi 4 and Raspberry Pi 5 Boot Flow - Raspberry Pi Documentation:这部分文档介绍了详细的启动流程,作为扩展阅读可以看看。

Raspberry Pi 4/400 Bootloader Firmware Update/Recovery Guide - James A. Chambers:这篇博客介绍了如何修复和更新树莓派 4/400 的启动器固件。因为两个硬盘有时候不小心同时连接到树莓派启动,可能会导致启动器固件出现问题。可以看看这篇文章修复固件。

这篇关于如何克隆树莓派系统到较小的硬盘/SD卡上(如何分区、设置修复引导)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/765442

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识