When it comes to low-level disk operations in Linux, dd
remains the go-to tool for administrators. Its ability to perform raw sector copying makes it particularly useful for:
- Creating perfect replicas of disks (including bad sectors)
- Migrating entire systems to new hardware
- Forensic disk imaging
The fundamental syntax for disk cloning is:
dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress
Where:
if
= input file (source disk)of
= output file (destination disk)bs
= block size (optimizes transfer speed)conv=noerror,sync
= continues after read errorsstatus=progress
= shows real-time progress
Cloning to a Smaller Disk
When the destination is smaller than the source, you'll need to:
# First resize the source filesystem
e2fsck -f /dev/sdX
resize2fs /dev/sdX NEW_SIZE
# Then clone with exact byte count
dd if=/dev/sdX of=/dev/sdY bs=64K count=LAST_BLOCK conv=noerror,sync
Network-Based Cloning
# On destination machine:
nc -l 8888 | dd of=/dev/sdY
# On source machine:
dd if=/dev/sdX bs=4M | nc DEST_IP 8888
Essential steps after cloning:
partprobe
- Update kernel partition tablee2fsck -f /dev/sdY1
- Force filesystem checkresize2fs /dev/sdY1
- Expand filesystem if needed- Update fstab and bootloader references
While powerful, dd
has some constraints:
Limitation | Solution |
---|---|
No sparse file handling | Use dd if=/dev/zero of=file bs=1M count=0 seek=100 |
Slow on large disks | Use pv or mbuffer for monitoring |
No compression | Pipe through gzip or pigz |
When dd
might not be optimal:
- ddrescue: Better error handling
- Clonezilla: Filesystem-aware cloning
- partclone: Partition-level cloning
As a low-level Unix utility, dd
offers raw disk copying capabilities that make it ideal for precise disk cloning operations. Unlike GUI-based tools, dd
works at the block level, ensuring byte-for-byte accuracy - crucial for forensic copies or system migrations.
The fundamental syntax for disk cloning is:
dd if=/dev/source of=/dev/destination bs=4M status=progress
Where:
if
= input file (source disk)
of
= output file (destination disk)
bs
= block size (4MB is optimal for modern systems)
status=progress
shows transfer statistics
For more complex scenarios:
# Clone disk to compressed image file
dd if=/dev/sda bs=4M | gzip > disk_image.img.gz
# Clone over network (target machine)
nc -l 8888 | dd of=/dev/sdb
# Source machine
dd if=/dev/sda bs=4M | nc target_ip 8888
Problem: Destination disk appears blank after cloning
Solution: Run partprobe
or reboot to refresh partition tables
Problem: Cloned system won't boot
Solution: Ensure you've cloned the entire disk (including boot sectors) and verify disk UUIDs in /etc/fstab
For faster cloning:
dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync
Key parameters:
- Larger block sizes (64K-1M) for HDDs
- conv=noerror,sync
handles read errors
- Consider oflag=direct
for bypassing cache
Always verify your clone:
cmp /dev/sda /dev/sdb
Or for checksum verification:
dd if=/dev/sda bs=1M | sha256sum
dd if=/dev/sdb bs=1M | sha256sum
While powerful, dd
isn't always optimal:
- For SSDs, consider fstrim
aware tools
- When resizing partitions is needed
- For filesystem-level cloning (use rsync
instead)