AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题

问题[loop-device](unix)

Martin Hope
Huckle
Asked: 2025-04-07 06:05:07 +0800 CST

什么保存了该块设备的文件描述符,又为什么 losetup -d 没有删除该块设备

  • 7

有许多帖子losetup -d /dev/loop0说不移除回溯设备,即使它返回了成功的返回代码。我相信这些帖子的根本原因是块设备autoclear设置了标志,因此losetup只能调用,LOOP_CLR_FD而不能调用LOOP_CTL_REMOVE。其他进程必须仍持有文件描述符,因此循环设备不会被分离或移除。这可以通过以下方式确认strace:

$ sudo losetup -J -l  | jq '.'     
{
  "loopdevices": [
    {
      "name": "/dev/loop0",
      "sizelimit": 0,
      "offset": 0,
      "autoclear": true,
      "ro": false,
      "back-file": "/example/backing_file",
      "dio": false,
      "log-sec": 512
    }
  ]
}


$ sudo strace -ff losetup -d /dev/loop0
...
newfstatat(AT_FDCWD, "/dev/loop-control", {st_mode=S_IFCHR|0660, st_rdev=makedev(0xa, 0xed), ...}, 0) = 0
openat(AT_FDCWD, "/dev/loop0", O_RDONLY|O_CLOEXEC) = 3
ioctl(3, LOOP_CLR_FD)                   = 0
close(3)                                = 0
...

常见的答案是 (a) 查找从循环设备挂载的任何文件系统上打开的所有文件,然后 (b) 卸载循环设备。通常建议使用lsof和。/proc/**/fd

我的问题是,我遇到了从未安装过的块设备的问题。我无论如何也找不到哪个进程持有这个循环设备的文件描述符,因此无法关闭它。

一个快速测试 C 程序表明我可以从块设备中删除自动清除标志:

$ sudo strace -ff --verbose=ioctl /tmp/remove-autoclear
...
openat(AT_FDCWD, "/dev/loop0", O_RDONLY|O_CLOEXEC) = 3
ioctl(3, LOOP_CLR_FD)                   = 0
close(3)                                = 0

write(1, "INFO: Result of sending LOOP_CLR"..., 57) = 57
INFO: Result of sending LOOP_CLR_FD to /dev/loop0 was: 0

openat(AT_FDCWD, "/dev/loop-control", O_RDONLY|O_CLOEXEC) = 3
ioctl(3, LOOP_CTL_REMOVE, 0)            = -1 EBUSY (Device or resource busy)
write(2, "ERROR(16): Sending LOOP_CTL_REMO"..., 94) = 94
ERROR(16): Sending LOOP_CTL_REMOVE to /dev/loop-control for device 0: Device or resource busy

openat(AT_FDCWD, "/dev/loop0", O_RDONLY|O_CLOEXEC) = 4
ioctl(4, LOOP_GET_STATUS, {lo_number=0, lo_offset=0, lo_flags=LO_FLAGS_AUTOCLEAR, lo_name="/example/backing_file", ...}) = 0
write(1, "INFO: Autoclear bit for /dev/loo"..., 40) = 40
INFO: Autoclear bit for /dev/loop0 is 1

ioctl(4, LOOP_SET_STATUS, {lo_number=0, lo_offset=0, lo_flags=0, lo_name="/example/backing_file", ...}) = 0
ioctl(4, LOOP_GET_STATUS, {lo_number=0, lo_offset=0, lo_flags=0, lo_name="/example/backing_file", ...}) = 0
write(1, "INFO: Successfully removed autoc"..., 56) = 56
INFO: Successfully removed autoclear bit for /dev/loop0
close(4)                                = 0

ioctl(3, LOOP_CTL_REMOVE, 0)            = -1 EBUSY (Device or resource busy)
write(2, "ERROR(16): Sending LOOP_CTL_REMO"..., 94) = 94
ERROR(16): Sending LOOP_CTL_REMOVE to /dev/loop-control for device 0: Device or resource busy

exit_group(16)                          = ?
+++ exited with 16 +++







INFO: Result of sending LOOP_CLR_FD to /dev/loop0 was: 0
ERROR(16): Sending LOOP_CTL_REMOVE to /dev/loop-control for device 0: Device or resource busy
INFO: Autoclear bit for /dev/loop0 is 1
INFO: Successfully removed autoclear bit for /dev/loop0
ERROR(16): Sending LOOP_CTL_REMOVE to /dev/loop-control for device 0: Device or resource busy

