如何克隆樹莓派系統到較小的硬盤/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 的啟動器固件。因為兩個硬盤有時候不小心同時連接到樹莓派啟動,可能會導致啟動器固件出現問題。可以看看這篇文章修復固件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713620.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redis實現分布式全局唯一id

目錄 一、前言二、如何通過Redis設計一個分布式全局唯一ID生成工具2.1 使用 Redis 計數器實現2.2 使用 Redis Hash結構實現 三、通過代碼實現分布式全局唯一ID工具3.1 導入依賴配置3.2 配置yml文件3.3 序列化配置3.4 編寫獲取工具3.5 測試獲取工具 四、運行結果 一、前言 在很…

Linux運維_Bash腳本_部署安裝DocBook-XML-4.5(XML-DTD)

Linux運維_Bash腳本_部署安裝DocBook-XML-4.5(XML-DTD) Bash (Bourne Again Shell) 是一個解釋器,負責處理 Unix 系統命令行上的命令。它是由 Brian Fox 編寫的免費軟件,并于 1989 年發布的免費軟件,作為 Sh (Bourne Shell) 的替代品。 您可…

leetcode 熱題 100_最長連續序列

題解一: 哈希表:找連續最長的數字序列,很容易聯想到排序,但排序的時間復雜度O(nlogN)過大,判題容易超時。因此我們需要使用哈希表來快速查找,序列中是否存在與某個數相鄰的數。用HashSet建立哈希表并去重&a…

【Javascript編程實操02】1、判斷一個年份是閏年還是平年 2、找到三個數中最小的數

目錄 前言 1、判斷一個年份是閏年還是平年 原理: 代碼: 實現效果: 2、找到三個數中最小的數 流程圖: 代碼: 實現效果: 總結 前言 本次繼續針對Javascript階段的if...else...的實操練習&#xff0…

IDEA 配置股票插件

IDEA配置股票基金實時查看插件,步驟如下: 打開Settings,找到Plugins,在Marketplace中搜索:Money Never Sleeps,如下圖所示: Money Never Sleeps是IntelliJ IDEA平臺插件. 支持查看股票實時行情…

three.js 叉乘判斷物體在人前左,前右,后左、后右

效果&#xff1a; 代碼&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div><div style"padding: 10px;text-align: left;">叉乘判斷物體…

sshd啟動太慢,導致首次登錄困難的問題(未解決)

開始以為是無法開機啟動。長時間后&#xff08;3-4分鐘&#xff09;&#xff0c;又可以登錄了。 解決辦法1&#xff08;無效&#xff09; 編輯sshd_config UseDNS no GSSAPIAuthentication no IgnoreRhosts yes UsePAM no 解決辦法2&#xff08;無效&#xff09; 在/etc/h…

加密與安全_探索對稱加密算法

文章目錄 概述常用的對稱加密算法AESECB模式CBC模式 (推薦)ECB VS CBC 附&#xff1a;AES工具類總結 概述 對稱加密算法是一種加密技術&#xff0c;使用相同的密鑰來進行加密和解密數據。在這種算法中&#xff0c;發送方使用密鑰將明文&#xff08;未加密的數據&#xff09;轉…

14:00面試,14:07就出來了,問的問題過于變態了。。。

我從一家小公司轉投到另一家公司&#xff0c;期待著新的工作環境和機會。然而&#xff0c;新公司的加班文化讓我有些始料未及。雖然薪資相對較高&#xff0c;但長時間的工作和缺乏休息使我身心俱疲。 就在我逐漸適應這種高強度的工作節奏時&#xff0c;公司突然宣布了一則令人…

Android提供了多種方式來打開特定文件夾中的視頻

使用 MediaStore獲取指定文件夾的視頻&#xff0c;更優化方法&#xff1a; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.net.Uri; import android.os.Build; import android.os.Environme…

鴻蒙操作系統特點

