1. 程式人生 > >Linux中dd命令的用法

Linux中dd命令的用法

dd

dd命令: convert and copy a file



用法:

dd?if=/PATH/FROM/SRC?of=/PATH/TO/DEST
bs=#:?block?size,?復制單元大小
count=#:復制多少個bs
of=file?寫到所命名的文件而不是到標準輸出
if=file?從所命名文件讀取而不是從標準輸入
bs=size?指定塊大小(既是ibs也是obs)
ibs=size?一次讀size個byte
obs=size?一次寫size個byte
cbs=size?一次轉化size個byte
skip=blocks?從開頭忽略blocks個ibs大小的塊
seek=blocks?從開頭忽略blocks個obs大小的塊
count=n?只拷貝n個記錄



用指定的參數轉換文件:

conv=conversion[,conversion...]



轉換參數:

ascii?轉換?EBCDIC?為?ASCII
ebcdic?轉換?ASCII?為?EBCDIC
block?轉換一行數據為長度為?cbs?的記錄,不足部分用空格填充。
unblock?替代cbs長度的每一行尾的空格為新行
lcase?把大寫字符轉換為小寫字符
ucase?把小寫字符轉換為大寫字符
nocreat?不創建輸出文件
noerror?出錯時不停止
notrunc?不截斷輸出文件
sync?把每個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊。



備份:

dd?if=/dev/sdx?of=/dev/sdy

將本地的/dev/sdx整盤備份到/dev/sdy

dd?if=/dev/sdx?of=/path/to/image

將/dev/sdx全盤數據備份到指定路徑的image文件

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

備份/dev/sdx全盤數據,並利用gzip工具進行壓縮,保存到指定路徑。



恢復:

dd?if=/path/to/image?of=/dev/sdx

將備份文件恢復到指定盤

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

將壓縮的備份文件恢復到指定盤。



拷貝內存資料到硬盤:

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

將內存裏的數據拷貝到root目錄下的mem.bin文件。



從光盤拷貝iso鏡像:

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

拷貝光盤數據到root文件夾下,並保存為cd.iso文件。



銷毀磁盤數據:

dd?if=/dev/urandom?of=/dev/sda1

利用隨機的數據填充硬盤,在某些必要的場合可以用來銷毀數據。執行此操作以後,/dev/ sda1將無法掛載,創建和拷貝操作無法執行。



得到最恰當的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指令輸出中所顯示的命令執行時間,即可確定系統最佳的block size大小:

測試硬盤讀寫速度:

dd?if=/dev/zero?of=/root/1Gb.file?bs=1024?count=1000000
dd?if=/root/1Gb.file?bs=64k?|?dd?of=/dev/null

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



修復硬盤:

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

當硬盤較長時間(比如1,2年)放置不使用後,磁盤上會產生消磁點。當磁頭讀到這些區域時會遇到困難,並可能導致I/O錯誤。當這種情況影響到硬盤的第一個扇區時,可能導致硬盤報廢。上邊的命令有可能使這些數據起死回生,且這個過程是安全高效的。



示例:

1.備份MBR:

[root@anonymous?~]#dd?if=/dev/sda1?of=/tmp/mbr.bak?bs=512
?count=11+0?records?in
1+0?records?out
512?bytes?(512?B)?copied,?0.000160395?s,?3.2?MB/s

2.有一個大於2K的二進制文件fileA。現在想從第64個字節位置開始讀取,需要讀取的大小是128Byts。又有fileB, 想把上面讀取到的128Bytes寫到第32個字節開始的位置,替換128Bytes,請問如何實現?

[root@anonymous?~]#dd?if=fileA?of=fileB?bs=1?count=128?skip=63?seek=31?conv=notrunc
128+0?records?in
128+0?records?out
128?bytes?(128?B)?copied,?0.000421017?s,?304?kB/s

3.創建一個2G的文件系統,塊大小為2048byte,預留1%可用空間,文件系統ext4,卷標為TEST,要求此分區開機後自動掛載至/test目錄,且默認有acl掛載選項


????[root@anonymous?~]#dd?if=/dev/zero?of=test?bs=1M?count=2048
????2048+0?records?in
????2048+0?records?out
????2147483648?bytes?(2.1?GB)?copied,?121.521?s,?17.7?MB/s
????[root@anonymous?~]#mkfs.ext4?-b?2048?-L?‘TEST‘?-m?1?test
????mke2fs?1.41.12?(17-May-2010)
????test?is?not?a?block?special?device.
????Proceed?anyway??(y,n)?y
????Filesystem?label=TEST
????OS?type:?Linux
????Block?size=2048?(log=1)
????Fragment?size=2048?(log=1)
????Stride=0?blocks,?Stripe?width=0?blocks
????131072?inodes,?1048576?blocks
????10485?blocks?(1.00%)?reserved?for?the?super?user
????First?data?block=0
????Maximum?filesystem?blocks=537919488
????64?block?groups
????16384?blocks?per?group,?16384?fragments?per?group
????2048?inodes?per?group
????Superblock?backups?stored?on?blocks:?
????16384,?49152,?81920,?114688,?147456,?409600,?442368,?802816
????
????Writing?inode?tables:?done????????????????????????????
????Creating?journal?(32768?blocks):?done
????Writing?superblocks?and?filesystem?accounting?information:?done
????
????This?filesystem?will?be?automatically?checked?every?35?mounts?or
????180?days,?whichever?comes?first.??Use?tune2fs?-c?or?-i?to?override.
????[root@anonymous?~]#tune2fs?-o?acl?test?
????tune2fs?1.41.12?(17-May-2010)
????[root@anonymous?~]#echo?‘/root/test?/mnt/test??ext4??defaults??0?0‘?>>?/etc/fstab
????[root@anonymous?~]#echo?‘/root/test?/mnt/test??ext4??defaults,loop??0?0‘?>>?/etc/fstab
????[root@anonymous?~]#mount?-a


Linux中dd命令的用法