用 dd 指令備份和還原 Debian GNU/Linux 10 作業系統
【摘要】敘述用 dd 指令備份和還原 GNU/Linux 作業系統的方法,包括製成壓縮檔,還原和複製到另一分割區或隨身碟。
【目錄】
【前言】【製成壓縮檔】
【用壓縮檔還原到另一分割區】
【用壓縮檔還原到隨身碟】
【複製到另一分割區】
【從硬碟複製到隨身碟】
【後語】
【前言】
一、有應用程式可以將作業系統備份或複製到外接碟。如果不想安裝這些,只用 Linux 常見的程式也是可以做到的。
本例提到的程式包括:blkid
、chroot
、dd
、e2fsck
、exit
、grub-install
、lsblk
、mount
、tune2fs
、umount
、update-grub
、uuidgen
、xz
。圖形界面程式除了各位喜好的文書程式外,只有 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 是不是複製在剪貼簿的那個。理論上應該是。按 F10
或 ctrl+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 中的虛擬硬碟,也是可以的,後面的文章會敘述做法。