Linux 使用dd和rar指令來備份或是還原檔案資料


電腦的軟體資料,是屬於無實體的財產,一旦損壞或是遭到覆寫,就很難再回復原本的狀態。還好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」(第一顆)...依此類推。而IDE硬碟的裝置名稱通常為「hda」、「hdb」、「hdc」...依此類推。如果儲存裝置下還有其他分割區,則會在裝置名稱後面串接數字來表示分割區,如「sda1」(第一顆磁碟的第一個分割區)、「sda2」(第一顆磁碟的第二個分割區)。

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

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

df 檔案路徑

Linux 使用dd和rar指令來備份或是還原檔案資料

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

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

dd if=輸入檔案路徑 of=輸出檔案路徑 bs=緩衝空間大小

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

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

Linux 使用dd和rar指令來備份或是還原檔案資料

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

Linux 使用dd和rar指令來備份或是還原檔案資料

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

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

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

https://magiclen.org/rar/
https://magiclen.org/rar-command/

要讓rar能夠接收從標準輸出串流傳來的資料,可以使用「|」字元將dd指令與rar指令隔開在同一行中。字元「|」左邊的指令輸出到標準輸出串流(stdout)中的資料,會成為字元「|」右邊指令的標準輸入串流(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 -ma5 -m5 -rr1 -si"檔案在壓縮檔內的路徑和檔名" 輸出壓縮檔案路徑

小提示:在使用dd和rar備份儲存裝置時,最好先將該裝置的可用空間用數值0擦除過,這樣壓縮後備份檔案會小很多哦!

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

Linux 使用dd和rar指令來備份或是還原檔案資料

之後若要將RAR壓縮備份檔還原,需使用rar的「p」參數和「-inul」參數來直接將RAR的檔案解壓縮輸出到stdout中,再使用沒有指定if參數的dd指令來使用stdin接收資料。指令如下:

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

Linux 使用dd和rar指令來備份或是還原檔案資料

關於作者

Magic Len

各位好,我是Magic Len,是這網站的管理員。我是台灣台中大肚山上人,畢業於台中高工資訊科和台灣科技大學資訊工程系,曾在桃機航警局服役。我熱愛自然也熱愛科學,喜歡和別人分享自己的知識與經驗。如果你有興趣認識我,可以加我的Facebook,並且請註明是從MagicLen來的。

相關文章