Use A File As A Linux Block Device
Category : How-to
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
6 Comments
Bharath
11-Mar-2017 at 4:09 pmi 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 pmThank 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 pmWhy would I need to do this exercise? What is the purpose?
James Coyle
25-Oct-2018 at 10:17 pmThere 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 pmI don’t get Proceed anyway? option it just says not a block device and stops
carey Mould
12-Dec-2022 at 3:24 amthanks 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