Backup And Restore Debian GNU/Linux 10 Using dd Commands

用 dd 指令備份和還原 Debian GNU/Linux 10 作業系統

【摘要】敘述用 dd 指令備份和還原 GNU/Linux 作業系統的方法,包括製成壓縮檔,還原和複製到另一分割區或隨身碟。


【目錄】

    【前言
    【製成壓縮檔
    【用壓縮檔還原到另一分割區
    【用壓縮檔還原到隨身碟
    【複製到另一分割區
    【從硬碟複製到隨身碟
    【後語

【前言】

一、有應用程式可以將作業系統備份或複製到外接碟。如果不想安裝這些,只用 Linux 常見的程式也是可以做到的。

本例提到的程式包括:blkidchrootdde2fsckexitgrub-installlsblkmounttune2fsumountupdate-grubuuidgenxz。圖形界面程式除了各位喜好的文書程式外,只有 gparted,絕大部分的 Linux 系統都有此程式。


二、約四年前,曾在 Google 的 Blogger 發表過十一篇相關的網誌,那時是用 Ubuntu Linux 系統。近日重新分類整理,在自己組合的 FluxBox Debian GNU/Linux 10 測試,更新內容,分享於此。本文是第一篇,介紹用 dd 程式備份和複製硬碟。隨後還有兩篇,分別是用 rsync 程式備份和複製硬碟,和在 VirtualBox 中的做法

本例使用的作業系統是安裝在 sda1 分割區,並以此為主,來處理安裝在其它分割區的 Debian 10 作業系統。


三、請先清除整理要被備份的作業系統:刪除不必要的檔案,再用 gparted 將尺寸縮小,儘量減小體積。這樣可以縮短複製和壓縮的時間。


【製成壓縮檔】

一、假設要被備份的來源分割區是 sda2。

sudo dd if=/dev/sda2 bs=1M status=progress | xz > backup.xz

  if:輸入檔(Input File)。上面用來源分割區為輸入檔。
  bs:讀寫一次的尺寸。預設值是 512 Bytes,速度太慢。用 512K 也可以,但 1M 比較簡單好記。
  status=progress:顯示進度。一個作業系統通常非常地大,要很長的時間,不知道進度會很不耐煩的。
  xz:用 xz 可以得到較小的壓縮檔。儘量壓小,不然很佔空間,但代價是比較耗時。
  > backup.xz:重導至檔案。副檔名用 xz 才知道用什麼程式壓縮的。請記得這個檔名,後面還原時要用到。

就這樣,一行指令就解決了。


二、恢復 sda2。

gparted 將 sda2 容量放大回原狀。


【用壓縮檔還原到另一分割區】

一、假設目標分割區是同一硬碟的 sda3。先將 sda3 格式化,並確認容量要能放得下展開後的作業系統。然後在備份檔的目錄執行:

xz -cd backup.xz | sudo dd of=/dev/sda3 bs=1M status=progress

  -c:輸出到 standard output。
  -d:解壓縮(Decompress)。
  backup.xz:備份檔的檔名。
  of:輸出檔(Output File)。用目標分割區為輸出檔。
  bs:讀寫一次的尺寸。預設值是 512 Bytes,速度太慢。用 512K 也可以,但 1M 比較簡單好記。
  status=progress:顯示進度。一個作業系統通常非常地大,要很長的時間,不知道進度會很不耐煩的。


二、因為製作備份檔之前,為了節省壓縮時間和降低備份檔尺寸,通常會把分割區縮小,所以展開後的尺寸通常比 sda3 的容量小。這會造成問題。請執行 gparted,選 sda3,選單列 [Partition] > [Check],執行。


三、改 UUID。

  ⒈ 如果同一個硬碟的不同分割區有相同的 UUID,會有問題,因為 Grub 是看分割區的 UUID 來區別作業系統的。譬如用上一節 sda2 的備份檔還原到 sda3,這樣兩個分割區的 UUID 就會一樣。開機時,會分不清要用哪一個分割區。


  ⒉ 要看各分割區的 UUID 可用 sudo blkid 指令。


  ⒊ 若 sda3 的 UUID 和其它分割區的不同,可略過第三步驟,不需改 UUID。但若和某分割區的相同,請執行 gparted,選 sda3,選單列 [Partition] > [New UUID],執行。如果要順便改分割區的名稱,可以選 [Label File System]。

  如果用 gparted 改 UUID 有錯誤訊息,可能是改 UUID 前要先 Check;那就再 Check 一次。


  ⒋ 改 UUID 的指令是:

