電腦的軟體資料,是屬於無實體的財產,一旦損壞或是遭到覆寫,就很難再回復原本的狀態。還好Linux系統有提供非常好用的dd
指令,可以幫助使用者來對某一裝置(dev)或是檔案進行完整的檔案複製,達成資料的備份。舉例來說,如果要備份一個16GB的記憶卡,那麼就只要將記憶卡插入電腦,再使用Linux的dd
指令,不論這16GB記憶卡的檔案系統為何,也不管究竟有沒有掛載成功、檔案目錄能不能存取,都可以很輕易的直接讀取記憶卡內的所有位元組資料,並將讀取到的內容存成一個同樣是16GB的檔案。由於dd
指令本身並沒有壓縮功能,因此也可以搭配其他如rar等壓縮工具一起使用。
查看儲存裝置的檔案路徑
在使用dd
指令前,要先確認一下儲存裝置的路徑。在Linux系統中,任何裝置(dev)都可視為一個檔案,位於/dev
目錄中。也因此,專門用來進行檔案複製的dd
指令,才可以直接使用裝置所指的檔案路徑,以檔案的方式來操作該裝置。
如果要查看自己電腦內的硬碟、隨身碟、行動硬碟、記憶卡等儲存裝置的檔案路徑,可以直接使用以下指令來列表查看:
NAME
表示為裝置的名稱;MOUNTPOINT
表示為裝置掛載的路徑;RO
表示是否為唯讀的裝置。
SATA硬碟和USB儲存裝置的裝置名稱通常為sda
(第一顆)、sdb
(第二顆)、sdc
(第三顆)……依此類推。而M.2硬碟的裝置名稱通常為nvme0n1
(第0個控制器的第一顆)、nvme0n2
(第0個控制器的第二顆)、nvme1n1
(第1個控制器的第一顆)……依此類推。如果儲存裝置下還有其他分割區,則會在裝置名稱後面串接數字來表示同一個儲存裝置的分割區,如sda1
、sda2
、nvme0n1p1
、nvme0n1p2
。
裝置對應的檔案,可在/dev
目錄下找到與裝置名稱相同的檔名。例如sda
對應的檔案就是/dev/sda
。
如果想查看某個檔案或是目錄是屬於哪個裝置的話,可以使用以下指令:
使用dd
指令複製、備份與還原檔案
dd
指令用來複製檔案的常用方式如下:
if
:輸入(讀取)檔案路徑,如果是要備份裝置的話,可以在這裡輸入裝置的檔案路徑;如果是要還原裝置的話,可以在這裡輸入裝置的備份檔案路徑。of
:輸出(寫入)檔案路徑,如果是要備份裝置的話,可以在這裡輸入要儲存備份檔案的路徑;如果是要還原裝置的話,可以在這裡輸入裝置的檔案路徑。bs
:記憶體緩衝空間大小,最好設定4k以上,筆者通常是使用128M。如果有設定的話dd指令會先將檔案讀到記憶體中,再從記憶體寫入到目的地,這樣做應該是會比直接讀寫還快,而且也比較不會傷害到儲存裝置。
如下圖,將USB隨身碟完整備份到電腦裡的硬碟中,檔名存成8G隨身碟.backup
。
如下圖,將USB隨身碟的完整備份檔8G隨身碟.backup
,還原到USB隨身碟裡。
使用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
指令的預設壓縮設定):
注意,「-si」參數和「"檔案在壓縮檔內的路徑和檔名"」這個字串間並沒有空格。
如果要壓制出容量更小,且擁有些微復原損壞能力的RAR壓縮檔案,可以使用以下指令格式:
小提示:在使用dd
和rar
備份儲存裝置時,最好先將該裝置的可用空間用數值0
擦除過,這樣壓縮後備份檔案會小很多哦!可以參考這篇文章來學習擦除可用空間。
如下圖,將USB隨身碟完整備份到電腦裡的硬碟中,檔名存成8G隨身碟.backup.rar
,壓縮檔大小僅有2.9GB。
之後若要將RAR的壓縮備份檔還原,需使用rar
的p
參數來直接將RAR的檔案解壓縮輸出到標準輸出中,再使用沒有指定if
參數的dd
指令來從標準輸入接收資料。指令如下: