Why does one need a loop device at all?

Mounts, typically, must be done on block devices. The loop driver puts a block device front-end onto your data file.

If you do a loop mount without losetup then the OS does one in the background.


$ dd if=/dev/zero of=/tmp/foo bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0798775 s, 1.3 GB/s
$ mke2fs /tmp/foo
mke2fs 1.42.9 (28-Dec-2013)

$ losetup    
$ mount -o loop /tmp/foo /mnt1    
$ losetup
/dev/loop0         0      0         1  0 /tmp/foo
$ umount /mnt1
$ losetup

You may need to call losetup directly if your file image has embedded partitions in it.

eg if I have this image:

$ fdisk -l /tmp/foo2      

Disk /tmp/foo2: 104 MB, 104857600 bytes, 204800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x1f25ff39

     Device Boot      Start         End      Blocks   Id  System
/tmp/foo2p1            2048      204799      101376   83  Linux

I can't mount that directly

$ mount -o loop /tmp/foo2 /mnt1
mount: /dev/loop0 is write-protected, mounting read-only
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error

But if I use losetup and kpartx then I can access the partitions:

$ losetup -f /tmp/foo2
$ losetup
/dev/loop0         0      0         0  0 /tmp/foo2
$ kpartx -a /dev/loop0
$ mount /dev/mapper/loop0p1 /mnt1

File systems expect to read from and write to block devices, but image files aren’t block devices. Loop devices provide a block device on top of a file (or another block device, optionally with remapping).

There’s no need to consider loop devices when mounting images in many cases because mount takes care of everything for you; but loop devices are still involved. losetup -l -a will show them.

See also What is the difference between mount and mount -o loop.

You seem to be on Linux and Linux uses a wrong name for that feature.

I invented that feature in 1988 on SunOS-4.0 and I call that feature fbk - File emulates BlocK device.

The background is that the device driver emulates a block device on top of a plain file. You need this as a filesystem cannot use a plain file as a background storage for a filesystem. It rather needs a block device and this is what fbk emulates.

Since a while some people made the program mount a bit more clever and there are mount implementations that automatically create a fbk instance for a file in case that the mount program detects that the argument that is expected to be a block device appears to be a plan file instead.