2026年6月5日 星期五

[Open-source tool] 如何利用dd指令將樹莓派作業環境和資料備份到TrueNAS中?


目前手邊的一台長期運作的樹莓派server,隨著安裝服務和共享檔案持續增加,儲存空間逐漸不夠用,需要轉移到較大容量的SD卡,同時需要維持既有的作業系統環境和檔案。經詢問AI,其建議做法是利用 dd(Data Duplicator) 指令並以映像檔備份到NAS系統,再將映像檔重新燒錄到大容量SD卡。剛好用上之前已架設在虛擬機的TrueNAS Scale,同時一併徹底了解dd的原理機制。

TrueNAS和dd(Data Duplicator)指令的原理和角色:

1. TrueNAS Scale

TrueNAS核心分為Core與Scale兩大分支。本文採用的TrueNAS Scale是基於Debian LinuxZFS檔案系統的開源儲存作業系統。與基於FreeBSD的 Core 版本相比,Scale具備更強大的Linux生態、容器化支援與硬體驅動相容性。而ZFS作為TrueNAS的靈魂,提供了企業級的資料防護機制(如寫入時複製Copy-on-Write、資料自我修復、快照等)。

2. dd(Data Duplicator)

Linux 系統中,dd的核心機制是區塊級(Block-level)複製。一般檔案級備份的cp或rsynx指令,會受制於不同的檔案系統(如 ext4, NTFS),且無法複製未掛載的隱藏磁區、引導扇區(Boot Sector)與分割表。而 區塊級備份的dd指令完全不管檔案系統與目錄結構,它將硬碟視為一連串的二進位0與1,換言之,其具備底層操作權限。當執行dd時,它會從來源端(如SD卡)的第一個Byte開始,循序漸進地讀取每一個區塊,並原封不動地寫入目的地。這意味著:

  • 連同引導磁區(MBR/GPT)一起備份:燒錄還原後保證能直接開機。
  • 保留所有權限與連結:軟體配置、特殊權限、虛擬記憶體(Swap)完全不漏。
  • 空白處也會被備份:即使 SD 卡只用了10GB,其餘50GB的空白區塊也會被視為二進位資料一併讀取。


實作環境和配置步驟:

本文範例的實作環境如下:
  • Raspberry Pi 4B/8g: 安裝Ubuntu 24.04 desktop LTS作業系統。
  • TrueNAS SCALE 25.10.1 Community: 架設在VMware的虛擬客體。
將樹莓派的資料備份到TrueNAS之前,需先在TrueNAS上配置對應儲存池(Pool)、資料集(Dataset)和存取權限。TrueNAS的配置步驟如下:

a.建立和命名一個儲存池(Pool)和資料集(Dataset)

在TrueNAS的Storage中,建立儲存池和對應資料集,這個動作即定義了備份到TrueNAS的路徑,其資料樹狀結構和路徑如圖三的紅框處。另外,建立儲存池的過程中,會出現關於選擇虛擬硬碟和RAID的選項,本文僅用於備份樹莓派的映像檔,採用最簡單的Strip模式(等同於RAID 0),優點是備份速度快,缺點是無冗餘和無容錯能力。建議若在正式生產環境,要選擇RAIDZ1或RAIDZ2等模式,確保資料安全,這部分再依照需求自行選擇其可。

圖一、建立儲存池
圖一、建立儲存池

圖二、建立資料集
圖二、建立資料集

圖三、查看已建立的資料集和路徑
圖三、查看已建立的資料集和路徑

b.開啟SSH service和使用者存取權限

為了讓樹莓派的資料透過SSH備份到TrueNAS,接著進到TrueNAS -> System -> Services,開啟SSH服務,使其顯示為running,如圖四所示。另外,進到TrueNAS -> Credentials -> Users,選擇add新增一個使用者帳號,同時讓這個使用者帳號具備SSH密碼登入權限和具備該備份路徑的存取權限,如圖五和圖六所示。

