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 loop1, loop2, 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:
- Mount the file as a block device only
- 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