How to use the dd command to clone a Ubuntu Server?

Where necessary, you may need to have access to a VPS server so you can follow how to implement the steps in this article.  You can get a cheaper VPS Server from Contabo with 4vCPU cores, 8GM RAM, and 32TB Bandwidth for less than $5.50 per month. Get this deal here now

Table of Contents

Cloud VPS S

$5.50 Monthly
  • 4 vCPU Cores | 8GB RAM


$15.50 Monthly
  • 6 vCPU Cores | 16GB RAM


$17.50 Monthly
  • 8 vCPU Cores | 24GB RAM

Migrating the entire image, including applications and settings will require you to create a snapshot or disk image of your current server and then restore it on the new server.

The dd command is a versatile utility used for copying and converting files. Its primary purpose is to create disk images, copy data between devices, and perform various low-level operations on data. The name “dd” stands for “data duplicator.”

The basic syntax of the dd command is as follows:

dd if=input_file of=output_file bs=block_size

Input file source

The input file source (if in the dd command) specifies the source from which dd reads data. It can be a file, a block device, or a stream. The if parameter is where you provide the path or identifier of the input source. In other words, when using the dd command to create disk images or copy data between devices, the if parameter is where you provide the path or identifier of the input source. Here are some common examples:

Here are some common examples of the input file sources

Disk or Block Device

In Linux, disk images are typically represented as block devices, and they can be accessed through special device files in the /dev directory. The device files associated with disks or disk images are usually named /dev/sdX, where “X” is a letter representing the specific disk or disk image (e.g., /dev/sda, /dev/sdb, etc.).

Here are some common conventions:

  • /dev/sda: Represents the first SCSI or SATA disk in the system.
  • /dev/sdb: Represents the second SCSI or SATA disk.
  • /dev/sdX1, /dev/sdX2, etc.: Represent partitions on a disk, where “X” is the disk identifier.

When you create a disk image using tools like dd, you often copy the entire content of a block device, including partition tables and file systems. This disk image can then be mounted or used as if it were a physical disk.

In the following example, /dev/sda is a block device representing a physical disk. dd reads data from this disk and writes it to the specified output file (output.img).

sudo dd if=/dev/sda of=output.img bs=4M status=progress

Regular File as input

The dd command allows you to use a regular file as an input source. You can specify the input file using the if (input file) parameter in the dd command.

dd if=input_file.txt of=output_file.txt bs=512

In this example, the if=input_file.txt specifies the input file as input_file.txt, a regular file in the current directory.

The of=output_file.txt specifies the output file as output_file.txt, where the data will be written.

The bs=512 sets the block size to 512 bytes.

Random Data (using /dev/urandom)

“random data” usually refers to data that lacks a discernible pattern and appears to be unpredictable. The /dev/urandom device in Unix-like operating systems is often used as a source of pseudorandom data.

The dd command can read data from /dev/urandom and write it to an output file or device. This can be useful for generating random data files, initializing cryptographic keys, or other situations where unpredictable data is needed.

dd if=/dev/urandom of=random_data.bin bs=1M count=10

Here, /dev/urandom is a special file in Unix-like operating systems that provides pseudorandom data. dd reads from /dev/urandom and writes the data to random_data.bin.

Output file source

In the dd command, the output file source is specified by the of parameter, where “of” stands for “output file.” This parameter defines the destination or target for the data that dd reads from the input source (specified by the if parameter).

The basic syntax of the dd command is as follows:

dd if=input_file of=output_file bs=block_size
  • if: Input file (source).
  • of: Output file (destination).
  • bs: Block size, specifying the amount of data to be read and written at a time.

Here’s an example:

dd if=input_file.txt of=output_file.txt bs=512

In this example:

  • if=input_file.txt: Specifies the input file as input_file.txt, which is the source of data.
  • of=output_file.txt: Specifies the output file as output_file.txt, where the data will be written.
  • bs=512: Sets the block size to 512 bytes.

This command reads data from input_file.txt and writes it to output_file.txt in blocks of 512 bytes.

You can replace output_file.txt with the actual path and filename where you want to save the data, and adjust other parameters like block size (bs) based on your specific requirements. Always use caution when specifying the output file to avoid overwriting important data.

Here are examples of using different output sources with dd:

Writing to a Regular File

To copy data from an input file to a regular file, you can use the of parameter to specify the output file:

dd if=input_file.txt of=output_file.txt bs=512

This command reads data from input_file.txt and writes it to output_file.txt in 512-byte blocks.

Writing to a Block Device (Disk)

To clone the content of one disk to another, you can use a block device as the output file:


sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress

In this example, /dev/sda is the source disk, and /dev/sdb is the destination disk.

Writing to a Character Device (e.g., a Tape Drive)

sudo dd if=input_file.txt of=/dev/nst0 bs=512

In this example, data from input_file.txt is written to a tape drive represented by the character device /dev/nst0.

Writing to a Network Socket

You can use a network socket as the output source. This example uses nc (netcat) to listen on a specific port, and dd sends data to it:

dd if=input_file.txt | nc -l -p 12345

In this example, nc listens on port 12345, and dd sends the data to the network socket.

Writing to Standard Output

