程式扎記: [Linux 命令] dd : binary 讀取與寫入

標籤

2012年1月31日 星期二

[Linux 命令] dd : binary 讀取與寫入

前言 : 
dd 指令最大的功效應該是在於『備份』啊! 因為 dd 可以讀取磁碟裝置的內容(幾乎是直接讀取磁區"sector"),然後將整個裝置備份成一個檔案呢!真的是相當的好用啊~ dd 的用途有很多啦~但是這裡僅講一些比較重要的選項,如下 : 
- if=file : 就是 input file 囉~也可以是裝置. 預設是標準輸入.
- of=file : 就是 output file 喔~也可以是裝置. 預設為表準輸出.
- ibs=b : 一次讀入 b 個 bytes. (default: 512)
- obs=bytes : 一次寫入 b 個 bytes. (default: 512)
- bs=b : 規劃的一個 block 的大小,若未指定則預設是 512 bytes. 等於同時設置 ibs 與 obs. (一個 sector 的大小)
- skip=blocks : 從輸入文件跳過 blocks 個區塊後, 再開始進行複製.
- seek=blocks : 從輸出文件跳過 blocks 個區塊後, 再開始進行複製. (通常只有當輸出為磁碟或裝置才有用)
- count=blocks : 僅拷貝 blocks 個區塊. 區塊的大小可以由 ibs 或 bs 設置.

實例介紹 : 
- 整盘数据备份与恢复 
可以使用下面命令 "備份" /dev/hdx 到 /dev/hdy : 
# dd if=/dev/hdx of=/dev/hdy

使用下面命令 "備份" /dev/hdx 並用 gzip 壓縮後存到 /path/to/image.gz : 
# dd if=/dev/hdx | gzip >/path/to/image.gz

使用下面命令 "還原" /path/to/image.gz 到 /dev/hdx : 
# gzip -dc /path/to/image.gz | dd of=/dev/hdx

- 備份MBR 
使用下面命令 "備份" 磁盤開頭 512 bytes 的 MBR 到 /path/to/image : 
# dd if=/dev/hdx of=/path/to/image count=1 bs=512

使用下面命令將剛剛備份的 MBR "還原" 到指定磁盤 : 
# dd if=/path/to/image of=/dev/hdx

- 拷貝内存資料到硬碟 
使用下面命令將內存資料複製到 /root/mem.bin : 
# dd if=/dev/mem of=/root/mem.bin bs=1024

- 從光碟拷貝 iso 映像檔 
使用下面命令將 光碟內容 "拷貝" 到 /root/cd.iso : 
# dd if=/dev/cdrom of=/root/cd.iso

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

- binary 檔案的讀取 
考慮你有一個 binary 的檔案 test.bin, 假設你想要 skip 前面的 10 bytes, 並讀取接下來的 10 bytes, 則你可以這麼做 : 
$ hexdump -Cv test.bin # 以 hex 讀取 test.bin
00000000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................|
00000010 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f |................|
00000020 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f | !"#$%&'()*+,-./|
00000030 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f |0123456789:;<=>?|
00000040 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f |@ABCDEFGHIJKLMNO|
00000050 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f |PQRSTUVWXYZ[\]^_|
00000060 60 61 62 63 64 |`abcd|
00000065
$ dd if=test.bin bs=1 count=10 skip=10 of=out.bin # 從第11個 byte 開始連續讀 10 個 byte. 記得設定 bs=1 說明 count 一次為一個 byte
10+0 records in
10+0 records out
10 bytes (10 B) copied, 0.000508929 s, 19.6 kB/s
$ hexdump -Cv out.bin # 以 hex 檢視輸出結果
00000000 0a 0b 0c 0d 0e 0f 10 11 12 13 |..........|
0000000a

補充說明 : 
linux dd命令参数及用法详解 
鳥哥Linux 私房菜 : 特殊裝置 loop 掛載 (映象檔不燒錄就掛載使用) 
想像一下如果今天我們從國家高速網路中心(http://ftp.twaren.net)或者是義守大學(http://ftp.isu.edu.tw)下載了 Linux 或者是其他所需光碟/DVD的映象檔後, 難道一定需要燒錄成為光碟才能夠使用該檔案裡面的資料嗎?當然不是啦!我們可以透過 loop 裝置來掛載的...

新手看招:Linux作業系統下的dd命令技巧 
鳥哥 Linux 私房菜 : 檔案與檔案系統的壓縮與打包 - dd

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!