Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux dd 命令深度解析:從磁盤鏡像備份到數據轉換的瑞士軍刀

編輯:關於 Linux

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 (同步寫入)

關鍵 conv 選項詳解

  • sync:每個輸入塊補齊至 ibs 大小 (NUL 填充),保證輸出塊對齊。
  • noerror:讀取錯誤繼續執行 (配合 sync 保持位置對齊),損壞磁盤數據搶救必備。
  • notrunc:不截斷輸出文件 (僅覆蓋對應區域)。
  • fsync:寫入完成前調用 fsync() 確保數據落盤。
  • swab:交換每對輸入字節 (大小端轉換)。
  • ucase/lcase:字符大小寫轉換 (文本文件)。
  • ascii/ebcdic/ibm:字符集編碼轉換。
  • block/unblock:固定長度記錄與可變長度記錄轉換。

二、經典實戰場景

場景 1:完整磁盤鏡像備份與恢復 (離線操作)

# 備份整盤 /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

場景 2:分區級備份與遷移

# 備份根分區
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

場景 3:制作 USB 啟動盤 (ISO 寫入)

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)!

場景 4:損壞磁盤數據搶救 (配合 ddrescue 更佳)

# 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 次

場景 5:安全擦除磁盤 (多遍覆寫)

# 單遍隨機數 (現代磁盤單遍足夠)
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

場景 6:創建固定大小稀疏文件 (虛擬機磁盤)

# 快速創建 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

場景 7:字符編碼/大小寫轉換 (文本處理)

# 大寫轉小寫
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 缺失損壞盤讀取中斷、輸出位置錯位損壞盤搶救必加 此組合

四、進階:dd 與管道組合拳

# 遠程備份 (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

dd命令參數速查卡

五、總結

  • 核心三元組:if= of= bs=4M。
  • 必備護身符:status=progress conv=fsync (寫入) / conv=sync,noerror (讀取損壞盤)。
  • 生死線:if/of 絕不顛倒,操作前 lsblk -f 核對 UUID/LABEL。
  • 專業場景:磁盤鏡像、USB 啟動盤、損壞盤搶救、安全擦除、稀疏文件創建。

敬畏 dd 的毀滅性威力,掌握其參數矩陣,將其化為您存儲運維工具箱中最鋒利、最可控的利刃。

Copyright © Windows教程網 All Rights Reserved