I need to be able to mount and read on the fly a compressed dd image. I think that cloop is what I need. But I don't see it in /lib/modules and, anyway, I'd like to know how it works first.
Anybody has already managed to mount a compressed image and read it on the fly via cloop?
1 Answer
Unfortunately Ubuntu 12.04 doesn't include the cloop.ko module needed to have a compressed loopback device. However, it's very easy to add it to the running kernel.
I found it on this page (not sure if it's the latest version but compiles and works well), so I wget'd and uncompressed this file. The configure seems to be already included inside the Makefile so running:
makeis enough to build the module correctly. The package also contains the advfs utility, the original name for the command create_compressed_fs whose synopsis can be found here.
I copied the modules in /lib/modules with:
sudo cp cloop.ko /lib/modules/`uname -r`but this step is not mandatory. Then one can choose to use the advfs or install the ubuntu package cloop-utils that provides the same utility with another name. I chose the package option because it's cleaner (I also suggest to install pv to have a nice progress bar):
sudo aptitude install cloop-utils pvNow the compressed image can be created through the create_compressed_fs utility, and can be subsequently assigned to the /dev/clooop0 device passing the filename as parameter to the module cloop.ko. Honestly I didn't find a better way to pass the filename to the cloop module and this poses a problem if one wants to mount multiple compressed images in different time frames. However, for the moment I don't have this problem, so this script has been more than adequate for my needs.
#/bin/sh -e
INPUTDEVICE="/dev/sda1"
OUTPUTFILE="/tmp/dev-sda1.cloop.img"
BLOCKSIZE="1048576"
NUMBLOCKS="2000"
COMPRESSIONLEVEL="9"
#COMPRESSIONLEVEL="-1" # for 7zip compression (untested)
CLOOPLOGFILE="/tmp/cloop-creation.log"
CLOOPBLOCKSIZE="64K"
dd if="$INPUTDEVICE" bs="$BLOCKSIZE" count="$NUMBLOCKS" | pv -s "$((NUMBLOCKS * BLOCKSIZE))" -Wpetr | create_compressed_fs -L "$COMPRESSIONLEVEL" -B "$CLOOPBLOCKSIZE" -s "$NUMBLOCKS"M - "$OUTPUTFILE" > "$CLOOPLOGFILE" 2>&1
insmod /lib/modules/`uname -r`/cloop.ko file="$OUTPUTFILE"
mount -o ro /dev/cloop0 /mnt/cloopSome other information can be found on the Knoppix wiki about cloop devices, here.