标签: loop-device

在 Linux 下使用循环挂载镜像的开销

在 Linux 下使用循环挂载映像与使用物理分区是否存在 CPU/RAM 开销?

linux loop-device

7
推荐指数
1
解决办法
3174
查看次数

losetup --detach 不删除环回设备

我正在尝试分离环回设备。

推测losetup --detach可能成功(没有错误消息和返回代码 0),但设备仍然存在。

有任何想法吗?

root@Cassiopeia:~# losetup -a
/dev/loop1: [2053]:5243868 (/var/lib/snapd/snaps/core_6034.snap)
/dev/loop6: [2053]:19401380 (/tmp/imagefile)
/dev/loop4: [2053]:5249290 (/var/lib/snapd/snaps/canonical-livepatch_49.snap)
/dev/loop2: [2053]:5243293 (/var/lib/snapd/snaps/canonical-livepatch_50.snap)
/dev/loop0: [2053]:5249134 (/var/lib/snapd/snaps/core_5897.snap)
/dev/loop5: [2053]:5249130 (/var/lib/snapd/snaps/core_6130.snap)
/dev/loop3: [2053]:5244442 (/var/lib/snapd/snaps/canonical-livepatch_54.snap)
root@Cassiopeia:~# losetup --detach /dev/loop6
root@Cassiopeia:~# echo $?
0
root@Cassiopeia:~# losetup -a
/dev/loop1: [2053]:5243868 (/var/lib/snapd/snaps/core_6034.snap)
/dev/loop6: [2053]:19401380 (/tmp/imagefile)
/dev/loop4: [2053]:5249290 (/var/lib/snapd/snaps/canonical-livepatch_49.snap)
/dev/loop2: [2053]:5243293 (/var/lib/snapd/snaps/canonical-livepatch_50.snap)
/dev/loop0: [2053]:5249134 (/var/lib/snapd/snaps/core_5897.snap)
/dev/loop5: [2053]:5249130 (/var/lib/snapd/snaps/core_6130.snap)
/dev/loop3: [2053]:5244442 (/var/lib/snapd/snaps/canonical-livepatch_54.snap)
Run Code Online (Sandbox Code Playgroud)

loop-device

7
推荐指数
1
解决办法
8416
查看次数

无法挂载 iso 文件“无法设置循环设备”

我正在使用 Ubuntu 18.04,并尝试使用以下命令安装 Matlab ISO:

sudo mount R2018a_glnxa64_dvd1.iso /mnt/cdrom -o loop
Run Code Online (Sandbox Code Playgroud)

但终端的响应如下:

mount: /mnt/cdrom: failed to setup loop device for R2018a_glnxa64_dvd1.iso.
Run Code Online (Sandbox Code Playgroud)

我不确定这意味着什么以及如何推进它。

loop-device

6
推荐指数
2
解决办法
3万
查看次数

将 PV 映像安装为只读循环设备(同样 - 它曾经有效)

几年前,我用更大的硬盘升级了我的上网本。我想保留旧硬盘上的内容,以防万一我还想删除它。

所以我将旧硬盘复制到新硬盘上的文件中:

dd if=/dev/sdd5 of=~/fw-disk-image/fw-sdd5-linux-lvm-partition.raw
Run Code Online (Sandbox Code Playgroud)

我编写/复制了一个脚本,用于将lvms作为只读文件系统安装在该分区上:

losetup -r /dev/loop1 ~/fw-disk-image/fw-sdd5-linux-lvm-partition.raw

pvscan
vgscan
vgchange -a y fw

cd /mnt/fw
for i in root tmp usr var home
  do
    mount -o ro /dev/fw/$i $i
  done
Run Code Online (Sandbox Code Playgroud)

现在这工作了很长一段时间,现在突然在vgchange -a y fw命令中失败了:

# vgchange -a y fw
  Error writing device /dev/loop1 at 4096 length 512.
  bcache_invalidate: block (4, 0) still dirty
  Failed to write mda header to /dev/loop1 fd -1
  Failed to update old PV extension headers in VG fw.
  Volume group "fw" …
Run Code Online (Sandbox Code Playgroud)

lvm loop-device

6
推荐指数
1
解决办法
1870
查看次数

kpartx:删除映射后无法卸载磁盘

我无法卸载在其上创建并删除映射的分区kpartx

# mount /dev/sdb1 usb/
# cd usb/

# kpartx -a -p sda -r -s -v sda.img
add map loop0sda1 (254:5): 0 16777216 linear 7:0 2048
add map loop0sda2 (254:6): 0 16777216 linear 7:0 16779264
add map loop0sda3 (254:7): 0 440401920 linear 7:0 33556480
add map loop0sda4 (254:8): 0 26159792 linear 7:0 473958400

# kpartx -dv /dev/loop0
del devmap : loop0sda4
del devmap : loop0sda3
del devmap : loop0sda2
del devmap : loop0sda1

# cd ..
    
#umount usb/ …
Run Code Online (Sandbox Code Playgroud)

shell mount lsof loop-device kpartx

6
推荐指数
1
解决办法
1061
查看次数

通过/dev/dm-X条目获取目标设备

我必须通过 映射几个环回设备dmsetup

我可以跟踪哪个环回设备映射到特定的/dev/dm-X设备文件,但是有没有一种简单的方法可以单独获取此信息/dev/dm-X

dmsetup info在这里对我没有任何帮助。

linux loop-device device-mapper

5
推荐指数
1
解决办法
919
查看次数

Cryptsetup:无法连接环回设备

我正在使用cryptsetup分离的标头。为此,我使用--header 参数来指定头文件。我可以使用以下方式打开我的设备:

