我想插入虚拟硬盘(或任何东西)来占用系统块/dev/sdb,我如何在 Linux(Ubuntu 和 Debian)中做到这一点?
答案1
创建一个您想要的虚拟硬盘大小的文件(以下将创建一个 1Mx1024 或 1GByte 的文件):
dd if=/dev/zero of=virtual_hard_drive.bin bs=1M count=1024
创建一个循环设备来代替/dev/sdb
mknod /dev/sdb b 7 500
不,如果您已经有了,这将不起作用/dev/sdb
。
万一发生这种情况,您需要将 500 更改为另一个数字/dev/loop500
。
现在,将您的文件分配给此循环设备
losetup /dev/sdb virtual_hard_drive.bin
现在,通过 Linux 的循环设备机制,您有了一个充当硬盘的文件。此时,您需要使用mke2fs /dev/sdb
或类似方法对其进行格式化,然后以通常的方式将其挂载。
为了使其在启动时工作,需要对启动时脚本进行一些编辑,因为检查的脚本本身fstab
不会/dev/sdb
在启动时变成循环设备。
如果您确实不需要那里的卷,您可以执行类似操作ln -s /dev/sdb /dev/full
来/dev/sdb
“指向” full
(或zero
或null
,甚至dvdrom
)虚拟设备。
答案2
如果您想使用原始磁盘映像文件,您可以使用环回设备将其作为块设备进行访问(如/dev/sdb
)。
- 创建一个空图像:
dd if=/dev/zero of=/path/to/the/image bs=1M count=10240
这将创建一个大小为 10 GiB 的空图像。 - 将图像与循环设备关联:
sudo losetup -f --show /path/to/the/image
这将打印所使用的循环设备。假设它是/dev/loop0
。 - 创建分区(和文件系统):
sudo gparted /dev/loop0
- 移動原文
/dev/sdb
:for a in /dev/sdb* ; do sudo mv "$a" "$a-orig" ; done
- 复制循环设备来代替
/dev/sdb
:l=/dev/loop0 ; d=/dev/sdb ; sudo cp -a "$l" "$d" ; for a in "$l"* ; do sudo cp -a "$a" "$d${a#$l}" ; done
/path/to/the/image
此后,您将可以访问包含分区的磁盘映像/dev/sdb
。
答案3
为什么你特别需要它/dev/sdb
?我认为你需要解释为什么你想要一些东西占据那个块设备节点,因为你不能简单地让一些东西使用它。如果你有一些软件想要读取/dev/sdb
,你可以改变软件。
在最坏的情况下,你可以使用SCSI 调试主机模拟器。只需执行modprobe scsi_debug
,默认会提供一个 SCSI 设备。请注意,它不会明确位于 上/dev/sdb
,而是始终位于下一个可用的 SCSI 设备上。
答案4
基于losetup
上述给出的解决方案不会创建 SCSI 块设备,因此它们不会创建/dev/sd*
设备节点,并且需要进行一些重命名或链接才能创建设备节点,并且某些软件可能找不到合适的设备,因为它没有使用 SCSI 子系统。
可以使用 创建由分区或文件支持的 SCSI 磁盘设备targetcli
。请参阅http://linux-iscsi.org/wiki/Tcm_loop, 和https://stackoverflow.com/questions/30972176/creating-a-loopback-device-in-lio-scsi-target这涵盖了这些说明中的一个问题。与@robbat2 建议的 SCSI 调试主机模拟器一样,此设备将被分配下一个可用的标识符。
我了解到 SCSI 调试主机模拟器由 RAM 支持,因此它是易失性的。使用我在此处提出的方法,数据实际上将被写入分区或文件。