Go to ...

Techpository

A Better Technical Repository

RSS Feed

Linux: Mounting a partition within a disk image using NASA patch (for older systems)


If you are using util-linux prior to version 2.12b, specifying an offset that required more than 32-bits was not possible.

Attempting to mount my ext3 partition near the end of the disk with a 2.11 version of util-linux yields (7695198 * 512 = 3939941376):

faith:/usr/src#  mount -o loop,offset=3939941376
-t ext3 /nebula/hda_dd.image /mnt
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
or too many mounted file systems

Fortunately, we aren’t done yet. The second method utilizes a loopback device designed to mount partitions within the image without an offset limitation. In fact, no offset need be specified at all.
Mounting with a Special Patch

As this was written back in 2004, I do not believe the NASA loopback patch is still around.

You will need to patch your kernel to use the enhanced loopback device. This patch alters the way the loopback device works. You will no longer be able to mount partitions via the loopback device beyond /dev/loop0. If you use /dev/loop[1-7] this could be a show stopper for you; Check out the last method.

The patch is currently available against 2.4.20 and 2.4.21 prepatch 4. You will need to fetch the patch from NASA HQ’s public FTP server. It’s the enhanced_loop-x.x-linux-2.4.x-xfs.patch file located there. You can also fetch the XFS patch for 2.4.21-pre4 and the 2.4.21-pre4 patch itself as of this writing. I used 2.4.21-pre4 with Alan Cox’s -ac7. For convenience, a patched kernel ready for compiling is also available.

faith:/usr/src/linux-2.4.20#  patch
-p1 < ../enhanced_loop-0.2-linux-2.4.21-pre4-xfs.patch
patching file drivers/block/loop.c
patching file Makefile
Hunk # 1 FAILED at 1.
1 out of 1 hunk FAILED — saving rejects to file Makefile.rej

Don’t worry about the Makefile reject; It’s just the EXTRA_VERSION variable. (That’s because I used -ac7.)

Now, recompile your kernel in the usual way (I use Debian GNU/Linux’s make-kpkg command) and make sure you enable the loopback device if it isn’t already. When that task is complete, reboot with your shiny new kernel.

To accomodate the enhanced loopback device, some new entries need to be created in /dev. A script named createdev is available to handle that task for you, and it can be run at start up if you’re running devfs to recreate the entries for you at boot. You can fetch the script from NASA HQ. You may need to comment out the sourcing of the RedHat functions within the script if you aren’t on a RedHat based distribution, like Debian. By default the script will create enough entries in /dev for a fifteen disks with up to fifteen partitions. You can adjust that to your requirements within the script. It will blow away any existing /dev entries it has added if you change configurations, so you need not tend to them yourself.

faith:/nebula#  vi createdev
faith:/nebula#  bash createdev start
faith:/nebula#

Once you’ve run the script, you should find a entries like the following in your /dev directory:

faith:/#  ls /dev/loop[a-zA-Z]*
/dev/loopa    /dev/loopd12  /dev/loopg2
/dev/loopj6   /dev/loopn   /dev/loopa1
/dev/loopd13  /dev/loopg3   /dev/loopj7
/dev/loopn1   /dev/loopa10  /dev/loopd14
/dev/loopg4   /dev/loopj8   /dev/loopn10
/dev/loopa11  /dev/loopd15  /dev/loopg5
/dev/loopj9   /dev/loopn11

With the kernel up and running, you also need to acquire a modified copy of losetup, the loopback setup program. If you’re running an RPM based distribution, you’re in luck. You can fetch the modified losetup by making another journey to NASA HQ’s FTP server. Rebuild it with rpmbuild -bb and install. If you’re running Debian GNU/Linux, as I am, you can install the rpm package with the usual apt-get command. Then, you could either build the RPM package and use alien to convert it to a Debian package or use rpm2cpio to create a cpio archive of the RPM. For the latter, you can extract the source from the resultant cpio archive and compile:

faith:/usr/src#  rpm2cpio loop-utils-0.0.1-1.src.rpm > loop-utils.cpio
faith:/usr/src#  cpio -i < loop-utils.cpio
39 blocks
faith:/usr/src#  tar -zxvf loop-utils-0.0.1.tar.gz
loop-utils-0.0.1/
loop-utils-0.0.1/COPYING
loop-utils-0.0.1/Makefile
loop-utils-0.0.1/loimginfo.c
loop-utils-0.0.1/lomount.c
loop-utils-0.0.1/lomount.h
loop-utils-0.0.1/loop.h
loop-utils-0.0.1/loop.sgml
loop-utils-0.0.1/losetgeo.c
loop-utils-0.0.1/lotest.c
loop-utils-0.0.1/nls.h
loop-utils-0.0.1/partinfo.c
faith:/usr/src#  cd loop-utils-0.0.1

You may wish to edit the Makefile, which sticks things in /usr by default. I changed it to /usr/local and added ${prefix} as the path for the sbin_prefix variable. It originally had no value at all, but is later used when installing the losetup binary, which would instead end up in your /sbin directory. Oops.

faith:/usr/src/loop-utils-0.0.1#  make
gcc -Wall -Wstrict-prototypes -O6 -DVERSION='”0.3.9″‘
-DLOG2_NR_PARTITION=’4’   -c -o losetgeo.o losetgeo.c
gcc   losetgeo.o   -o losetgeo
gcc -Wall -Wstrict-prototypes -O6 -DVERSION='”0.3.9″‘
-DLOG2_NR_PARTITION=’4’   -c -o loimginfo.o loimginfo.c
gcc   loimginfo.o   -o loimginfo
gcc -Wall -Wstrict-prototypes -O6 -DVERSION='”0.3.9″‘
-DLOG2_NR_PARTITION=’4’   -c -o partinfo.o partinfo.c
gcc   partinfo.o   -o partinfo
gcc -DMAIN -D_FILE_OFFSET_BITS=64 lomount.c -o losetup.o
<warnings…>
ld losetup.o -o losetup
gcc -Wall -Wstrict-prototypes -O6 -DVERSION='”0.3.9″‘
-DLOG2_NR_PARTITION=’4’   -c -o lotest.o lotest.c
gcc   lotest.o   -o lotest
sgml2latex loop.sgml
Processing file loop.sgml
sgml2html -s 0 loop.sgml
Processing file loop.sgml
sgml2info loop.sgml
Processing file loop.sgml
echo “START-INFO-DIR-ENTRY” > loop.info.2
echo “* Loop: (loop). Block device loopback package.”
>> loop.info.2
echo “END-INFO-DIR-ENTRY” >> loop.info.2
cat loop.info.2 loop.info > loop.info.3
rm loop.info.2
mv loop.info.3 loop.info

Now, let’s test drive our new loopback device.

faith:/nebula#  /usr/local/sbin/losetup -d /dev/loopa
faith:/nebula#  /usr/local/sbin/losetup /dev/loopa hda_dd.image
faith:/nebula#  mount -t ntfs /dev/loopa1 /mnt
faith:/nebula#  ls /mnt
AUTOEXEC.BAT
boot.ini
CONFIG.SYS
Corel
Documents and Settings
IO.SYS
MSDOS.SYS
NTDETECT.COM
ntldr
PUTTY.RND
Program Files
pagefile.sys
RECYCLER
System Volume Information
WINNT
faith:/nebula#  umount /mnt
faith:/nebula#  /usr/local/sbin/losetup -d /dev/loopa
faith:/nebula#

By jasonb