cryptsetup luksOpen /dev/sdb1 sdb1 --header LUKS-HEADER
Run Code Online (Sandbox Code Playgroud)

但我需要提供标头,而不是作为文件,而是作为另一个命令的输出(我cat在这里使用命令进行说明)

cryptsetup luksOpen /dev/sdb1 sdb1 --header <(cat LUKS-HEADER)
Run Code Online (Sandbox Code Playgroud)

但这不起作用。我收到以下错误:

Attaching loopback device failed (loop device with autoclear flag is required).
Run Code Online (Sandbox Code Playgroud)

这很令人困惑,因为类似的方法适用于提供密钥,即

cryptsetup luksOpen /dev/sdb1 sdb1 --header LUKS-HEADER --key-file <(printf asdf)
Run Code Online (Sandbox Code Playgroud)

上面的命令工作正常(我使用“asdf”作为示例密码)。

如何--header从管道/另一个进程向选项提供参数?

赏金更新:

接受的答案有效,即我可以使用:

cat LUKS-HEADER > /dev/ram0
cryptsetup luksDump /dev/ram0
Run Code Online (Sandbox Code Playgroud)

但是,我需要一个如何使用进程替换的解决方案,即。目前,进程替换不起作用:

cryptsetup luksDump <(cat LUKS-HEADER)
Run Code Online (Sandbox Code Playgroud)

它给出了错误:

Attaching loopback device failed (loop device with autoclear flag is required).
Run Code Online (Sandbox Code Playgroud)

pipe process-substitution loop-device cryptsetup

5
推荐指数
1
解决办法
3722
查看次数

无法挂载循环设备上创建的分区(指向文件)

目标

\n\n

我正在尝试使用文件从头开始制作硬盘映像。这包括 MBR、分区表、分区数量等。但我一生都无法让 Linux 挂载我创建的分区。

\n\n

编辑:请参阅问题末尾的更新 - 似乎与 vboxsf 有关

\n\n

程序

\n\n

到目前为止,我已经尝试了许多不同的方法,但那些最有效的方法最终都到达了同一个地方。我在下面制作了一个简化版本,应该足以解释我的问题

\n\n

使用 dd 生成空文件(或截断速度)

\n\n
dd if=/dev/zero of=test.img bs=1M count=150\n
Run Code Online (Sandbox Code Playgroud)\n\n

制作分区表

\n\n
parted -s test.img mklabel gpt\nWarning: The resulting partition is not properly aligned for best performance.\n
Run Code Online (Sandbox Code Playgroud)\n\n

制作分区

\n\n
parted -s test.img -- mkpart logical 0 5M\nparted -s test.img set 1 bios_grub on\nparted -s test.img -- mkpart logical 5M 50M\netc.\n
Run Code Online (Sandbox Code Playgroud)\n\n

安装为循环设备(加载 max_part=31 的循环模块)

\n\n
losetup /dev/loop0 test.img\n
Run Code Online (Sandbox Code Playgroud)\n\n

lsblk 来检查

\n\n …

filesystems partition loop-device disk-image partition-table

5
推荐指数
1
解决办法
2748
查看次数

可以通过稀疏文件使 Lostup 变得高效吗?

所以我的设置是这样的。

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ dd if=/dev/urandom of=/mnt/loop/file bs=1M count=10240
$ ls -sh volume
12G volume
Run Code Online (Sandbox Code Playgroud)

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

$ rm /mnt/loop/file
$ ls -sh volume
12G volume
Run Code Online (Sandbox Code Playgroud)

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

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

TL;DR:有没有一种方法可以losetup忽略空块对空扇区的写入,同时允许其他所有操作?

sparse-files loop-device fallocate-command

5
推荐指数
1
解决办法
2015
查看次数

进程退出时循环设备可以自动清理吗?

我正在尝试找出一种干净且安全的方法来在构建脚本内使用循环设备。据我所知,如果您想要(GPT)分区和(FAT32,EXT3)格式化稀疏文件1 ,则需要循环设备。

例如:假设我有这个脚本:

#!/bin/bash
set -ex
truncate --size 4G target.img
sfdisk target.img < partitions
loop_device=$(losetup -f --show target.img)
trap "losetup -d $loop_device" EXIT
partx -u $(loop_device)
mkfs.vfat ${loop_device}p1
mkfs.ext4 ${loop_device}p2
Run Code Online (Sandbox Code Playgroud)

在大多数快乐和不快乐的路径中,循环设备将通过 bash 调用来清理losetup。但也有一些不愉快的路径2导致循环设备被抛在后面。

如果这是有关挂载的问题,那么简单的解决方案是在挂载名称空间中运行unshare -m. 这将导致内核在进程退出时清理挂载点,而进程不会显式执行相同的操作。

此外,如果循环设备首先是通过挂载创建的,mount -o loop那么当挂载点存在时,循环设备将被清理,因此通过代理,挂载命名空间也可以用于清理循环设备。

但由于我所追求的是全为零的文件上的 GPT 分区表,因此没有文件系统可以成功安装在其上(据我所知)。

那么,当进程、进程组、命名空间等被清理时,是否有其他方法可以让内核清理循环设备?


  • 1 我知道存在解决方案,例如格式化单独的文件,然后使用dd偏移量进行复制,但这会导致将多个 GB 的零写入磁盘,而不是保留为稀疏文件。所以这里“稀疏”二字很重要
  • 2 一个明显的例子是当 bash 被杀死时会发生什么kill -9

linux linux-kernel loop-device

5
推荐指数
1
解决办法
480
查看次数