我需要能够即时挂载和读取压缩图像dd
。我想这cloop
就是我所需要的。但我没有看到它/lib/modules
,无论如何,我想先知道它是如何工作的。
有人已经设法装载压缩图像并通过 动态读取它了cloop
吗?
答案1
不幸的是,Ubuntu 12.04不包含cloop.ko
所需的模块压缩环回设备。但是,将其添加到正在运行的内核中非常容易。
我在这一页(不确定它是否是最新版本,但编译并运行良好),所以我使用 wget 并解压缩这个文件.configure
似乎已经包含在Makefile
正在运行的 so 中:
make
足以正确构建模块。该软件包还包含advfs
实用程序,该命令的原始名称create_compressed_fs
,其概要可以找到这里。
我复制了模块/lib/modules
:
sudo cp cloop.ko /lib/modules/`uname -r`
但此步骤不是强制性的。然后,您可以选择使用或安装提供相同实用程序但名称不同的advfs
ubuntu 包。我选择了包选项,因为它更简洁(我还建议安装以显示漂亮的进度条):cloop-utils
pv
sudo aptitude install cloop-utils pv
现在可以通过实用程序创建压缩图像create_compressed_fs
,然后将其分配给设备,/dev/clooop0
并将文件名作为参数传递给模块cloop.ko
。老实说,我没有找到更好的方法将文件名传递给模块cloop
,如果想要在不同的时间范围内安装多个压缩图像,这会带来问题。但是,目前我没有遇到这个问题,所以这个脚本已经足以满足我的需求了。
#/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/cloop
在 Knoppix wiki 上可以找到有关cloop
设备的一些其他信息,这里。