$ sudo cat /sys/dev/block/7:0/loop/autoclear
0

但有趣的是,这不会losetup -d /dev/loop0因硬错误而失败。这似乎是因为LOOP_CLR_FD再次设置了自动清除标志。这与查找持有打开文件描述符的进程无关,我只是注意到了这一点,因为它是“远距离的幽灵行动”,它解释了为什么losetup从不尝试调用LOOP_CTL_REMOVE。

关于如何查找持有文件描述符的进程,/dev/loop0以便我可以在不重新启动的情况下正确清理它,有什么建议吗?

$ sudo ls -l /proc/**/fd | grep loop0       
$ sudo ls -l /proc/**/fd | grep backing_file
$ sudo lsof | grep loop0
$ sudo lsof | grep backing_file
$ sudo mount | grep loop
loop-device
  • 1 个回答
  • 55 Views
Martin Hope
Znik
Asked: 2019-11-28 06:16:21 +0800 CST

linux内核的最大循环设备是什么?

  • 4

我可以包含用于支持循环文件的循环模块。loop 模块支持 max_loop 选项。我找到了带有选项 loop max_loop 256 的示例。我的问题,最大支持的循环设备是多少?我不敢相信,256 是硬限制,创建超过 256 个循环设备是不可能的。

更新:

我在文件https://elixir.bootlin.com/linux/v4.0/source/drivers/block/loop.c中没有发现任何有趣的东西

但是我做了一些实验,然后运行 ​​modprobe max_loops=512 然后我在 /dev/ 目录中看到完全相同的计数循环块文件安装为 udev,编号从 loop0 到 loop511

我用 linux kernel 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64 做到了

linux-kernel loop-device
  • 1 个回答
  • 3380 Views
Martin Hope
Tim
Asked: 2019-02-26 05:23:57 +0800 CST

环回文件中的“环回”与环回 IP 地址中的含义相同吗?

  • 0

man pvcreate说

pvcreate 初始化一个 PV,使其被识别为属于 LVM,并允许 PV 在 VG 中使用。PV 可以是磁盘分区、整个磁盘、元设备或回送文件。

什么是回送文件?环回文件中的“环回”与环回 IP 地址中的含义相同吗?

环回文件是否与我不熟悉的https://en.wikipedia.org/wiki/Loop_device相关?

谢谢。

loop-device loopback
  • 1 个回答
  • 101 Views
Martin Hope
Yves
Asked: 2018-09-05 23:19:11 +0800 CST

mount 和 mount -o loop 有什么区别

  • 41

我有一个名为 .iso 的 iso 文件ubuntu.iso。

我可以mount用命令:mount ubuntu.iso /mnt. 安装后,我可以从命令中看到它df -h: /dev/loop0 825M 825M 0 100% /mnt。

但是,如果我执行 command mount -o loop ubuntu.iso /mnt,我会得到相同的结果。

据我所知,loop device允许我们作为设备访问iso文件,我想这就是我们添加选项的原因-o loop。但是我可以访问我的 iso 文件,即使我只执行mount ubuntu.iso /mnt.

mount所以我看不出和之间的区别mount -o loop。

mount loop-device
  • 3 个回答
  • 45958 Views
Martin Hope
Daffy
Asked: 2018-08-23 16:43:29 +0800 CST

稀疏文件可以提高losetup的效率吗?

  • 2

所以我的设置是这样的。

$ truncate -s 1T volume
$ losetup -f --show volume
/dev/loop0
$ mkfs.ext4 /dev/loop0
$ ls -sh volume
1.1G volume
$ mount /dev/loop0 /mnt/loop

正如预期的那样,现在我有一个 1.1TB 的卷。ext4 的开销将稀疏文件扩展为 1.1G,但这很好。现在添加一个文件。

$ dd if=/dev/urandom of=/mnt/loop/file bs=1M count=10240
$ ls -sh volume
12G volume

酷,现在我不想要这个文件了。

$ rm /mnt/loop/file
$ ls -sh volume
12G volume

正如预期的那样,可用空间仍在占用空间,并$ fallocate -d volume释放了 1gb。