sudo tune2fs -U $(uuidgen) /dev/sda3

  -U:設定 UUID 的選項。
  uuidgen:產生 UUID 的程式。此處直接用新產生的 UUID 為 sda3 的值。
  $(uuidgen):可換成 random,但怕系統的亂數產生器功能不佳。也可換成自己訂的 UUID,但不要用錯格式。UUID 的格式是:8-4-4-4-12 位數的十六進位碼,例如:88888888-4444-4444-4444-121212121212。

  如果有訊息說要先檢查,改成:

sudo e2fsck -f -y /dev/sda3 ; sudo tune2fs -U $(uuidgen) /dev/sda3

  ⒌ 改完後,要讓 sda3 和 sda1 系統知道,先處理 sda3。

sudo blkid

  將 sda3 的 UUID 複製到剪貼簿,並稍微記住前面 3~5 碼;然後掛載到 /mnt 目錄。此目錄必需原本是空的。

sudo mount /dev/sda3 /mnt

  ⒍ 以 root 權限,用文書程式開啟 /mnt/etc/fstab 檔,修改 UUID。存檔後,關閉文書程式。

  改 fstab 檔,以前用 Ubuntu 系統是必要的,但今在 Debian 系統,似乎不改也沒關係,其它系統就不一定了。不過還是建議改一下,畢竟都一樣比較不容易出錯。


四、接下來要改 sda3 的開機清單,必需在 sda3 做。但是不用 sda3 開機而要讓系統認為是用 sda3 開機,必需用模擬的方式,所以掛上一些模擬要用的目錄。

sudo mount --bind /dev /mnt/dev
sudo mount --bind /sys /mnt/sys
sudo mount --bind /proc /mnt/proc

切換到 sda3:

sudo chroot /mnt

更新 sda3 的開機清單:

sudo update-grub

返回 sda1:

exit

五、改 sda1 的開機清單,以納入 sda3 的開機參數。

sudo update-grub

六、重新開機時,按向下鍵移到 sda3,再按 e,進入編輯模式。看其 UUID 是不是複製在剪貼簿的那個。理論上應該是。按 F10ctrl+x 啟動作業系統。


【用壓縮檔還原到隨身碟】

一、準備目標分割區。

  ⒈ 假設隨身碟是 sdb,目標分割區是 sdb1。


  ⒉ 插入隨身碟時,系統可能會自動掛載,必需先卸下才行。請執行 gparted,在右上角選 sdb,然後選單列 [Partition] > [Unmount]。


  ⒊ 將 sdb1 格式化,容量要能放得下展開後的作業系統。


二、剛開始的步驟和上一節的一樣,只要把 sda3 換成 sdb1 即可,但為了閱讀方便,仍完整敘述一次。

  ⒈ 先執行 lsblk 確認 sdb1 沒有被掛載;如果有,要先卸下:

sudo umount /dev/sdb1

  ⒉ 然後在備份檔的目錄執行:

xz -cd backup.xz | sudo dd of=/dev/sdb1 bs=1M status=progress

  -c:輸出到 standard output。
  -d:解壓縮(Decompress)。
  backup.xz:備份檔的檔名。
  of:輸出檔(Output File)。用目標分割區為輸出檔。
  bs:讀寫一次的尺寸。預設值是 512 Bytes,速度太慢。用 512K 也可以,但 1M 比較簡單好記。
  status=progress:顯示進度。一個作業系統通常非常地大,要很長的時間,不知道進度會很不耐煩的。


三、因為製作備份檔之前,為了節省壓縮時間和降低備份檔尺寸,通常會把分割區縮小,所以展開後的尺寸通常比 sdb1 的容量小。這會造成問題。請執行 gparted,選 sdb1,選單列 [Partition] > [Check],執行。


