小dd的用法

來源:互聯網
上載者:User

先簡要介紹dd的參數,後邊通過幾個執行個體介紹dd的應用,參考了其他網友的資料,在此一併感謝。
dd 是 Linux/UNIX 下的一個非常有用的命令,作用是用指定大小的塊拷貝一個檔案,並在拷貝的同時進行指定的轉換。

1. 命令簡介

dd 的主要選項:

指定數位地方若以下列字元結尾乘以相應的數字:

b=512, c=1, k=1024, w=2, xm=number m

if=file

輸入檔案名稱,預設為標準輸入。

of=file

輸出檔案名,預設為標準輸出。

ibs=bytes

一次讀入 bytes 個位元組(即一個塊大小為 bytes 個位元組)。

obs=bytes

一次寫 bytes 個位元組(即一個塊大小為 bytes 個位元組)。

bs=bytes

同時設定讀寫塊的大小為 bytes ,可代替 ibs 和 obs 。

cbs=bytes

一次轉換 bytes 個位元組,即轉換緩衝區大小。

skip=blocks

從輸入檔案開頭跳過 blocks 個塊後再開始複製。

seek=blocks

從輸出檔案開頭跳過 blocks 個塊後再開始複製。(通常只有當輸出檔案是磁碟或磁帶時才有效)。

count=blocks

僅拷貝 blocks 個塊,塊大小等於 ibs 指定的位元組數。

conv=conversion[,conversion...]

用指定的參數轉換檔。

轉換參數:

ascii 轉換 EBCDIC 為 ASCII。

ebcdic 轉換 ASCII 為 EBCDIC。

ibm 轉換 ASCII 為 alternate EBCDIC.

block 把每一行轉換為長度為 cbs 的記錄,不足部分用空格填充。

unblock 使每一行的長度都為 cbs ,不足部分用空格填充。

lcase 把大寫字元轉換為小寫字元。

ucase 把小寫字元轉換為大寫字元。

swab 交換輸入的每對位元組。

noerror 出錯時不停止。

notrunc 不截短輸出檔案。

sync 把每個輸入塊填充到ibs個位元組,不足部分用空(NUL)字元補齊。

2.執行個體分析

2.1.資料備份與恢複

2.1.1整盤資料備份與恢複

備份:

dd if=/dev/hdx of=/dev/hdy

將本地的/dev/hdx整盤備份到/dev/hdy

dd if=/dev/hdx of=/path/to/image

將/dev/hdx全盤資料備份到指定路徑的image檔案

dd if=/dev/hdx | gzip >/path/to/image.gz

備份/dev/hdx全盤資料,並利用gzip工具進行壓縮,儲存到指定路徑
恢複:

dd if=/path/to/image of=/dev/hdx

將備份檔案恢複到指定盤

gzip -dc /path/to/image.gz | dd of=/dev/hdx

將壓縮的備份檔案恢複到指定盤

2.1.2.利用netcat遠程備份

dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234

在源主機上執行此命令備份/dev/hda

netcat -l -p 1234 | dd of=/dev/hdc bs=16065b

在目的主機上執行此命令來接收資料並寫入/dev/hdc

netcat -l -p 1234 | bzip2 > partition.img

        netcat -l -p 1234 | gzip > partition.img

以上兩條指令是目的主機指令的變化分別採用bzip2  gzip對資料進行壓縮,並將備份檔案儲存在目前的目錄。

2.1.3.備份MBR

備份:

dd if=/dev/hdx of=/path/to/image count=1 bs=512

備份磁碟開始的512Byte大小的MBR資訊到指定檔案
恢複:

dd if=/path/to/image of=/dev/hdx

將備份的MBR資訊寫到磁碟開始部分

2.1.4.備份磁碟片

dd if=/dev/fd0 of=disk.img count=1 bs=1440k

將軟碟機資料備份到目前的目錄的disk.img檔案

2.1.5.拷貝記憶體資料到硬碟

dd if=/dev/mem of=/root/mem.bin bs=1024

將記憶體裡的資料拷貝到root目錄下的mem.bin檔案

2.1.6.從光碟片拷貝iso鏡像

dd if=/dev/cdrom of=/root/cd.iso

拷貝光碟片資料到root檔案夾下,並儲存為cd.iso檔案

2.2.增加Swap分區檔案大小

              

 dd if=/dev/zero of=/swapfile bs=1024 count=262144

建立一個足夠大的檔案(此處為256M)

mkswap /swapfile

把這個檔案變成swap檔案

swapon /swapfile

啟用這個swap檔案

/swapfile swap swap defaults 0 0

在每次開機的時候自動載入swap檔案, 需要在 /etc/fstab 檔案中增加一行

2.3.銷毀磁碟資料

dd if=/dev/urandom of=/dev/hda1

利用隨機的資料填充硬碟,在某些必要的場合可以用來銷毀資料。執行此操作以後,/dev/hda1將無法掛載,建立和拷貝操作無法執行。

2.4磁碟管理

2.4.1.得到最恰當的block size

dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

        dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file

        dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file   

        dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

通過比較dd指令輸出中所顯示的命令執行時間,即可確定系統最佳的block size大小

2.4.2測試硬碟讀寫速度

dd if=/root/1Gb.file bs=64k | dd of=/dev/null

        dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

通過上兩個命令輸出的執行時間,可以計算出測試硬碟的讀/寫速度

2.4.3.修複硬碟

dd if=/dev/sda of=/dev/sda

