電腦的軟體資料,是屬於無實體的財產,一旦損壞或是遭到覆寫,就很難再回復原本的狀態。還好Linux系統有提供非常好用的dd指令,可以幫助使用者來對某一裝置(dev)或是檔案進行完整的檔案複製,達成資料的備份。舉例來說,如果要備份一個16GB的記憶卡,那麼就只要將記憶卡插入電腦,再使用Linux的dd指令,不論這16GB記憶卡的檔案系統為何,也不管究竟有沒有掛載成功、檔案目錄能不能存取,都可以很輕易的直接讀取記憶卡內的所有位元組資料,並將讀取到的內容存成一個同樣是16GB的檔案。由於dd指令本身並沒有壓縮功能,因此也可以搭配其他如rar等壓縮工具一起使用。



查看儲存裝置的檔案路徑

在使用dd指令前,要先確認一下儲存裝置的路徑。在Linux系統中,任何裝置(dev)都可視為一個檔案,位於/dev目錄中。也因此,專門用來進行檔案複製的dd指令,才可以直接使用裝置所指的檔案路徑,以檔案的方式來操作該裝置。

如果要查看自己電腦內的硬碟、隨身碟、行動硬碟、記憶卡等儲存裝置的檔案路徑,可以直接使用以下指令來列表查看:

lsblk

linux-dd-rar

NAME表示為裝置的名稱;MOUNTPOINT表示為裝置掛載的路徑;RO表示是否為唯讀的裝置。

SATA硬碟和USB儲存裝置的裝置名稱通常為sda(第一顆)、sdb(第二顆)、sdc(第三顆)……依此類推。而M.2硬碟的裝置名稱通常為nvme0n1(第0個控制器的第一顆)、nvme0n2(第0個控制器的第二顆)、nvme1n1(第1個控制器的第一顆)……依此類推。如果儲存裝置下還有其他分割區,則會在裝置名稱後面串接數字來表示同一個儲存裝置的分割區,如sda1sda2nvme0n1p1nvme0n1p2

裝置對應的檔案,可在/dev目錄下找到與裝置名稱相同的檔名。例如sda對應的檔案就是/dev/sda

如果想查看某個檔案或是目錄是屬於哪個裝置的話,可以使用以下指令:

df 檔案路徑

linux-dd-rar

使用dd指令複製、備份與還原檔案

dd指令用來複製檔案的常用方式如下:

dd if=輸入檔案路徑 of=輸出檔案路徑 bs=緩衝空間大小
  • if:輸入(讀取)檔案路徑,如果是要備份裝置的話,可以在這裡輸入裝置的檔案路徑;如果是要還原裝置的話,可以在這裡輸入裝置的備份檔案路徑。
  • of:輸出(寫入)檔案路徑,如果是要備份裝置的話,可以在這裡輸入要儲存備份檔案的路徑;如果是要還原裝置的話,可以在這裡輸入裝置的檔案路徑。
  • bs:記憶體緩衝空間大小,最好設定4k以上,筆者通常是使用128M。如果有設定的話dd指令會先將檔案讀到記憶體中,再從記憶體寫入到目的地,這樣做應該是會比直接讀寫還快,而且也比較不會傷害到儲存裝置。

如下圖,將USB隨身碟完整備份到電腦裡的硬碟中,檔名存成8G隨身碟.backup

linux-dd-rar

如下圖,將USB隨身碟的完整備份檔8G隨身碟.backup,還原到USB隨身碟裡。

linux-dd-rar

使用rar指令,協助壓縮dd輸出的備份檔

dd指令固然可以快速地達成檔案備份功能,但是備份檔的大小會跟原始的裝置或是檔案的大小一樣大。就拿筆者8GB的USB隨身碟來當例子好了,明明裡面的檔案只大概佔了3GB,使用dd備份卻直接就吃了8GB,這樣的備份檔大小實在是太不友善了。為了解決這樣的問題,可以將dd指令與rar指令一同使用。大致上的概念就是,不指定dd指令輸出的檔案(也就是不設定of參數),讓它可以將資料輸出到標準輸出(stdout)中,再讓rar指令去壓縮這標準輸出傳來的資料,並製作成RAR壓縮檔。

有關於RAR的安裝以及指令的使用方式,可以參考下面的文章:

要讓rar指令能夠接收從標準輸出傳來的資料,可以使用|字元將dd指令與rar指令隔開在同一行中。字元|左邊的指令輸出到標準輸出中的資料,會成為字元|右邊指令的標準輸入(stdin)。也就是說,將dd指令放在字元|左邊,rar指令放在字元|右邊,就可以讓dd指令的輸出變成rar指令的輸入。

但是,在預設的情況下,rar指令是以傳入檔案路徑的方式來取得檔案的資料,因此在這裡必須要用到rar-si參數,讓rar能夠從標準輸入中讀取檔案的資料。

dd輸出檔案資料到rar中壓縮成檔案的指令格式如下(使用rar指令的預設壓縮設定):

dd if=輸入檔案路徑 bs=緩衝空間大小 | rar a -si 輸出壓縮檔案路徑

注意,「-si」參數和「"檔案在壓縮檔內的路徑和檔名"」這個字串間並沒有空格。

如果要壓制出容量更小,且擁有些微復原損壞能力的RAR壓縮檔案,可以使用以下指令格式:

dd if=輸入檔案路徑 bs=緩衝空間大小 | rar a -m5 -si -rr1 輸出壓縮檔案路徑

小提示:在使用ddrar備份儲存裝置時,最好先將該裝置的可用空間用數值0擦除過,這樣壓縮後備份檔案會小很多哦!可以參考這篇文章來學習擦除可用空間。

如下圖,將USB隨身碟完整備份到電腦裡的硬碟中,檔名存成8G隨身碟.backup.rar,壓縮檔大小僅有2.9GB。

linux-dd-rar

之後若要將RAR的壓縮備份檔還原,需使用rarp參數來直接將RAR的檔案解壓縮輸出到標準輸出中,再使用沒有指定if參數的dd指令來從標準輸入接收資料。指令如下:

rar p 輸入壓縮檔案路徑 檔案在壓縮檔內的路徑和檔名 | dd of=輸出檔案路徑 bs=緩衝空間大小

linux-dd-rar