四、安裝在隨身碟一樣會有 UUID 相同的問題,所以最好換一個。

  ⒈ 在 gparted 選單列 [Partition] > [New UUID]。若要改分割區名稱:[Partition] > [Label File System]

  如果用 gparted 改 UUID 有錯誤訊息,可能是改 UUID 前要先 Check,那就再 Check 一次。


  ⒉ 改完後,要讓 sdb1 系統知道。

sudo blkid

  將 sdb1 的 UUID 複製到剪貼簿,並稍微記住前面 3~5 碼;然後掛載到 /mnt 目錄。此目錄必需原本是空的。

sudo mount /dev/sdb1 /mnt

  以 root 權限,用文書程式開啟 /mnt/etc/fstab 檔,修改 UUID。存檔後,關閉文書程式。

  改 fstab 檔,以前用 Ubuntu 系統是必要的,但今在 Debian 系統,似乎不改也沒關係,其它系統就不一定了。不過還是建議改一下,畢竟都一樣比較不容易出錯。


五、通常在隨身碟安裝作業系統是要用它開機,所以必需安裝 Grub。

sudo grub-install --boot-directory=/mnt/boot /dev/sdb

  --boot-directory:指定開機檔所在的目錄。
  最後一項是要用來開機的裝置;提醒:此處是 sdb 而非 sdb1。


六、更新開機清單。

  ⒈ 安裝完要改隨身碟的開機清單,必需在 sdb1 做。但是不用 sdb1 開機而要讓系統認為是用 sdb1 開機,必需用模擬的方式,所以掛上一些模擬要用的目錄。

sudo mount --bind /dev /mnt/dev
sudo mount --bind /sys /mnt/sys
sudo mount --bind /proc /mnt/proc

  ⒉ 切換到 sdb1:

sudo chroot /mnt

  ⒊ 更新 sdb1 的開機清單:

sudo update-grub

  好了,應該可以用隨身碟開機了。


【複製到另一分割區】

以上都是談先製成備份檔,才還原或複製到其它分割區。如果想直接複製到其它分割區呢,譬如將 sda2 複製到 sda3 或到隨身碟的 sdb1?到同一硬碟比較簡單,先介紹。

假設是用 sda1 開機,而 sda2 已有一完整的作業系統要將它複製到 sda3。

一、縮小來源分割區。

刪除 sda2 不必要的檔案,用 gparted 將尺寸縮小。做完,不要關掉程式。


二、準備目標分割區。

續用 gparted 將 sda3 格式化,並確認容量要能放得下 sda2 的作業系統。


三、複製。

在 sda1 執行:

sudo dd if=/dev/sda2 of=/dev/sda3 bs=1M status=progress

  if:輸入檔(Input File)。用要被複製的來源分割區為輸入檔。
  of:輸出檔(Output File)。用目標分割區為輸出檔。
  bs:讀寫一次的尺寸。預設值是 512 Bytes,速度太慢。用 512K 也可以,但 1M 比較簡單好記。
  status=progress:顯示進度。一個作業系統通常非常地大,要很長的時間,不知道進度會很不耐煩的。


四、恢復 sda2。

gparted 將 sda2 放大回原狀。做完,不要關掉程式。


五、檢查 sda3 並改 UUID。

為了節省複製的時間,通常會把來源分割區縮小,所以通常比目標分割區的容量小。這會造成問題。請在 gparted,選 sda3,選單列 [Partition] > [Check];再選 sda3,選單列 [Partition] > [New UUID],執行。也可以順便改分割區的名稱。


六、改完後,要讓 sda3 和 sda1 系統知道。

sudo blkid

將 sda3 的 UUID 複製到剪貼簿,並稍微記住前面 3~5 碼;然後掛載到 /mnt 目錄。此目錄必需原本是空的。

sudo mount /dev/sda3 /mnt

以 root 權限,用文書程式開啟 /mnt/etc/fstab 檔,修改 UUID。存檔後,關閉文書程式。

改 fstab 檔,以前用 Ubuntu 系統是必要的,但今在 Debian 系統,似乎不改也沒關係,其它系統就不一定了。不過還是建議改一下,畢竟都一樣比較不容易出錯。


