Use A File As A Linux Block Device

Use A File As A Linux Block Device

Get Social!

Just like when creating a SWAP file, you can create a file on a disk and present it as a block device. The block device would have a maximum file size of the backing file, and (as long as it’s not in use) be moved around like a normal file. For example, I could create a 1GB file on the filesystem and make Linux treat the file as a disk mounted in /dev/. And guess what – that’s what we’re going to do.

Create a file and filesystem to use as a block device

First off, use dd to create a 1GB file on an existing disk that we’ll use for our storage device:

dd if=/dev/zero of=/root/diskimage bs=1M count=1024

Then ‘format’ the file to give it the structure of a filesystem. For this example we’re going to use ext4 but you could choose any filesystem that meets your needs.

mkfs.ext4 /root/diskimage

You’ll be promoted with Proceed anyway?. Type y and press return to proceed with the process.

mke2fs 1.42.5 (29-Jul-2012)
/root/diskimage is not a block special device.

Proceed anyway? (y,n) y

Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

Mounting a loop device

Before mounting the file we need to check that there is a free /dev/loopX loopback device that we can use to represent our new block device.

Run the below command, and if there is any output then check if it’s one of your loop devices, which will more than likely reference /dev/loop as the mounted device. If you do have a reference to our loop device then see the below section on Unmounting a loop device, or choose a number higher than the highest listed loop device, for example: usually there are several loop devices, starting with loop0 and going up in value to loop1loop2, and so on.

cat /proc/mounts | grep /dev/loop

Once you have the file that you’d like to mount and a free loop device then you can go ahead and mount the file as a block device. You have two options:

  1. Mount the file as a block device only
  2. Mount the file as a block device and mount the filesystem of it on a local mount point (eg. /mnt/mymountpoint).

For option 1; to only mount the file as a device in /dev/, run the below command and change /root/diskimage to the path of the file you’d like to mount. loop0 can also be incremented as explained above.

losetup /dev/loop0 /root/diskimage

If you’d like this to be remounted after a machine reboot then add the above line to the rc.local file.

vi /etc/rc.local

And add:

losetup /dev/loop0 /root/diskimage

 

For option 2; to mount the file and the filesystem on it, use the mount command. You must have already created the mount point locally before running the command, as you would when mounting a disk or NFS share.

mkdir /mnt/mymountpoint

Then run the mount command and specify the loop device, the path of the file and the path to mount the filesystem on:

mount -o loop=/dev/loop0 /root/diskimage /mnt/mymountpoint

To check the file has been mounted you can use the df command:

df -h | grep mymountpoint
/dev/loop0  976M  1.3M  924M  1% /mnt/mymountpoint

Unmounting a loop device

If you’ve mounted the filesystem on the block device using the mount command then make sure it’s unmounted before proceeding.

umount /mnt/mymountpoint

To then free the loop0 device (or which ever loop device you’ve used) you’ll need the losetup command with the d switch.

losetup -d /dev/loop0

 


6 Comments

Bharath

11-Mar-2017 at 4:09 pm

i get the following error when i try to mount the loop device’s filesystem.
mount: stolen loop=/dev/loop2
Can you help me?Thanks.

Don Cross

5-Jun-2018 at 8:54 pm

Thank you, James! This was helpful for me to start playing around with creating a disk image from scratch.

One thing I found on my system (Debian Stretch 9.4.0) reading “man losetup” is that you don’t need to grep for an unused loop device. You can just use the “–find” option to automatically assign one:

losetup –find –show /root/diskimage

This will print out the device it picked, for example “/dev/loop0”. In a script you can do

ROOTDEV=$(losetup –find –show /root/diskimage)

Later in your script, when you are done accessing the loop device, you can detach with

losetup –detach $ROOTDEV

That makes it a lot easier to automate things.

Paul Benson

25-Oct-2018 at 9:19 pm

Why would I need to do this exercise? What is the purpose?

    James Coyle

    25-Oct-2018 at 10:17 pm

    There are many applications; to mount an existing virtual machine drive so that you can access the contents without having to start the virtual machine, to add a swap device to a local machine, to test out storage technologies by mimicking a physical disk, to make a portable device that you can easily copy elsewhere, to have a different type of file system for a smaller amount of storage than your hard disk without having to change the whole disk (compression, encryption).

Corky

17-Sep-2019 at 6:04 pm

I don’t get Proceed anyway? option it just says not a block device and stops

carey Mould

12-Dec-2022 at 3:24 am

thanks as to why I wanted to preallocate tablespces for a mariadb innidb table so i could calculate remaing storage for a a specific blob feilrecord I would mount the device point the table o that preallocated imsge as the table space
this is exactly what I needed i was going to use fallocate Like i used before in creating a swap disk
thanks much

Leave a Reply

Visit our advertisers

Quick Poll

Are you using Docker.io?

Visit our advertisers