Table of Contents
- Understanding dd Basics
- Preparing for Backup/Recovery
- Creating Disk/Partition Backups
- Restoring from Backups
- Advanced dd Techniques
- Troubleshooting Common Issues
- Best Practices
- Conclusion
- References
Understanding dd Basics
Before diving into backups, let’s master dd fundamentals. The tool’s syntax is deceptively simple:
dd if=<input> of=<output> [options]
Key Parameters
if=<input>: The input source (e.g., a disk/dev/sda, partition/dev/sda1, filebackup.img, or special device like/dev/zerofor zeros).of=<output>: The output destination (e.g., a disk, partition, or file).bs=<block-size>: The block size (e.g.,4Mfor 4 megabytes) used for reading/writing. Larger blocks improve speed; default is 512 bytes.count=<number>: Number of blocks to copy (limits the total data transferred).skip=<blocks>: Skipnblocks at the start of the input (useful for resuming transfers).seek=<blocks>: Skipnblocks at the start of the output (paired withskipfor resuming).conv=<conversions>: Apply data conversions (e.g.,noerrorto continue on read errors,syncto pad short blocks with zeros).status=progress: Show real-time transfer progress (available inddversions ≥8.24).
Simple Example: Copy a File
To copy file.txt to file_copy.txt with a block size of 1MB:
dd if=file.txt of=file_copy.txt bs=1M status=progress
This is equivalent to cp file.txt file_copy.txt but with more control over block size and progress tracking.
Preparing for Backup/Recovery
dd is unforgiving: a typo in if or of can overwrite critical data. Follow these steps to minimize risk:
1. Identify Devices Correctly
Use tools like lsblk, fdisk, or blkid to list disks and partitions. Never guess device names (e.g., /dev/sda vs. /dev/sdb).
lsblk # Lists all disks (e.g., sda) and partitions (e.g., sda1)
fdisk -l /dev/sda # Detailed info about disk /dev/sda
blkid /dev/sda1 # Shows UUID and filesystem type of partition /dev/sda1
2. Unmount Filesystems (If Possible)
For consistent backups, unmount the partition/disk being copied (or boot from a live USB/CD to avoid writes during backup).
sudo umount /dev/sda1 # Unmount partition /dev/sda1
3. Use sudo for Privileges
dd requires root access to read/write raw devices. Always prefix commands with sudo.
4. Verify Disk Sizes (For Restores)
When restoring to a new disk, ensure the target disk is at least as large as the source. Use lsblk to check sizes:
lsblk -o NAME,SIZE /dev/sda # Show size of disk /dev/sda
Creating Disk/Partition Backups
dd excels at creating exact block-level copies of disks or partitions. Below are common backup scenarios.
1. Back Up an Entire Disk
To clone an entire disk (e.g., /dev/sda) to an image file (disk_backup.img):
sudo dd if=/dev/sda of=/path/to/disk_backup.img bs=4M status=progress
- Why
bs=4M? Larger blocks reduce overhead. Testbs=1M,4M, or8Mfor speed (avoid excessively large blocks, which may cause errors). - Output file location: Use an external drive or separate partition to avoid filling the source disk.
2. Back Up a Single Partition
To back up a partition (e.g., /dev/sda1, the root partition) to an image file:
sudo dd if=/dev/sda1 of=/path/to/partition_backup.img bs=4M status=progress
3. Compress Backups to Save Space
Raw disk images are large (equal to the disk size). Compress them with gzip or xz for storage efficiency:
# Compress during backup (gzip: faster, lower compression)
sudo dd if=/dev/sda1 bs=4M status=progress | gzip > /path/to/partition_backup.img.gz
# Compress with xz (slower, higher compression)
sudo dd if=/dev/sda1 bs=4M status=progress | xz -v > /path/to/partition_backup.img.xz
- To decompress later:
gunzip partition_backup.img.gzorxz -d partition_backup.img.xz.
4. Verify Backups
Always verify backups to ensure they’re not corrupted. Use md5sum or sha256sum to generate a checksum:
# Generate checksum for the backup image
md5sum /path/to/partition_backup.img > backup_checksum.md5
# Verify later
md5sum -c backup_checksum.md5
If the output says “OK”, the backup is intact.
Restoring from Backups
Restoring with dd is the reverse of backup: write the image file back to the target device.
1. Restore an Entire Disk Image
To restore disk_backup.img to a new disk (e.g., /dev/sdb):
sudo dd if=/path/to/disk_backup.img of=/dev/sdb bs=4M status=progress
⚠️ Critical Warning: Double-check of=/dev/sdb! Writing to the wrong device (e.g., /dev/sda) will erase all data on it.
2. Restore a Partition Image
To restore partition_backup.img to /dev/sdb1 (ensure /dev/sdb1 exists and is unmounted):
sudo dd if=/path/to/partition_backup.img of=/dev/sdb1 bs=4M status=progress
3. Restore to a Larger Disk
If restoring to a larger disk, the partition table will still reflect the original size. Expand the partition and filesystem afterward:
- Use
partedorgpartedto resize the partition to fill the disk. - Resize the filesystem (e.g., for ext4):
sudo resize2fs /dev/sdb1 # For ext2/ext3/ext4
sudo xfs_growfs /dev/sdb1 # For XFS (requires mounting first)
Advanced dd Techniques
Beyond basic backups, dd supports advanced workflows like network cloning, resuming transfers, and secure wiping.
1. Resume Interrupted Transfers
If a backup/restore is interrupted (e.g., power loss), resume using skip (input) and seek (output).
First, calculate how many blocks were transferred before the interruption:
# Get size of the partial output file (in bytes)
du -b /path/to/partial_backup.img
# Divide by block size (e.g., 4M = 4*1024*1024 = 4194304 bytes)
blocks_transferred=$((partial_size / 4194304))
Resume the transfer:
sudo dd if=/dev/sda of=/path/to/partial_backup.img bs=4M skip=$blocks_transferred seek=$blocks_transferred status=progress
2. Clone Over the Network
Clone a disk directly to another machine over the network using netcat (fast, insecure) or ssh (encrypted).
With netcat (Local Network Only)
On the destination machine (receive data):
nc -l -p 1234 | sudo dd of=/dev/sdb bs=4M status=progress
On the source machine (send data):
sudo dd if=/dev/sda bs=4M status=progress | nc <destination_ip> 1234
With ssh (Encrypted, Remote Networks)
For secure transfers, pipe dd through ssh:
# Source: Send /dev/sda to destination's /dev/sdb
sudo dd if=/dev/sda bs=4M status=progress | ssh user@destination_ip "sudo dd of=/dev/sdb bs=4M status=progress"
3. Create Sparse Files
For backups of partially filled disks, create “sparse” images (files that only use space for non-zero blocks):
sudo dd if=/dev/sda1 of=/path/to/sparse_backup.img bs=4M conv=sparse status=progress
Sparse files are smaller than raw images but require filesystem support (e.g., ext4, XFS).
4. Securely Wipe a Disk
To erase a disk (e.g., before disposal), overwrite it with zeros or random data:
# Overwrite with zeros (fast, basic wipe)
sudo dd if=/dev/zero of=/dev/sdb bs=4M status=progress
# Overwrite with random data (more secure, slower)
sudo dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
⚠️ For top security, use shred instead (multiple passes): sudo shred -vzf /dev/sdb.
Troubleshooting Common Issues
1. “Permission Denied”
Cause: Missing root privileges.
Fix: Prefix commands with sudo.
2. Accidental Data Loss
Cause: Writing to the wrong device (e.g., of=/dev/sda instead of of=/dev/sdb).
Prevention: Always run lsblk first and triple-check if/of parameters.
3. Slow Transfer Speeds
Cause: Small block size (bs).
Fix: Test larger blocks (e.g., bs=4M or bs=8M). Avoid bs larger than 16M (may cause I/O errors).
4. Corrupted Backups
Cause: Unmounted filesystems, read errors, or interrupted transfers.
Fix:
- Unmount filesystems before backup.
- Use
conv=noerror,syncto skip bad blocks and pad with zeros:sudo dd if=/dev/sda of=backup.img bs=4M conv=noerror,sync status=progress - Verify backups with checksums.
Best Practices
To use dd safely and effectively:
- Double-Check
ifandof: A single typo can destroy data. Runlsblkand confirm device names. - Test Restores Periodically: A backup is useless if it can’t be restored. Test on a spare disk.
- Use Descriptive Filenames: Name backups like
2024-05-20_sda1_backup.imgfor clarity. - Avoid Live System Backups: Boot from a live USB to back up the root partition (avoids writes during cloning).
- Combine with File-Level Tools: Use
ddfor block-level backups, butrsyncfor incremental file backups (faster for updates).
Conclusion
dd is a Swiss Army knife for Linux backup and recovery, offering unmatched control over block-level operations. While its simplicity hides potential dangers, careful use of parameters like bs, if, and of—paired with verification and testing—makes it a reliable tool for cloning disks, restoring systems, and securing data.
Remember: with great power comes great responsibility. Always back up critical data, verify backups, and never rush when using dd.
References
ddMan Page: man7.org/linux/man-pages/man1/dd.1.html- Arch Linux Wiki: dd (简体中文) (English version available)
- Ubuntu Documentation: BackupYourSystem
- Linuxaria: Using dd Command in Linux
- GNU Coreutils: dd Invocation