我的问题是,如何在不将卷扩展到完整大小的情况下将此处的可用空间归零?$ dd if=/dev/zero会将其扩展为完整大小,并conv=sparse使其在卷内创建一个无用的稀疏文件。

TL;DR:有没有办法losetup忽略将空块写入空扇区,同时允许其他所有内容?

loop-device sparse-files
  • 2 个回答
  • 1411 Views
Martin Hope
RJVB
Asked: 2018-05-21 00:06:54 +0800 CST

磁盘分区上的分区表;如何访问?

  • -1

我在 VirtualBox 中制作了一个 TrueOS VM,使用一个将物理硬盘分区(sda5)虚拟化为完整磁盘的 vmdk。结果,我现在在该 sda5 分区上有一个 GPT/GUID 分区表(sda 本身有一个 GPT/GUID 分区表)。

当我losetup /dev/sda5 /dev/loop0在主机上创建回送设备 ( /循环0。

这可能吗?会不会和loop device模块的max_part参数有关?FWIW,循环模块内置在我的内核中,/sys/module/loop/parameters/max_part 返回 0 ...我可以在不重新启动的情况下更改该值吗?

loop-device partition-table
  • 1 个回答
  • 685 Views
Martin Hope
sourcejedi
Asked: 2018-03-05 13:10:35 +0800 CST

`mount -oloop` 默认是否使用直接 IO(当内核足够新时)?

  • 1

由于内核开始支持它,losetup修改为默认启用直接 IO。这可以避免冗余页面缓存,并且还具有性能优势。

http://man7.org/linux/man-pages/man8/losetup.8.html

--direct-io[=开|关]

启用或禁用支持文件的直接 I/O。可选参数可以是 on 或 off。如果省略参数,则默认为 on。

我注意到,当内核添加此功能时,一个提交提到添加专门用于mount -oloop. 是否mount -oloop也进行了修改,使其默认启用直接 IO(如果内核足够新)?我在文档中找不到它。

http://man7.org/linux/man-pages/man8/mount.8.html

mount loop-device
  • 1 个回答
  • 531 Views
Martin Hope
robert
Asked: 2018-02-22 02:22:00 +0800 CST

Loopdevice 分区不显示

  • 5

我有一个程序可以在磁盘上创建分区和文件系统。为了测试它,我创建了一个图像文件:

dd if=/dev/zero of=disk.img bs=1M count=100

并安装:

sudo losetup /dev/loop0 disk.img

分区过程似乎有效,我收到一个错误mkfs:

mkfs.vfat: unable to open /dev/loop0p2: No such file or directory

我可以看到分区fdisk -l:

sudo fdisk -l /dev/loop0
Disk /dev/loop0: 1000 MiB, 1048576000 bytes, 2048000 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
Disklabel type: gpt
Disk identifier: B2CB131D-0091-4102-89E1-1D94EC49484A

Device         Start     End Sectors  Size Type
/dev/loop0p1    2048   10239    8192    4M BIOS boot
/dev/loop0p2   10240  272383  262144  128M EFI System
/dev/loop0p3  272384 1320959 1048576  512M Linux swap
/dev/loop0p4 1320960 2047966  727007  355M Linux filesystem

但不是lsblk:

sudo lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0  1000M  0 loop 
sda      8:0    0 465,8G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0 457,3G  0 part /
└─sda3   8:3    0     8G  0 part [SWAP]

我究竟做错了什么?

partition loop-device
  • 1 个回答
  • 9831 Views
Martin Hope
Antonio Petricca
Asked: 2018-01-20 13:18:18 +0800 CST

具有 fstab 环回设备的持久性 LVM 设备

  • 9

我喜欢创建一个 LVM 设备,其中物理卷是环回设备。

我已经阅读了很多文档和教程,比如this。不幸的是,所有这些都基于losttup命令,该命令在下次重新启动时会丢失其配置。

我会使用 FSTAB 代替 RC.LOCAL 进行 LVM 设置(可能会在其中编写 losttup 脚本),以便在某些服务启动之前让我的 LVM 运行,但我不知道如何在 FSTAB 中重现命令:“ losttup /dev/loop0 /opt/my-data-file-0" 等等...

我怎么能做到这一点?

lvm loop-device
  • 1 个回答
  • 3621 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve