可以使用这样的qemu-img
将原始映像转换为VMDK映像:
qemu-img convert -O vmdk "$_raw" "$_vmdk"
我知道可以用以下方式设置生成的VMDK映像的UUID:
VBoxManage internalcommands sethduuid "$_vmdk" "$_uuid"
在用qemu-img
转换磁盘时,是否有一种方法可以设置它的UUID (如果该解决方案在FreeBSD上工作的话)?
发布于 2020-06-24 06:29:24
这个答案是从我的头顶,没有测试。如果您测试它,请随时更新答案。
不幸的是,这个问题没有什么背景来解释我们为什么要这样做。从表面上看,我们只需参考undefined并给出答案:不。
但那会很无聊的。相反,让我们做一些疯狂的假设,然后继续做下去。
您所描述的解决方案可以在FreeBSD上使用来自模拟器/qemu-utils的qemu-img
和来自仿真器/虚拟盒-ose的vboxmanage。也许这就是你要做的?但是您没有说明为什么这是一个问题(也许只想少使用一个工具?)。
有趣的是,这仅仅意味着:您正在磁盘上使用GUID划分表(GPT)。qemu-img
并不真正关心磁盘上的内容,而vboxmanage
足够好,可以有一个助手函数。
因此,如果您有/dev/ada0
的完整原始副本为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处发现了混合endian中的磁盘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。
如果你沿着这条路走,请注意:
这将是一个有趣的小脚本编写。
我有一个偷偷摸摸的怀疑,你真正想要的是保持原始的原始形象,并在飞行中做事情。我们在一定程度上是因为xxd
同时支持stdin
和stdout
,这样我们就可以通过管道输送。不幸的是,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
我为什么要展示这个?好吧,也许你在做些什么。然后,我们在FreeBSD:mkimg(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为中心,但它使用的是原始分区。因此,如果您将源从原始的完整磁盘映像更改为仅分区映像,则应该有一个可行的路径。
https://unix.stackexchange.com/questions/594587
复制