loop设备关联文件报错“losetup: failed to set up loop device: Device or resource busy”的解决方案

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

loop设备是一种在Linux系统中使用的虚拟块设备。它允许将常规文件模拟为块设备,从而使操作系统能够像访问物理磁盘或分区一样访问这些文件。losetup命令用于在Linux中创建一个设备映射器,将文件与loop设备关联起来。本文介绍了Alibaba Cloud Linux中使用losetup命令将loop设备关联到文件时,出现错误“losetup: failed to set up loop device: Device or resource busy”的原因及解决方案。

问题现象

  1. 查看系统信息。

    sudo cat /etc/os-release

    返回信息如下所示。

    NAME="Alibaba Cloud Linux"
    VERSION="3 (Soaring Falcon)"
    ID="alinux"
    ID_LIKE="rhel fedora centos anolis"
    VERSION_ID="3"
    UPDATE_ID="9.1"
    PLATFORM_ID="platform:al8"
    PRETTY_NAME="Alibaba Cloud Linux 3 (Soaring Falcon)"
    ANSI_COLOR="0;31"
    HOME_URL="https://www.aliyun.com/"
  2. 查看系统中所有loop设备。

    sudo ls /dev/loop*

    返回信息如下所示,当前系统里面存在loop0。

    /dev/loop0  /dev/loop-control
  3. 查看当前目录下的内容。

    ll

    返回信息如下所示。

    total 11448
    drwxr-xr-x 2 root root     4096 Sep  7 15:34 .
    drwxr-xr-x 7 root root     4096 Sep  5 18:57 ..
    -rw-r--r-- 1 root root 10485760 Sep  5 18:57 img
    -rw-r--r-- 1 root root 10485760 Sep  7 15:34 img1
  4. 关联loop设备到指定文件。

    执行命令将loop0与img文件关联。

    sudo losetup /dev/loop0 ./img

    出现下列错误信息。

    losetup: ./img: failed to set up loop device: Device or resource busy

原因分析

将loop0与img文件关联时,如果当前loop0正与其他文件关联,那么则会出现错误信息“Device or resource busy”。

输入下列命令查看loop0的关联情况。

sudo losetup /dev/loop0

返回信息如下,loop0与文件/root/workplace/losetup/img1关联。

/dev/loop0: [64771]:928116 (/root/workplace/losetup/img1)

解决方案

为了解决上述问题,有两种可选的解决方案。方案一适用于当前loop设备充足的场景,方案二适用于当前没有可用的空闲loop设备场景。

方案一

新建一个loop设备,并将新建的loop设备与img文件关联。执行下列命令获取一个与img文件关联的设备,如果当前不存在与img文件关联的设备,下列命令则会查找第一个空闲loop设备并与img文件关联。

sudo losetup -f ./img

输入下列命令查看所有的loop设备情况。

sudo losetup -a

输出信息如下所示,loop1与img文件成功进行了关联。

/dev/loop1: [64771]:929300 (/root/workplace/losetup/img)
/dev/loop0: [64771]:928116 (/root/workplace/losetup/img1)

方案二

取消loop0与img1文件的关联关系,并重新建立loop0与img的关联关系。

警告

使用这种方法存在一定风险,在解除loop0的关联关系前请确保没有第三方正在使用loop0设备。

  1. 取消loop0的当前关联关系。

    sudo losetup -d /dev/loop0
  2. 重新将loop0与img文件关联。

    sudo losetup /dev/loop0 ./img
  3. 查看loop0的关联情况。

    sudo losetup /dev/loop0

    输出信息如下,loop0已经成功与img文件关联。

    /dev/loop0: [64771]:929300 (/root/workplace/losetup/img)