If you want to display the output on the terminal or pipe it to another command, you can use - as the output file:

dd if=input_file.txt of=- bs=512 | gzip > output_file.gz

This example compresses the data using gzip and writes it to output_file.gz.

These are just a few examples, and you can use various types of output sources depending on your needs. Always be cautious when specifying the output source to avoid overwriting important data, especially when dealing with block devices.

Block Size

In the context of the dd command, the block size (bs) refers to the amount of data that dd reads from or writes to the input and output files in each operation. It specifies the size of the data blocks that dd transfers, and its value can significantly impact the performance and efficiency of the data transfer.

The general syntax for the dd command with block size is as follows:

dd if=input_file of=output_file bs=block_size
  • if: Input file (source).
  • of: Output file (destination).
  • bs: Block size.

For example:

dd if=input_file.txt of=output_file.txt bs=512

In this example, bs=512 means that dd will read or write data in chunks of 512 bytes.

Why Block Size Matters

Determining the right block size matters because of the following reasons;

  • Performance: Choosing an optimal block size can improve the performance of data transfer. Smaller block sizes may be inefficient for large transfers, while larger block sizes may be less efficient for small transfers. It’s often a balance between minimizing the number of operations and avoiding excessive memory usage.
  • I/O Operations: Larger block sizes can reduce the number of I/O operations, which can be beneficial for performance. However, excessively large block sizes may lead to inefficient use of memory.
  • Alignment: Block sizes are often chosen based on factors such as disk geometry, filesystem block sizes, and hardware constraints to ensure proper alignment.

Finding the Optimal Block Size

The optimal block size can depend on the specific use case, hardware, and filesystem. It’s common to experiment with different block sizes to find the one that provides the best performance for your particular scenario.

On Linux systems, the default block size for the dd command operations is often 512 bytes or 4 kilobytes. However, this can depend on the version of dd and the specific system configuration.

Cloning and restoring the Linux disk image

Cloning an entire Linux disk image using the dd command involves creating a disk image of the source server and then restoring it to another server. Here are the general steps:

Source Server

Use dd to create a disk image of the source server. Make sure to replace /dev/sda with the appropriate device for your system.

sudo dd if=/dev/sda of=ubuntu_disk_image.img bs=4M status=progress

This command creates an image file named ubuntu_disk_image.img from the source server’s disk.

The use of the .img extension in the context of the dd command is a convention to indicate that the file being created or manipulated is an image file, often representing a disk image. The .img extension is not mandatory, but it’s a common practice to help users recognize and associate the file with a disk image.

Also, some software tools and applications that work with disk images may expect or recognize files with the .img extension. Using the extension can enhance compatibility with a wider range of tools

Transfer the Disk Image

Transfer the disk image to the destination server using a method like scp, rsync, or copying it to an external drive.

Destination Server

Use dd to write the disk image to the new server’s disk. Ensure that you replace /dev/sda with the appropriate device for the new server.

sudo dd if=ubuntu_disk_image.img of=/dev/sda bs=4M status=progress

Be extremely careful when executing this command, as it will overwrite the entire contents of the target disk.

Resize Filesystem (if necessary)

If the new server’s disk is larger than the original, you might need to resize the filesystem to make use of the additional space. Use a tool like resize2fs for ext4 filesystems.

sudo resize2fs /dev/sdaX

Replace /dev/sdaX with the appropriate partition identifier.

Update GRUB (if necessary)

If you’ve transferred to a server with a different disk layout, you might need to update the GRUB bootloader. Use the following commands:

sudo update-grub
sudo grub-install /dev/sda

Replace /dev/sda with the appropriate device.

Adjust Configuration (if necessary)

Update any configuration files, such as /etc/hostname, /etc/network/interfaces, or any other server-specific settings.

Update Network Configuration

If the network interface names have changed, update the network configuration files in /etc/netplan/ or /etc/network/ accordingly.

Reboot the server to apply the changes.

Important considerations

  • Ensure that you have a backup of critical data before proceeding.
  • Double-check disk device identifiers (/dev/sda, etc.) to avoid overwriting the wrong disk.
  • Verify that the destination server’s hardware is compatible with the disk image.
  • Consider using tools like rsync for more efficient transfers, especially for large datasets.

This process essentially clones the entire disk, including the operating system, applications, and data, to the new server. Be cautious, and thoroughly test the new server to ensure it functions as expected.

Hire us to handle what you want

Hire us through our Fiverr Profile and leave all the complicated & technical stuff to us. Here are some of the things we can do for you:

  • Website migration, troubleshooting, and maintenance.
  • Server & application deployment, scaling, troubleshooting, and maintenance
  • Deployment of Kubernetes, Docker, Cloudron, Ant Media, Apache, Nginx,  OpenVPN, cPanel, WHMCS, WordPress, and more
  • Everything you need on AWS, IBM Cloud, GCP, Azure, Oracle Cloud, Alibaba Cloud, Linode, Contabo, DigitalOcean, Ionos, Vultr, GoDaddy, HostGator, Namecheap, DreamHost, and more.

We will design, configure, deploy, or troubleshoot anything you want. Starting from $10, we will get your job done in the shortest time possible. Your payment is safe with Fiverr as we will only be paid once your project is completed.