七、接下來要改 sda3 的開機清單,必需在 sda3 做。但是不用 sda3 開機而要讓系統認為是用 sda3 開機,必需用模擬的方式,所以掛上一些模擬要用的目錄。

sudo mount --bind /dev /mnt/dev
sudo mount --bind /sys /mnt/sys
sudo mount --bind /proc /mnt/proc

切換到 sda3:

sudo chroot /mnt

更新 sda3 的開機清單:

sudo update-grub

返回 sda1:

exit

八、改 sda1 的開機清單,以納入 sda3 的開機參數。

sudo update-grub

【從硬碟複製到隨身碟】

假設是用 sda1 開機,而 sda2 已有一完整的作業系統要將它複製到隨身碟的 sdb1。

一、準備來源分割區。

刪除 sda2 不必要的檔案,用 gparted 將尺寸縮小。做完,不要關掉程式。


二、準備目標分割區。

插入隨身碟時,系統可能會自動掛載,必需先卸下才行。請在 gparted 右上角選 sdb,然後選單列 [Partition] > [Unmount]。

將 sdb1 格式化,容量要能放得下展開後的作業系統。


三、複製。

先執行 lsblk 確認 sdb1 沒有被掛載;如果有,要先卸下:

sudo umount /dev/sdb1

然後執行:

sudo dd if=/dev/sda2 of=/dev/sdb1 bs=1M status=progress

  if:輸入檔(Input File)。用要被複製的來源分割區為輸入檔。
  of:輸出檔(Output File)。用目標分割區為輸出檔。
  bs:讀寫一次的尺寸。預設值是 512 Bytes,速度太慢。用 512K 也可以,但 1M 比較簡單好記。
  status=progress:顯示進度。一個作業系統通常非常地大,要很長的時間,不知道進度會很不耐煩的。


四、恢復 sda2。

gparted 將 sda2 放大回原狀。做完,不要關掉程式。


五、檢查 sdb1 並改 UUID。

為了節省複製的時間,通常會把來源分割區縮小,所以通常比目標分割區的容量小。這會造成問題。請在 gparted,選 sdb1,選單列 [Partition] > [Check];再選 sdb1,選單列 [Partition] > [New UUID],執行。也可以順便改分割區的名稱。


六、改完後,要讓 sdb1 系統知道。

sudo blkid

將 sdb1 的 UUID 複製到剪貼簿,並稍微記住前面 3~5 碼;然後掛載到 /mnt 目錄。此目錄必需原本是空的。

sudo mount /dev/sdb1 /mnt

以 root 權限,用文書程式開啟 /mnt/etc/fstab 檔,修改 UUID。存檔後,關閉文書程式。

改 fstab 檔,以前用 Ubuntu 系統是必要的,但今在 Debian 系統,似乎不改也沒關係,其它系統就不一定了。不過還是建議改一下,畢竟都一樣比較不容易出錯。


七、通常在隨身碟安裝作業系統是要用它開機,所以必需安裝 Grub。

sudo grub-install --boot-directory=/mnt/boot /dev/sdb

  --boot-directory:指定開機檔所在的目錄。
  最後一項是要用來開機的裝置;提醒:此處是 sdb 而非 sdb1。


八、安裝完要改隨身碟的開機清單,必需在 sdb1 做。但是不用 sdb1 開機而要讓系統認為是用 sdb1 開機,必需用模擬的方式,所以掛上一些模擬要用的目錄。

sudo mount --bind /dev /mnt/dev
sudo mount --bind /sys /mnt/sys
sudo mount --bind /proc /mnt/proc

切換到 sdb1:

sudo chroot /mnt

更新 sdb1 的開機清單:

sudo update-grub

好了,應該可以用隨身碟開機了。


【後語】

一、備份或複製正在使用的作業系統也可以,但不建議用 dd 程式。如果要做,建議用 rsync 程式,下一篇網誌會介紹。

二、備份或複製 VirtualBox 中的虛擬硬碟,也是可以的,後面的文章會敘述做法。

發表留言