如何在 Fedora 19 上添加更多 /dev/loop* 设备?我愿意:
# uname -r
3.11.2-201.fc19.x86_64
# lsmod |grep loop
# ls /dev/loop*
/dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4 /dev/loop5 /dev/loop6 /dev/loop7 /dev/loop-control
# modprobe loop max_loop=128
# ls /dev/loop*
/dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4 /dev/loop5 /dev/loop6 /dev/loop7 /dev/loop-control
Run Code Online (Sandbox Code Playgroud)
所以什么都没有改变。
我经常使用映像驱动器,这意味着对有问题的驱动器进行 dd 复制,然后处理映像而不是驱动器本身。
对于大多数工作,我使用 kpartx 将驱动器的分区映射到 /dev/mapper/ 下的设备。我在这里想知道是否有办法找到哪个映射属于哪个图像。
考虑一下:
root@vyvyan:/tmp# kpartx -a -v Image1
add map loop1p1 (254:4): 0 10240 linear /dev/loop1 2048
add map loop1p2 (254:5): 0 10240 linear /dev/loop1 12288
add map loop1p3 (254:6): 0 52848 linear /dev/loop1 22528
root@vyvyan:/tmp# kpartx -a -v Image2
add map loop2p1 (254:7): 0 33508 linear /dev/loop2 2048
add map loop2p2 (254:8): 0 39820 linear /dev/loop2 35556
Run Code Online (Sandbox Code Playgroud)
现在,假设我忘记了哪个图像去了哪个映射。有没有办法让 kpartx - 或内核,或其他任何东西 - 告诉我哪个图像去哪里?
编辑另外,如果我在 kpartx 添加映射时不小心 rm 图像文件,你如何删除映射?kpartx 希望显示实际图像。
我正在编写一些 shell 脚本来处理一些磁盘映像,我需要使用循环设备来访问一些磁盘映像。但是,我不确定如何在不将我的程序暴露于竞争条件的情况下正确分配循环设备。
我知道我可以losetup -f用来获取下一个未分配的循环设备,然后像这样分配该循环设备:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Run Code Online (Sandbox Code Playgroud)
但是,在我想同时运行多个程序实例的情况下,这几乎是竞争条件的教科书示例,这让我非常困扰。如果我有这个程序的多个实例正在运行,或者其他程序也试图获得一个循环设备,那么每个进程可能无法在下一个调用之前分配循环设备losetup -f,在这种情况下,两个进程都会认为同一个循环设备可用,但只有一个人可以得到它。
我可以为此使用外部同步,但我想(如果可能)避免额外的复杂性。此外,使用循环设备的其他程序可能不会尊重我可能提出的任何同步。
我怎样才能避免这种潜在的竞争条件?理想情况下,我希望能够以原子方式发现和绑定循环设备,例如使用如下命令:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,$ld不会被分配到循环设备路径,并sudo移出,因为在sudo ld=$(losetup -f myfile.img)给出权限错误。
我正在尝试创建一个循环设备,并收到一个我不明白的错误:
# losetup -f /media/2TB/sdb2-fix-file
losetup: cannot find an unused loop device
Run Code Online (Sandbox Code Playgroud)
我没有设置循环设备。的输出losetup -a为空,并且:
# ls -l /dev/loop*
crw-rw---- 1 root disk 10, 237 Oct 4 15:50 /dev/loop-control
Run Code Online (Sandbox Code Playgroud)
跑步losetup -D根本没有帮助。
为什么会出现这种情况?
下面是完整的strace输出:
Run Code Online (Sandbox Code Playgroud)# strace -fs80 losetup -f /media/2TB/sdb2-fix-file execve("/usr/bin/losetup", ["losetup", "-f", "/media/2TB/sdb2-fix-file"], 0x7ffc6fe88c38 /* 164 vars */) = 0 brk(NULL) = 0x55a51e754000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=215090, ...}) = 0 mmap(NULL, …
从这个答案中,解决方案是
modprobe loop max_loop=64
Run Code Online (Sandbox Code Playgroud)
这让我可以使用 64 个环回设备
mknod -m 660 /dev/loop8 b 7 8
Run Code Online (Sandbox Code Playgroud)
创建设备。我为 8、9、10 和 8,9 作品做了这个,但 10 没有。
然后我尝试使用 loopa 到 loopf 并尝试安装第 11 个设备,但出现错误
Error: Failed to set up a loop device:
Run Code Online (Sandbox Code Playgroud)
如何制作 >10 个循环设备?
我正在尝试在 ArchLinux 上mount访问 .ima 格式的软盘映像文件(原始转储到软盘,类似于.img)。
此文件是 30 个文件集的一部分。它不可引导,而是文件集的延续。目的不是为了安装或克隆而进行操作。我对磁盘上其他数据所包含的文档感兴趣。
以下是有关此图像文件的一些信息:
# file U19.IMA
U19.IMA: PC formatted floppy with no filesystem
# fdisk -lu U19.IMA
Disk U19.IMA: 1.4 MiB, 1474560 bytes, 2880 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
(parted) print
Error: /home/meh/Downloads/U19.IMA: unrecognised disk label
Model: (file)
Disk /home/meh/Downloads/U19.IMA: 1475kB
Sector size (logical/physical): 512B/512B
Partition Table: unknown …Run Code Online (Sandbox Code Playgroud) 我喜欢创建一个 LVM 设备,其中物理卷是环回设备。
我已经阅读了很多文档和教程,就像这样。不幸的是,所有这些都基于lostup命令,该命令在下次重新启动时会丢失其配置。
我将使用 FSTAB 代替 RC.LOCAL(可能编写了 Lostup 脚本)进行 LVM 设置,以便在某些服务启动之前运行我的 LVM,但我不知道如何将命令复制到 FSTAB 中:“ Lostup /dev/loop0 /opt/my-data-file-0" 等等...
我怎么能做到这一点?
出于好奇,我想知道有没有办法找出挂载分区的来源?
例如,输出df -h为:
/dev/loop1 3M 3M 0 100% /media/loop
从这个输出中,我知道 3M 的循环设备安装在/media/loop,但我不知道确定设备的确切位置/dev/loop1。
root@SHW:~# mount -o loop /home/SHW/Downloads/TinyCore-current.iso
/mnt/loop mount: block device /home/SHW/Downloads/TinyCore-current.iso is write-protected, mounting read-only
root@SHW:~# tail -n1 /proc/mounts
/dev/loop1 /mnt/loop iso9660 ro,relatime 0 0
Run Code Online (Sandbox Code Playgroud)
/dev/loop1我不知道谁挂载了这些分区,如何找出f的绝对路径?(在这种情况下,路径是/home/SHW/Downloads/TinyCore-current.iso.)
我正在尝试分离环回设备。
推测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 ×10
linux ×4
concurrency ×1
devices ×1
disk-image ×1
fedora ×1
floppy ×1
kernel ×1
lvm ×1
mount ×1
shell-script ×1