dd,是 device driver 的縮寫,它可以稱得上是“Linux 世界中的搬運工”,它用來讀取裝置、檔案中的內容,並原封不動地複製到指定位置。
當我們用 dd 命令讀取 /dev/null 檔案時,就可以創造出空洞檔案,而如果你的磁碟足夠大,你甚至可以創造出一個宇宙黑洞呢!
備份磁碟並恢復
好記性不如爛筆頭,好硬碟不如常備份。硬碟的損壞雖然是個小概率事件,但是一旦發生卻會帶來災難性的後果。對重要資料進行備份,不僅是一個好習慣,更體現了對別人對自己負責的態度。
寫到這裡,突然意識到我的硬碟裡面存有很多珍貴的資料,一想到可能會因為磁碟故障而永遠失去它們,心裡就不禁一顫,趕緊把資料備份提上日程吧!
之前看過一些介紹 dd 的文章,例子中基本都是使用 hda、hdb 這種 IDE 介面的硬碟,其實現在的主流硬碟已經是 SATA 介面的了,下面我要備份的硬碟是 dev/sda,它就是塊 SATA 盤。
[[email protected] ~]# dd if=/dev/sda of=/root/sda.img
這個命令將 sda 盤備份到指定檔案 /root/sda.img 中去,其中用到了如下兩個選項:
-
if=檔名:指定輸入檔名或者裝置名,如果省略“if=檔名”,則表示從標準輸入讀取。
-
of=檔名:指定輸出檔名或者裝置名,如果省略“of=檔名”,則表示寫到標準輸出。
通過上面的 dd 命令,我們得到了 sda.img 檔案,它就是已經備份好了的磁碟映像檔案,裡面儲存著 /dev/sda 整塊硬碟的內容。
在未來的某天,假如 /dev/sda 硬碟真的出現了故障,我們就可以將曾經備份的 sda.img 複製到另一台電腦上,並將其恢復到指定的 sdb 盤中去。
[[email protected] ~]# dd if=/root/sda.img of=/dev/sdb
如果能把目標硬碟直接連線到我們現在的電腦上,並讓系統識別到這塊新硬碟,例如識別成 /dev/sdc,那麼我們可以直接使用 dd 命令將 sda 盤複製到 sdc 中去。這種用法既可以用來整盤備份,也可以用來快速複製系統環境。下面來看看具體的命令:
[[email protected] ~]# dd if=/dev/sda of=/dev/sdc
對 dd 來說,所有裝置和檔案都一視同仁,所謂的“備份”和“恢復”,dd 都認為是一種內容的複製。dd 操作就是簡單的按位元組複製。簡單、直觀,就是我對 dd 的最直接的感受。
備份時進行壓縮
資料沒有壓縮就進行整盤備份,勢必需要很大的備份空間,從而導致備份成本升高。這對於備份場景來說,是低效能的表現。
假如遇到磁碟空間不足,連備份操作都沒辦法圓滿完成:
#看, 報出了磁碟空間不足的警告
[[email protected] ~]# dd if=/dev/sda of=/root/sda.img
dd: writing to '/root/sda.img': No space left on device
其實我們在使用 dd 做備份時,可以使用 gzip 或者 bzip2 壓縮演算法進行資料壓縮處理,這樣可以大大減少我們的磁碟空間用量,也就降低了備份成本。
下面就使用 gzip 壓縮演算法配合 dd 命令來備份 /dev/sda 盤:
#沒有指定of則表示輸出到標準輸出
[[email protected] ~]# dd if=/dev/sda | gzip > /root/sda.img.gz
然後再將其恢復到 /dev/sdb 盤中去,方法如下:
#沒有指定if就表示從標準輸入讀取
下面我們更換 bzip2 壓縮演算法配合 dd 命令再來實現一遍上面範例的效果:
[[email protected] ~]# dd if=/dev/sda | bzip2 > disk.img.bz2
[[email protected] ~]# bzip2 -dc /root/sda.img.gz | dd of=/dev/sdc
分割區、記憶體、軟碟一個都不能少
在上面的內容中,介紹的都是備份整盤的知識,那如果只是想備份某一個分割區的資料,應該如何操作呢?
賣了一個關子,其實在 dd 命令看來,備份整盤和備份分割區,在命令形式上並沒有區別,我們來看範例:
[[email protected] ~]# dd if=/dev/sda2 of=/root/sda_part1.img
同理,將記憶體中的資料整體備份,照樣可以如法炮製:
[[email protected] ~]# dd if=/dev/mem of=/root/mem.img
隨著科技的飛速發展,無論是桌上型電腦還是筆電,都已經取消了軟碟機和光碟機裝置,軟碟和光碟也已經接近滅絕的邊緣,很多九零后們應該都不知道軟碟機為何物了吧。
所以接下來要介紹的軟碟、光碟備份法,權當是追憶過去吧,謹以此內容來懷念我們逝去的青春。
#備份軟碟
[[email protected] ~]# dd if=/dev/fd0 of=/root/fd0.img count=1 bs=1440k
#備份光碟
[[email protected] ~]# dd if=/dev/cdrom of=/root/cd.img
對於 dd 命令來說,除了 if、of 兩個選項之外,還應該掌握下面這兩個重要選項:
-
bs=N:設定單次讀入或單次輸出的資料塊(block)的大小為 N 個位元組。當然也可以使用 ibs 和 obs 選項來分別設定。
-
ibs=N:單次讀入的資料塊(block)的大小為 N 個位元組,預設為 512 位元組。
-
obs=N:單次輸出的資料塊(block)的大小為 N 個位元組,預設為 512 位元組。
-
count=N:表示總共要複製 N 個資料塊(block)。
所以這裡備份的軟碟大小是 1440kB,可以看出這是一塊 3 寸盤,其大小為 1.44MB。為了追憶青春,我們再來一起看看軟碟的樣子。