如何附加虚拟硬盘来占用/dev/sdb?

如何附加虚拟硬盘来占用/dev/sdb?

我想插入虚拟硬盘(或任何东西)来占用系统块/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(或zeronull,甚至dvdrom)虚拟设备。

答案2

如果您想使用原始磁盘映像文件,您可以使用环回设备将其作为块设备进行访问(如/dev/sdb)。

  1. 创建一个空图像:dd if=/dev/zero of=/path/to/the/image bs=1M count=10240
    这将创建一个大小为 10 GiB 的空图像。
  2. 将图像与循环设备关联:sudo losetup -f --show /path/to/the/image
    这将打印所使用的循环设备。假设它是/dev/loop0
  3. 创建分区(和文件系统):sudo gparted /dev/loop0
  4. 移動原文/dev/sdbfor a in /dev/sdb* ; do sudo mv "$a" "$a-orig" ; done
  5. 复制循环设备来代替/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 支持,因此它是易失性的。使用我在此处提出的方法,数据实际上将被写入分区或文件。

相关内容