dd
是一個功能強大的 Unix/Linux 命令行工具,用于低級別的字節流操作,常用于創建、復制、轉換和處理文件或設備數據。它在 macOS 和 Linux 系統上都可用,但在 macOS 上有一些細微差異。本文將詳細講解 dd
命令的用法,包括參數、常見用例、注意事項以及 macOS 特定的細節。
1. dd
命令概述
dd
(data duplicator)是一個低級工具,可以從輸入源(如文件、設備或標準輸入)讀取數據,并將其寫入輸出目標(如文件、設備或標準輸出)。它的靈活性使其適用于多種場景,如創建固定大小的文件、備份磁盤、轉換數據格式等。由于其直接操作字節流的特性,使用時需謹慎,以免覆蓋重要數據。
基本語法
dd [選項]
常見選項包括:
if=FILE
:指定輸入文件或設備(如/dev/zero
、/dev/urandom
)。of=FILE
:指定輸出文件或設備。bs=BYTES
:設置塊大小(如1k
、1M
、1G
)。count=N
:指定要復制的塊數。skip=N
:跳過輸入文件開頭的 N 個塊。seek=N
:跳過輸出文件開頭的 N 個塊。conv=CONVERSIONS
:指定數據轉換選項(如notrunc
、sync
)。status=LEVEL
:控制進度輸出(none
、noxfer
、progress
)。
2. 核心參數詳解
以下是 dd
的主要參數及其作用:
if
(輸入文件)
- 指定數據來源,默認為標準輸入(
/dev/stdin
)。 - 示例:
/dev/zero
:生成全零字節流。/dev/urandom
:生成隨機字節流。- 普通文件:如
input.txt
。 - 設備:如
/dev/sda
(磁盤設備)。
of
(輸出文件)
- 指定數據寫入目標,默認為標準輸出(
/dev/stdout
)。 - 示例:
- 普通文件:如
output.bin
。 - 設備:如
/dev/sdb
(U 盤)。 /dev/null
:丟棄數據(常用于測試)。
- 普通文件:如
bs
(塊大小)
- 定義每次讀寫的塊大小,單位可以是字節(默認)或使用后綴:
k
:1KB(1024 字節)M
:1MB(10242 字節)G
:1GB(10243 字節)
- 示例:
bs=1M
表示每次讀寫 1MB。 - 注意:macOS 的
dd
支持小寫m
和大寫M
,但 Linux 更嚴格,推薦使用大寫。
count
(塊數)
- 指定復制的塊數,總數據量 =
bs × count
。 - 示例:
bs=1M count=100
表示復制 100MB 數據。
skip
和 seek
skip=N
:跳過輸入文件開頭的 N 個塊。seek=N
:跳過輸出文件開頭的 N 個塊。- 示例:
skip=10
表示從輸入文件的第 11 個塊開始讀取。
conv
(轉換選項)
- 指定數據處理方式,多個選項用逗號分隔:
notrunc
:不截斷輸出文件(追加而非覆蓋)。sync
:用填充字節(如零)補齊塊大小。fsync
:在寫入完成前同步數據到磁盤。nocache
:避免使用緩存(Linux 特有)。
- 示例:
conv=notrunc
確保追加數據到現有文件。
status
(進度輸出)
- 控制
dd
的輸出信息:status=progress
:顯示實時進度(macOS 和較新 Linux 支持)。status=none
:抑制所有輸出。status=noxfer
:僅抑制傳輸統計信息。
- 示例:
dd if=/dev/zero of=output.bin bs=1M count=100 status=progress
3. 常見用例
以下是一些常見的 dd
使用場景,包含示例命令和說明。
3.1 創建固定大小的文件
-
創建 100MB 的全零文件:
dd if=/dev/zero of=output.bin bs=1m count=100
if=/dev/zero
:從零字節流讀取。of=output.bin
:寫入output.bin
。bs=1m count=100
:生成 100MB 數據。- macOS 兼容,輸出文件為 100MB。
-
創建 100MB 的隨機數據文件:
dd if=/dev/urandom of=output.bin bs=1m count=100
- 使用
/dev/urandom
生成隨機數據。
- 使用
3.2 備份磁盤或分區
-
備份磁盤到文件:
dd if=/dev/sda of=backup.img bs=4M
- 從磁盤
/dev/sda
讀取,寫入backup.img
。 bs=4M
提高效率。
- 從磁盤
-
恢復備份到磁盤:
dd if=backup.img of=/dev/sdb bs=4M
- 注意:目標磁盤會被覆蓋,需謹慎!
3.3 復制文件
- 復制文件:
dd if=input.txt of=output.txt bs=64k
- 復制
input.txt
到output.txt
。 bs=64k
優化性能。
- 復制
3.4 測試磁盤性能
- 測試寫入速度:
dd if=/dev/zero of=testfile bs=1M count=1000 status=progress
- 寫入 1GB 數據到
testfile
,顯示進度和速度。
- 寫入 1GB 數據到
3.5 創建啟動盤
- 將 ISO 寫入 U 盤:
dd if=ubuntu.iso of=/dev/disk2 bs=4m status=progress
- macOS 示例,
disk2
為 U 盤設備(通過diskutil list
確認)。 - 注意:需
sudo
,且目標設備會被格式化。
- macOS 示例,
3.6 擦除磁盤
- 用零填充磁盤:
dd if=/dev/zero of=/dev/disk2 bs=1m
- 將整個磁盤填充為零,清除數據。
4. macOS 特定注意事項
由于你在 macOS 上使用 dd
,以下是一些 macOS 特定的細節:
4.1 塊大小單位
- macOS 的
dd
支持k
(1024 字節)、m
(10242 字節)、g
(10243 字節),大小寫均可。 - 示例:
bs=1m
和bs=1M
均有效。
4.2 設備路徑
- macOS 的磁盤設備通常為
/dev/diskN
(如/dev/disk2
)。 - 使用
diskutil list
查看設備路徑。 - 寫入設備時,可能需要卸載磁盤:
diskutil unmountDisk /dev/disk2
4.3 權限問題
- 寫入設備(如 U 盤)需要
sudo
:sudo dd if=input.iso of=/dev/disk2 bs=4m
4.4 進度顯示
- macOS 的
dd
默認不顯示進度,但較新版本(macOS 10.11 及以上)支持status=progress
。 - 替代方法:發送
SIGINFO
信號查看進度:- 運行
dd
命令。 - 按
Ctrl+T
查看當前狀態。
- 運行
4.5 性能優化
- macOS 的
dd
默認使用緩存,可能會影響性能。 - 使用
conv=fsync
確保數據寫入磁盤,但會稍慢:dd if=/dev/zero of=output.bin bs=1m count=100 conv=fsync
5. 注意事項
- 數據覆蓋風險:
dd
直接操作字節流,錯誤的目標(如of=/dev/sda
)可能導致數據丟失。始終檢查of
參數。 - 塊大小選擇:較大的
bs
(如1M
或4M
)通常提高性能,但過大可能導致內存問題。 - 錯誤處理:
dd
默認輸出錯誤到 stderr,建議檢查返回值:dd if=/dev/zero of=output.bin bs=1m count=100 && echo "Success" || echo "Failed"
- macOS vs Linux:macOS 的
dd
不支持某些 Linux 專有選項(如conv=nocache
),但核心功能一致。
6. 示例:結合上下文
根據你之前的任務(創建 100MB 文件并用于 sendfile
),可以用以下命令生成測試文件:
dd if=/dev/zero of=example.txt bs=1m count=100 status=progress
- 這將在 macOS 上創建 100MB 的
example.txt
,可用于你的 TCP 服務器測試。 - 如果需要隨機數據:
dd if=/dev/urandom of=example.txt bs=1m count=100 status=progress
7. 高級用法
-
管道操作:
dd if=/dev/urandom bs=1M count=100 | gzip > output.bin.gz
- 生成 100MB 隨機數據并壓縮。
-
部分文件復制:
dd if=input.bin of=output.bin bs=1M skip=10 count=20
- 從第 10MB 開始復制 20MB 數據。
-
轉換大小寫:
dd if=input.txt of=output.txt conv=ucase
- 將輸入文件內容轉換為大寫。
8. 總結
dd
是一個功能強大但需謹慎使用的工具,適合低級別數據操作。在 macOS 上,核心功能與 Linux 一致,但需注意設備路徑、權限和進度顯示的差異。通過合理設置 bs
和 count
,可以高效完成文件創建、備份等任務。