losetup 命令
使用简介
使用示例
FAQ
"找不到可用的 loop 设备"

losetup 命令

losetup 可以查看,绑定,删除绑定 loop 设备

使用简介

$ losetup -h

Usage:
 losetup loop_device                             give info
 losetup -a | --all                              list all used
 losetup -d | --detach <loopdev> [<loopdev> ...] delete
 losetup -f | --find                             find unused
 losetup -c | --set-capacity <loopdev>           resize
 losetup -j | --associated <file> [-o <num>]     list all associated with <file>
 losetup [ options ] {-f|--find|loopdev} <file>  setup

使用示例

列出信息

$ sudo losetup /dev/loop0
/dev/loop0: [0802]:427838 (/tmp/t.img)

-a 列出所有被用的 loop 设备

$ sudo losetup -a
/dev/loop0: [0802]:427838 (/tmp/t.img)
/dev/loop1: [0802]:427851 (/tmp/t.img)
/dev/loop2: [0802]:427851 (/tmp/t.img)
/dev/loop3: [0802]:427861 (/tmp/t.img)
/dev/loop4: [0802]:427859 (/tmp/t.img)
/dev/loop5: [0802]:427854 (/tmp/t.img)
/dev/loop6: [0802]:145969 (/var/tmp/imgcreate-JgO44D/tmp-9t8yIf/ext3fs.img)
/dev/loop7: [0802]:145992 (/var/tmp/imgcreate-XtRYay/tmp-l1519K/ext3fs.img)

-f 查找一个可用的 loop 设备

$ sudo losetup -f

-d 删除绑定

$ sudo losetup -d /dev/loop0
$ sudo losetup /dev/loop0
loop: 无法获取设备 /dev/loop0 的信息:没有那个设备或地址
$ sudo losetup -f
/dev/loop0

FAQ

"找不到可用的 loop 设备"

有时候会因为默认的几个 loop 设备用尽而遇到错误,一般此时运行 "losetup -f" 去查找可用 loop 设备会出现错误:

$ sudo losetup -f
losetup: 找不到可用的 loop 设备

我们可以使用 "losetup /dev/loopX" 查看这些设备都和谁bind了:

$ sudo losetup /dev/loop0
/dev/loop0: [0802]:427838 (/tmp/t.img)

也可以使用 "losetup -a" 列出所有被用的 loop 设备:

$ sudo losetup -a
/dev/loop0: [0802]:427838 (/tmp/t.img)
/dev/loop1: [0802]:427851 (/tmp/t.img)
/dev/loop2: [0802]:427851 (/tmp/t.img)
/dev/loop3: [0802]:427861 (/tmp/t.img)
/dev/loop4: [0802]:427859 (/tmp/t.img)
/dev/loop5: [0802]:427854 (/tmp/t.img)
/dev/loop6: [0802]:145969 (/var/tmp/imgcreate-JgO44D/tmp-9t8yIf/ext3fs.img)
/dev/loop7: [0802]:145992 (/var/tmp/imgcreate-XtRYay/tmp-l1519K/ext3fs.img)

删除不需要的绑定:

$ for i in 1 2 3 4 5 6 7;do sudo losetup /dev/loop$i;done
/dev/loop1: [0802]:427851 (/tmp/t.img)
/dev/loop2: [0802]:427851 (/tmp/t.img)
/dev/loop3: [0802]:427861 (/tmp/t.img)
/dev/loop4: [0802]:427859 (/tmp/t.img)
/dev/loop5: [0802]:427854 (/tmp/t.img)
/dev/loop6: [0802]:145969 (/var/tmp/imgcreate-JgO44D/tmp-9t8yIf/ext3fs.img)
/dev/loop7: [0802]:145992 (/var/tmp/imgcreate-XtRYay/tmp-l1519K/ext3fs.img)

$ for i in 1 2 3 4 5 6 7;do sudo losetup -d /dev/loop$i;done

如果是 fedora/rhel/centos 等系统,可以参考下面一个帖子增加 loop 设备:

They're the one serving the loop devices in use. So you exausted the
free loop devices. Free one (umount any in use) and try again.

You can see what is being used by a loop device with losetup:
# losetup /dev/loop0
/dev/loop0: [fd06]:234921356 (/linux/isos/backtrack.iso)

It is possible to increase the number of available loop devices. Free
all loop devices, and add a line with the following to
/etc/modprobe.conf:
options loop max_loop=64

(maximum is 256)

Then, do: rmmod loop && modprobe loop

If you get an error that the module couldn't be removed, you still have
loop devices in use.

Newer kernels (2.6.21 or 2.6.22) use a dynamic allocation of loop
devices, so you will only have to create the filesystem representation
of the devices:
for ((i=8;i<64;i++)); do
[ -e /dev/loop$i ] || mknod -m 0600 /dev/loop$i b 7 $i
done