當硬碟較長時間(比如1,2年)放置不使用後,磁碟上會產生magnetic flux point。當磁頭讀到這些地區時會遇到困難,並可能導致I/O 錯誤。當這種情況影響到硬碟的第一個扇區時,可能導致硬碟報廢。上邊的命令有可能使這些資料起死回生。且這個過程是安全,高效的。
2.4.4    複製磁碟
1)確保原盤和目的盤幾何特性相同
2)成為超級使用者
3)在用主盤的系統中輸入touch /reconfigure,有主盤的系統需要/reconfigure檔案,以便在重新啟動時發現複製盤
4)輸入init 0關閉系統
5)將複製盤串連到系統並開機
6)在OK提示符下輸入boot
7)輸入dd if=/dev/dsk/device-name of=/dev/dsk/device-name bs=blocksize (輸入檔案if是主盤裝置,輸入檔案of是複製盤裝置)
8)輸入fsck /dev/rdsk/device-name (檢測新的檔案系統)
9)輸入mount /dev/rdsk/device-name /mnt 載入複製盤的root檔案系統。
10)編輯複製盤上的/etc/vfstab檔案,指向正確的裝置名稱。
11)輸入umount/mnt ,卸載複製盤的root檔案系統。
12)輸入init 0關閉系統。
13)輸入boot diskN -s以單一使用者模式引導複製盤。
14)輸入sys-uconfig恢複配置複製盤,在該盤配置恢複後系統關閉。
15)輸入boot diskN 引導複製盤
16)提供相關的系統資訊。(HOSTNAME TIMEZONE IP...)
17)系統完成,即作為超級使用者登入驗證系統資訊。
例:
#dd if=/dev/dsk/c0t0d0s2 of=/dev/dsk/c0t1d0s2 bs=100k
#fsck /dev/rdsk/c0t1d0s2
#mount /dev/rdsk/c0t1d0s2 /mnt
#cd /mnt/etc
#vi /etc/vfstab
#cd /;umount /mnt
#init 0
OK boot disk2 -s
#sys-unconfig
OK boot disk2 -s

2.5    DD命令分割檔案的實際例子:
為了將一台安裝SCO UNIX 5.0.5主機上的TAR打包檔案備份,需要將其通過網路傳送到另外一台配有磁帶機的UNIX主機上。兩台主機通過TX530網卡相連,用FTP傳送的時候,前幾個檔案分別在10M、20M位元組大小,都能夠順利傳送。但其中有一個檔案壓縮後體積已達98M之巨,傳送了幾次,要麼只能傳40M,要麼只能傳20M左右就導致網路崩潰,換畫面PING對方主機,本應為零的速率延遲降為2400多毫秒,而且誤碼率極高,只有重新啟動兩台主機才能恢複網路通訊。
UNIX的SHELL功能強大,非WINDOWS可比,從上面使用的TAR、FTP已可管窺。同樣,UNIX已經提供了檔案切割功能,不需要費力氣去尋找第三方的檔案切割程式。能完成這個功能的UNIX命令就是DD。
要切割的大檔案為DGJD,共98336321位元組,則:
dd if=dgjd of=zz1 bs=1 count=20000000
dd if=dgjd of=zz2 bs=1 count=20000000 skip=20000000
dd if=dgjd of=zz3 bs=1 count=20000000 skip=40000000
dd if=dgjd of=zz4 bs=1 count=20000000 skip=60000000
dd if=dgjd of=zz5 bs=1 count=18336321 skip=80000000
其中IF(INPUT FILENAME)是要切割的大檔案名稱,OF(OUTPUT FILENAME)是切割後的子檔案名稱,BS是指明以多少位元組作為一個切割記錄單位,COUNT是要切割的單位記錄數,SKIP是說明切割時的起點,單位同樣以BS設定值為準。通過上述五條指令就將 DGJD大檔案切割成為4個2千萬位元組、1個18336321位元組的子檔案。要注意的是SKIP的值不能錯。 由此
也不難看出,DD切割是“非損耗”式的切割,並且支援從任意位置開始的任意大小的切割。
要將產生的ZZ1、ZZ2、ZZ3、ZZ4四個子檔案組裝為XDGJD,則:
dd if=zz1 of=xdgjd bs=1 count=20000000
dd if=zz2 of=xdgjd bs=1 count=20000000 seek=20000000
dd if=zz3 of=xdgjd bs=1 count=20000000 seek=40000000
dd if=zz4 of=xdgjd bs=1 count=20000000 seek=60000000
dd if=zz5 of=xdgjd bs=1 count=18336321 seek=80000000
其中SKIP參數改為SEEK參數,指明組裝的新大檔案XDGJD每次的開始位置是從檔案頭開始多少位元組。如果預設,則組裝從檔案頭開始,顯然這不是我們每次都希望的,所以需用SEEK參數明確指出開始位置。通過以上5個指令,即可將5個子檔案重新組裝為一個大檔案。將切割後產生的子檔案重新用FTP傳送,結果有的能夠順利傳送, 有的仍然導致網路癱瘓,不怕,繼續切割,切成每個一千萬位元組,再傳,OK!成功傳送!
測試表明,每次傳送的檔案最好小於12M位元組,否則可能導致網路故障。另外,DD這個命令最初是為了進行編碼轉換而設計的,用於在大型主機中將EBCDIC 字元代碼轉換為ASCII代碼,但此功能已不常用,現在DD成了檔案系統備份的工具,以及做一些類似檔案切割的“另類業務”,正所謂“有心栽花花不開,無心插柳柳成蔭”,不過對於使用者來說,重要的是軟體能否完成自己需要的功能,它的“本職工作”是什麼並不重要,“不管白貓黑貓,捉住老鼠就是好貓”!實用為本,軟體的生命力就在於實用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.