圖四、開啟SSH Services
圖四、開啟SSH Services

圖五、讓使用者帳號具備SSH訪問權限
圖五、讓使用者帳號具備SSH訪問權限

圖六、讓使用者帳號具備路徑存取權限
圖六、讓使用者帳號具備路徑存取權限


利用dd指令將樹莓派作業環境備份到TrueNAS:

完成上述TrueNAS配置作業後,接著利用下列指令透過SSH進行備份,即可看到傳輸作業進度,同時也可由TrueNAS端看到網路流量狀態,如圖七和圖八所示。

sudo -v && sudo dd if=/dev/mmcblk0 bs=4M status=progress | ssh 設定的使用者帳號@TrueNAS的ip  "cat > /mnt/main_pool/ubuntu_24.04_desktop_rpi4_backup/raspberrypi_backup_\$(date +%Y%m%d).img"

圖七、終端命令列顯示備份進度
圖七、終端命令列顯示備份進度

圖八、TrueNAS端的即時網路流量
圖八、TrueNAS端的即時網路流量


詳細指令說明如下:
  • sudo -v : -v指的是Validate,功能是更新目前樹莓派使用者的sudo權限暫存時間(預設可維持15分鐘不需再輸入密碼),但它不會執行任何實質命令,其最主要功能就是避免"樹莓派本地使用者sudo密碼輸入提示" 與 "遠端TrueNAS使用者ssh密碼輸入提示"互相卡關。
  • sudo dd : 以系統管理員最高權限啟動dd指令,確保能直接讀取底層物理設備檔案。
  • if=/dev/mmcblk0 : if 代表 Input File(輸入來源)。在樹莓派中,SD卡的物理識別名稱通常為 /dev/mmcblk0,這裡指定要複製「整顆硬碟」,而非單一分割區(如 mmcblk0p1)。
  • bs=4M : bs代表Block Size(區塊大小)。設定為4M意即每次讀寫以4 Megabytes為一個單位。不設定的話預設只有512 Bytes,會導致讀寫次數頻繁和備份速度緩慢。
  • status=progress : 當dd在執行過程中,在樹莓派端即時顯示目前已傳輸的資料量、耗時和平均寫入速度。
  • | : 利用Pipe 管線功能將左邊dd輸出的二進位資料串流(Stdout)作為到右邊指令的輸入端(Stdin)資料,好處是資料不需要額外在樹莓派上進行儲存再轉傳到TrueNAS。
  • ssh 設定的使用者帳號@TrueNAS的ip : 透過加密通道連線到TrueNAS,終端機會需要輸入遠端TrueNAS使用者的ssh登入密碼。
  • "cat > ..." : 在TrueNAS端執行的命令。利用cat 接收從網路管線傳過來的資料流,並透過 > 重新導向(Redirect)寫入成實體檔案。
  • /mnt/main_pool/ubuntu_24.04_desktop_rpi4_backup/... : 備份到TrueNAS儲存池與資料集的路徑。
  • \$(date +%Y%m%d).img : 動態命名語法,利用TrueNAS本身的系統時間,自動抓取當天日期(如 20260605),使得產出的檔案包含時間戳(如raspberrypi_backup_20260605.img),方便版本控管。注意 : 在雙引號內使用 $ 必須加上反斜線 \ 進行轉義,否則時間會變成樹莓派的時間,而非執行當下的指令字串。

完成備份後,後續利用sftp由TrueNAS取得該備份映像檔,並用燒錄軟體重新燒錄到大容量的儲存裝置即可。
呼~跟AI學到不少東西,然而上述當儲存裝置正常時的備份方式,若是儲存裝置出現檔案系統故障而呈現唯讀狀態呢? 如何救援資料? 這又是另一段學習歷程,有待下次紀錄,也是跟AI學的。 

沒有留言:

張貼留言