Create an image of the partition (only the used space)
Solution 1
This has been answered here.
First make an image of the partition.
Then use losetup to mount the image. As it's not a disk but a partition, you don't need the partscan flag.
# lsblk
# losetup --find foo.img
Lookup the newly created loop device
# lsblk
loop1 7:1 0 4096M 0 loop
Zero out the remaining space by writing a large empty file.
# mount /dev/loop1 /mnt
# dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
# rm /mnt/filler
# umount /dev/loop1
Now compress the image.
# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz
So far for the partition image.
If there is an ext4 file system on the partition, you can resize it with resize2fs to the minimum size. This moves all data to the first blocks.
e2fsck -f /dev/loop1
resize2fs -M /dev/loop1
Solution 2
You can use Clonezilla and create a Clonezilla image, which is a directory with a set of files, where the biggest files are compressed. Clonezilla is smart enough to copy only the blocks from the partition that are marked as used by the file system, which makes it faster than dd
. It also means that the image will be smaller than if the free drive space is also copied.
But when you restore the content of the image into a partition, the target must be a partition of [at least] the same size, so if you want the size of the target smaller after the restore operation, you must use another method.
If you want a smaller size of the partition after the imaging and restore operation, you should work at the file level. You can
create a tarball, a [compressed] tarfile of the whole file system,
create a new partition with a file system with the size that you want
extract the directory tree with all the files from the tarball.
Boot from another operating system, so that the partition to be copied is not active, and run tar
with elevated permissions, for example
-
change directory to the top of the partition that you want to copy
sudo tar -cvzf /path-to/file.tar.gz .
When you restore (also booted from another operating system)
-
change directory to the top of the partition where you want to extract from the tarfile
sudo tar -xvf /path-to/file.tar.gz
Please notice an important difference between this result and the result of a cloning operation,
- The UUID of the partition will be different. If the copied partition contains a system partition, you must either change the UUID to that of the original partition or change the references to the UUID in
/etc/fstab
and/boot/grub/grub.cfg
to match the new UUID.
Related videos on Youtube
Sharvin26
Updated on September 18, 2022Comments
-
Sharvin26 over 1 year
I have a partition
sdb1
of size 3.3 GB. From 3.3 GB only 1.9 GB is used and 1.2 GB is an empty space. I want to create an image of this partition. But I want the image to only have the used space i.e. 1.9 GBNow when I run a command using dd:
dd if=/dev/sdb1 of=/home/data/Os.img bs=1M status=progress
I saw behavior that dd is making the image of 3.3 GB While I don't want the unallocated space to be the part of the OS image.
So I tried different solutions. I found one solution:
dd if=/dev/sdb1 of=/home/data/OS.img bs=1M count=1946 status=progress
This solution created an image of 1.9 GB as I have defined a block size of 1M and count is 1946 which will give 1.9 GB totally.
Question I am unable to determine if this dd command only made an image of the used space or it just created an image of size 1.9 GB in which there are both used and unused spaces?
And is there any other way in which the image can be created for the used space only?
-
Sharvin26 about 5 yearsI am looking for a command line tool like dd for making the image of a partition and it should be inbuilt in the Linux by default.
-
sudodus about 5 years@SharvinShah,
tar
is built-in in most if not all linux distros. If you still wantdd
, you can write zeros to all free space (create a huge file 'blank' until the file system is full) and remove it. After that you can clone withdd
and pipe the result viagzip
orxz
, which writes also the zeros, but compresses that space very efficiently. So effectively you will get almost what you want. But Clonezilla will be much more efficient (speedwise). -
Emmanuel Rosa about 5 yearsFor a CLI experience you can use
partclone
, which is one of the toolsclonezilla
uses.