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檔案
從CD光牒拷貝iso鏡像
dd if=/dev/cdrom of=/root/cd.iso
拷貝CD光牒資料到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
dd if=/dev/zero bs=4096 count=250000
通過比較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