dd (Data Duplicator) 是 Linux 底層數據複製與轉換的核心工具,能直接操作塊設備、生成磁盤鏡像、擦除數據、轉換編碼格式。本文系統梳理核心參數、經典場景與避坑指南,助您驾馭這把「雙刃劍」。
| 參數 | 說明 | 典型值/示例 |
|---|---|---|
if=FILE | 輸入文件/設備 (默認 stdin) | if=/dev/sda, if=backup.img |
of=FILE | 輸出文件/設備 (默認 stdout) | of=/dev/sdb, of=backup.img |
bs=BYTES | 同時設置讀/寫塊大小 (覆蓋 ibs/obs) | bs=4M (4MB, 磁盤操作推薦), bs=1M |
ibs=BYTES | 讀取塊大小 | ibs=512 |
obs=BYTES | 寫入塊大小 | obs=4k |
count=BLOCKS | 僅複製指定塊數 (配合 bs 決定總量) | count=2048 (配合 bs=1M 複製 2GB) |
skip=BLOCKS | 跳過輸入開頭指定塊數 | skip=2048 |
seek=BLOCKS | 跳過輸出開頭指定塊數 | seek=2048 |
conv=NOTATION | 轉換選項 (可多個逗號分隔) | conv=sync,noerror, conv=ucase |
status=LEVEL | 進度顯示級別 | status=progress (顯示實時速度/進度), status=none |
iflag=FLAGS | 輸入標誌 | iflag=direct (繞過頁面緩存), iflag=fullblock |
oflag=FLAGS | 輸出標誌 | oflag=direct, oflag=sync (同步寫入) |
sync:每個輸入塊補齊至 ibs 大小 (NUL 填充),保證輸出塊對齊。noerror:讀取錯誤繼續執行 (配合 sync 保持位置對齊),損壞磁盤數據搶救必備。notrunc:不截斷輸出文件 (僅覆蓋對應區域)。fsync:寫入完成前調用 fsync() 確保數據落盤。swab:交換每對輸入字節 (大小端轉換)。ucase/lcase:字符大小寫轉換 (文本文件)。ascii/ebcdic/ibm:字符集編碼轉換。block/unblock:固定長度記錄與可變長度記錄轉換。# 備份整盤 /dev/sda 到映像文件 (需目標空間 ≥ 源盤容量)
dd if=/dev/sda of=/mnt/backup/sda_$(date +%F).img bs=4M status=progress conv=fsync
# 壓縮備份 (管道流式,不佔用中間空間)
dd if=/dev/sda bs=4M status=progress | gzip -c > /mnt/backup/sda_$(date +%F).img.gz
# 恢復 (解壓並寫入)
gunzip -c /mnt/backup/sda_2024-01-15.img.gz | dd of=/dev/sda bs=4M status=progress conv=fsync
# 備份根分區
dd if=/dev/sda2 of=/mnt/backup/root_part.img bs=4M status=progress conv=fsync
# 遷移至新磁盤同位置分區
dd if=/mnt/backup/root_part.img of=/dev/nvme0n1p2 bs=4M status=progress conv=fsync
dd if=ubuntu-22.04-desktop-amd64.iso of=/dev/sdX bs=4M status=progress conv=fsync oflag=direct
# oflag=direct 繞過緩存直接寫入,加快完成同步
# 注意:sdX 為整盤設備 (如 /dev/sdb),非分區 (sdb1)!
# dd 基礎版 (跳過錯誤塊,用 0 填充)
dd if=/dev/sda of=/mnt/rescue/sda_rescue.img bs=4M conv=sync,noerror status=progress
# 專業級:ddrescue (智能重試、反向讀取、斷點續傳)
ddrescue -f -n /dev/sda /mnt/rescue/sda.img /mnt/rescue/sda.map
ddrescue -f -r3 /dev/sda /mnt/rescue/sda.img /mnt/rescue/sda.map # 重試 3 次
# 單遍隨機數 (現代磁盤單遍足夠)
dd if=/dev/urandom of=/dev/sda bs=4M status=progress
# 多遍標準 (DoD 5220.22-M 3 遍)
for i in {1..3}; do dd if=/dev/urandom of=/dev/sda bs=4M status=progress; done
# 或使用專用工具: shred -v -n 3 /dev/sda
# 快速創建 20GB 稀疏文件 (實際佔用極小)
dd if=/dev/zero of=/var/lib/libvirt/images/vm_disk.qcow2 bs=1 count=0 seek=20G
# 配合 qemu-img 轉換格式
qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/vm_disk.qcow2 /var/lib/libvirt/images/vm_disk.qcow2
# 大寫轉小寫
dd if=input.txt of=output.txt conv=lcase
# EBCDIC 轉 ASCII (大數據遷移)
dd if=mainframe.dat of=linux.txt conv=ascii
| 風險 | 後果 | 防範措施 |
|---|---|---|
| if/of 顛倒 | 源數據被覆寫,不可逆損壞 | 執行前 三次確認,先 lsblk 核對設備路徑 |
| 目標設備較小 | 寫入截斷,數據不完整 | 確保 of 容量 ≥ if 數據量 (含 count 限制) |
| 未使用 bs=4M 等大塊 | 速度極慢 (默認 bs=512B) | 磁盤操作必加 bs=4M 或 bs=1M |
| 無 status=progress | 長時間無反饋,誤以為卡死 | 現代 dd 必加 status=progress |
| 運行中系統備份 | 文件系統不一致、數據庫損壞 | 掛載只讀、LVM 快照、或離線/單用戶模式 |
| conv=sync,noerror 缺失 | 損壞盤讀取中斷、輸出位置錯位 | 損壞盤搶救必加 此組合 |
# 遠程備份 (SSH 通道)
dd if=/dev/sda bs=4M | gzip -c | ssh user@backup_server "cat > /backup/sda_$(date +%F).img.gz"
# 遠程恢復
ssh user@backup_server "cat /backup/sda.img.gz" | gunzip -c | dd of=/dev/sda bs=4M conv=fsync
# 實時進度 (pv 管道查看器)
dd if=/dev/sda bs=4M | pv | dd of=/dev/sdb bs=4M
# 並行壓縮 (pigz 多線程 gzip)
dd if=/dev/sda bs=4M | pigz -p $(nproc) > /backup/sda.img.gz

if= of= bs=4M。status=progress conv=fsync (寫入) / conv=sync,noerror (讀取損壞盤)。lsblk -f 核對 UUID/LABEL。敬畏 dd 的毀滅性威力,掌握其參數矩陣,將其化為您存儲運維工具箱中最鋒利、最可控的利刃。
VirtualBox 端口映射失敗?Windows 網路堆疊修復指令大全
Linux Git Bash 中文亂碼徹底解決方案:編碼、顯示與 Vim 一站式配置
Linux less 指令進階完全指南:雙向捲動、搜尋、標記、多檔案、LESSOPEN 語法高亮
Linux Zsh 安裝與深度配置指南:從零打造高效現代 Shell 環境
chmod 權限管理精要:符號/八進位模式、三組身分、遞迴/參考檔、特殊權限、目錄執行位意義、umask 預設值
Linux Nginx 日志分析實戰:從配置到命令行挖掘異常流量
Linux 原始碼套件安裝完整指南:./configure、make、make install、前綴路徑、清理與解除安裝