作为磁盘

作为磁盘

可以将原始映像转换为 VMDK 映像,如下qemu-img所示:

qemu-img convert -O vmdk "$_raw" "$_vmdk"

我知道可以使用以下命令设置生成的 VMDK 映像的 UUID:

VBoxManage internalcommands sethduuid "$_vmdk" "$_uuid"

有没有办法在转换时设置磁盘的 UUID qemu-img(如果该解决方案适用于 FreeBSD,那就太好了)?

答案1

这个答案来自我的脑海,并且是不是已测试。如果您测试过,请随时更新答案。

不幸的是,这个问题几乎没有背景来解释我们为什么这样做。从表面上看,我们可以参考qemu-img并给出答案:不。

但那会很无聊。相反,让我们做出一些疯狂的假设并运行它。

您所描述的解决方案在 FreeBSD 上是可能qemu-img模拟器/qemu-utils和 vboxmanage 来自模拟器/virtualbox-ose。也许这就是你正在做的事情?但您没有说明为什么这是一个问题(也许只是想少用一个工具?)。

有趣的是,这只是暗示:你正在使用GUID 分区表 (GPT)在你的磁盘上。qemu-img并不真正关心磁盘上有什么,但vboxmanage有一个辅助函数就足够好了。

作为磁盘

/dev/ada0因此,如果您拥有as的完整原始副本ada0.dd(或者只是 Qemu 中生成的原始文件),那么您可以将该映像用作虚拟内存磁盘:

# mdconfig -a -t vnode -u 0 -f /home/johndoe/ada0.dd

这将为我们提供/dev/md0您的完整磁盘。

然后你可以检查一切看起来都很好。

# fdisk /dev/md0

这应该看起来与您的旧磁盘完全相同。

# glabel status

使用 GPT 时,您可能更喜欢使用gpart

# gpart create -s gpt /dev/md0

UUID 是使用此命令自动创建的。我不知道它是否真的触及分区表中的条目。在这种情况下,请先进行备份。也许销毁整个表 - 创建然后恢复?您需要在这里进行一些测试。但关键是您现在可以完全访问该驱动器。

您可以使用挂载文件系统这个方法还有

作为文件

当我们检查 GUID 分区表原理图时维基百科我们被告知,我们在分区表头的偏移量 56 处找到了混合字节序的磁盘 GUID。

GUID分区表方案

因此,我们可以简单地将它们视为一堆字节,而不是安装磁盘映像。我假设您使用的是 512 字节扇区,但您可能需要针对 4K 扇区进行调整。标头位于 LBA 1,我们对偏移量 56 感兴趣 - 因此 512 + 56 = 568

$ hexdump -v -s 568 -n 16 -e '1/1 "%.2x\n"' /home/johndoe/ada0.dd

然后我们可以简单地更改所需的字节。 Hexdump 还不够,你应该看看xxd附带编辑/vim乌伊德根可以帮助您生成正确的 GUID。

如果您沿着这条路线走,请注意:

  • 在编写任何内容之前检查签名“EFI PART”,使您的脚本具有弹性
  • 请记住,您还有标头的辅助副本,也需要更正(通过偏移量 32 找到它)

这将是一个有趣的小脚本。

流媒体

我偷偷地怀疑您真正想要的是保持原始原始图像的原始状态并即时执行操作。我们部分地在那里作为xxd支撑stdinstdout所以我们可以通过它进行管道输送。不幸的是它看起来不像qemu-img支持stdin

然后我们必须在磁盘上有一个文件。务实的解决方案是将原始文件作为备份,并使用新副本进行修改。这只会增加磁盘空间的成本。

但当您使用 FreeBSD 时,您有一种非常快速的方法来节省磁盘空间并避免进行复制。您可以利用 ZFS 来发挥自己的优势。只需创建一个新的数据集,在其中放置原始图像文件并创建快照。然后您可以直接修改文件,但它只会影响更改的字节(或者更确切地说更改的扇区)。完成后,您可以通过回滚快照来快速恢复这些扇区。

由于我们不想对所有内容进行快照,因此我们创建了一个特定的数据集

# zfs create zroot/rawfiles

我们将需要的任何数据放入其中/rawfiles并为干净状态创建快照。

# zfs snapshot zroot/rawfiles@cleanstate

然后我们可以修改可能很大的图像文件中的几个字节。当我们想回到干净的状态时,我们就回滚。

# zfs rollback zroot/rawfiles@cleanstate

如果您有空间限制,那么这是一个快速且可行的选择。如果你做了这样的事情,那么如果你继续回滚,请注意竞争条件。

如果您将其作为备份“以防万一”,那么您可以跳过创建单独的数据集并直接执行zfs snapshot zroot@hailmary.如果事情发生了那么就cp /.zfs/snapshot/hailmary/......

手动

如果您对图像创建过程有影响,我们也有一些有趣的选择。

我们可以用来qemu-img创建一个新映像,安装它并创建 GPT(使用新的 GUID)

# qemu-img create -f raw VM10G.raw 10G
# mdconfig -a -t vnode -u 0 -f VM10G.raw
# gpart create -s gpt /dev/md0

但因为它只是一个我们不需要的文件qemu-img

# truncate -s 10g VM10G.raw
# mdconfig -a -t vnode -u 0 -f VM10G.raw
# gpart create -s gpt /dev/md0

从头开始构建 UFS 可启动映像

我为什么要展示这个?好吧,也许你正在按照这些思路做一些事情。那么在 FreeBSD 上我们有一个非常巧妙的技巧:姆金格(1)

有了它,您可以在 FreeBSD 上创建磁盘映像,它支持 QCOW、QCOW2、动态 VHD、固定 VHD、VMDK 和 RAW。这意味着您可以直接进入VMDK。

mkimg -f vmdk -s gpt -b /boot/pmbr -p freebsd-boot:=/boot/gptboot -p freebsd-ufs:=root-file-system.ufs -p freebsd-swap::1G -o gpt.vmdk

该示例以 FreeBSD 为中心,但使用原始分区。因此,如果您将源从原始完整磁盘映像更改为仅分区映像,您应该有一个可行的途径。

相关内容