鴻蒙&#xff08;HarmonyOS&#xff09;是華為公司開發的一種面向全場景的分布式操作系統。下面是對鴻蒙操作系統的詳細介紹&#xff1a; 1. 多設備支持&#xff1a;鴻蒙是一種面向多種設備的操作系統&#xff0c;支持手機、平板電腦、智能手表、智能屏、車載設備和物聯網設備…

kafka學習筆記三

目錄 第二篇 外部系統集成 第三篇 生產調優手冊 第1章 kafka硬件配置選擇 第2章 生產者調優 2.1 生產者核心參數配置 2.2 生產者如何提高吞吐量 2.3 數據可靠性 2.4 數據去重 2.5 數據有序 2.6 數據亂序 第3章 Kafka Broker調優 3.1 Broker核心參數配置 3.2 其他 …

禪道:提bug、管理case 7.0

一、禪道的介紹 &#xff08;1&#xff09;定義禪道是一個項目管理工具&#xff0c;也是一個bug管理工具&#xff0c;還是一個用例管理工具。 &#xff08;2&#xff09;作用&#xff1a;為了解決眾多企業在管理中出現混亂&#xff0c;無序的現象&#xff0c;開發出來 &…

ppt中調整某條表格框線的格式

1、先設置好邊框線的屬性&#xff1a; 2、選擇要調整的邊框線所在的單元格&#xff08;第二列的右邊框加粗&#xff0c;體現分欄的效果&#xff09; 3、設計--邊框--中選擇要調整的邊框線位置&#xff08;假設要調整右框線&#xff09;

精讀服務器默認rsyslog的配置文件

rsyslog的配置文件 rsyslog.conf #### MODULES ####$ModLoad imuxsock # provides support for local system logging (e.g. via logger command) $ModLoad imjournal # provides access to the systemd journal #$ModLoad imklog # reads kernel messages (the same are read…

JavaScript解決生日倒計時的問題

創建一個文本框&#xff0c;在一個文本框中&#xff0c;讓用戶輸入他的出生月份&#xff0c;第二個文本框中輸入月份中的日期&#xff0c;編寫一個JavaScript程序&#xff0c;在第三個文本框中打印距離用戶生日還有多少天。 <div id"box"><label for"&…

libvirt命名空間xmlns:qemu的使用

示例xml <domain type{domain_type} xmlns:qemuhttp://libvirt.org/schemas/domain/qemu/1.0><qemu:commandline><qemu:commandline><qemu:arg value-newarg/><qemu:env nameQEMU_ENV valueVAL/></qemu:commandline></domain>"…

13、輸入捕獲實驗

目錄 一、通用定時器輸入捕獲概述 二、常用寄存器和庫函數配置 三、輸入捕獲實驗講解 一、通用定時器輸入捕獲概述 STM32輸入捕獲工作過程&#xff08;通道1為例&#xff09; 一句話總結工作過程&#xff1a; 通過檢測TIMx_CHx上的邊沿信號&#xff0c;在邊沿信號發生跳變…

28.HarmonyOS App(JAVA)多頁簽的實現(Tab)

HarmonyOS App(JAVA)多頁簽的實現&#xff08;Tab&#xff09; 頁面可左右滑動&#xff0c;點擊界面1,2,3切換到對應界面 PageSlider的創建和使用 在layout目錄下的xml文件中創建PageSlider。 <PageSlider ohos:id"$id:page_slider" ohos:height"300vp&…

2D割草/吸血鬼游戲 性能優化——GPU Spine動畫

視頻中萬人同屏方案(gpu動畫、渲染、索敵、避障等功能)&#xff0c;可某寶搜店鋪&#xff1a;【游戲開發資源商店】獲取整套方案源碼。 在過去的幾年里&#xff0c;割草、類吸血鬼玩法的游戲頻出爆款&#xff0c;其豐富的技能、滿屏特效、刷怪清屏的解壓暢快是此類游戲的核心&…