Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I am using Linux as guest OS in VirtualBox. I deleted huge number of files from its filesystem. Now i want to shrink the filesystem image file (vdi). The shrinking works by compressing filesystem image wherever it has "null" value in disk.

It seems an application called zerofree can write "null" into free space of filesystem in such a way that it becomes sparse. But the instructions say it works only on ext2/ext3. I have ext4 on my guest OS.

  1. Why won't it work on ext 4 (reason cited is "extents", but can someone shed more light on it) ?

  2. Will it work, If i mount the ext 4 as ext 3 and then remount as ext 4 ?

  3. Any other tools that can do similiar thing as zerofree on ext ?

share|improve this question
1  
According to the link there, zerofree works on ext4. –  psusi Apr 3 '12 at 13:51

3 Answers 3

up vote 1 down vote accepted

One way to go is to create a second disk image, add it to your guest OS and copy files from one to the other. Make the second disk bootable and remove the first one.

Another way is to

  1. resize your filesystem with resize2fs to its minimum size possible
  2. then resize the partition with parted resize to the same or a bit larger size
  3. create a new partition in the new unallocated space and zero it out with dd if=/dev/zero of=/dev/sdXY
  4. use VBoxManage modifyhd <uuid>|<filename> --compact to shrink the image.
  5. resize the partition and then the filesystem to their original size.
share|improve this answer
    
Thanks, the second solution better fits my case as the virtual disk size is greater than the actual hdd. –  rajaganesh87 Apr 14 '11 at 8:34
    
@Mr.Confused.A.Lot, in this case you might not be able to zero the whole disk at once. You may try doing it in small chuncks, e.g. create small partitions, write zero to one of them, compact vdi, repeat. –  forcefsck Apr 14 '11 at 9:36

The page you reference (http://intgat.tigress.co.uk/rmy/uml/index.html) states:

The utility also works on ext3 or ext4 filesystems.

So I'm not sure where you're getting that it doesn't work on ext4 filesystems.

Note that the zerofree utility is different from the zerofree kernel patch that is mentioned on the same page (which indeed does not seem to have a version for ext4).

Update: At least in the case of VirtualBox, I don't think you need this utility at all. In my testing, on a stock Ubuntu 10.04 install on ext4, you can just zero out the filesystem like so:

$ dd if=/dev/zero of=test.file

...wait for the virtual disk to fill, then

$ rm test.file

and shut the VM down. Then on your VirtualBox host do:

$ VBoxManage modifyhd --compact yourImage.vdi

and you'll recover all the unused space.

share|improve this answer
    
Thanks for your reply. The manpage of zerofree did not specify ext4, thats why i needed an alternative. –  rajaganesh87 Apr 14 '11 at 8:37
1  
The alternative proposed (dd if=/dev/zero of=test.file) worked for me! Much simpler than other solutions. –  Pisu Nov 5 '11 at 14:58
3  
This should be the accepted answer. Works beautifully. –  Chris Pratt Jun 6 '12 at 18:19
    
Do a sync after the dd. –  ignis Jan 28 '13 at 9:47
    
dd idea worked for me too. Nicely done! –  Stefan Apr 15 at 14:53

You could use e2fsprogs, there is a version that is usable with ext4.

Make yourself superuser:

# su

Unmount your drive:

# umount /dev/sda1

Remove the journal of your drive:

# tune2fs -O ^has_journal /dev/sda1

And then resize your file system:

# resize2fs /dev/sda1 30G

share|improve this answer
    
Thanks for ur reply, but I don't want to shrink the partition but the filesystem image(vdi) of the guest. –  rajaganesh87 Apr 12 '11 at 3:33

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.