如何在VirtualBox中设置云镜像?

我想将云镜像(之前的UEC镜像)转换为可引导的VirtualBox虚拟硬盘(用于Vagrant)。我可以在kvm中运行该镜像(使用https://help.ubuntu.com/community/UEC/Images作为起点),但是如何将.img磁盘文件转换为可引导的VirtualBox硬盘呢?我不想使用软盘作为引导方式。
3个回答


虽然确实有用,但它并不能解决当前的问题,因为云镜像的磁盘文件不是一个可引导的磁盘。在KVM中可以工作是因为我可以引导特定的内核文件,并告诉它根文件系统的位置。我需要的是将磁盘镜像转换成一个可引导的磁盘的方法。 - Magne Rasmussen
2然后你必须像处理真实计算机一样解决这个问题,加载一个Live CD/USB镜像,chroot到目标磁盘,安装引导程序和内核。从那里开始,在KVM中使其正常工作,然后将其转换为VirtualBox镜像。 - ppetraki
@ppetraki想把那个作为一个回答来投票吗? - Tom Brossman
@Tom:抱歉,我不再使用Vbox了。 - ppetraki

解决方案确实是使图像本身可引导。在搜索了几天互联网后,我发现解决方案是使用extlinux软件包,它是syslinux的一个衍生版本——用于使FAT磁盘可引导的解决方案。extlinux适用于e2fs和其衍生版本,在任何旧的ext2系统上都能完美运行。
mkdir /mnt/image
mount -o loop cloud-image.img /mnt/image
mkdir /mnt/image/extlinux/
extlinux --install /mnt/image/extlinux/
echo "DEFAULT /vmlinuz" > /mnt/image/extlinux/extlinux.conf
echo "APPEND root=/dev/sda init=/usr/lib/cloud-init/uncloud-init" \
     "ubuntu-pass=ubuntu ds=nocloud" >> /mnt/image/extlinux/extlinux.conf
umount /mnt/image

这将使镜像可引导,并且 禁用内置云初始化技术 等等。

注:我还没有找出如何指定一个 APPEND,使其能够使用 "root=LABEL=cloudimage-rootfs"。

然后,生成的镜像可以在 qemu、kvm 或 vmware 上引导,无需额外的软盘、内核或其他任何东西。从我所了解的情况来看,通过 apt-get 升级内核 将会使下次引导时该内核生效。

编辑:我忘记提到明显的事实,即您需要在原始磁盘镜像上执行此回环挂载操作,然后使用 vboxmanage convertfromraw cloud-image.img cloud-image.vdi 将生成的文件转换为 VDI。


root=LABEL=cloudimage-rootfs 可以被替换为root=/dev/disk/by-label/cloudimg-rootfs尚未测试,但我会假设 initrd 使用 udev据我所知,LABEL 往往是一个 init 脚本变量,意味着它依赖于 Ubuntu 的 init 脚本,而我对此了解不够。 - strings
为什么不直接启动虚拟机并安装grub呢? - Blaisorblade
这个目的是为了能够在不启动它的情况下进行操作,以支持在非云环境中使用标准 UEC 镜像的功能,比如 cloud-init。我认为这个答案可能已经过时了,因为我发现 UEC 镜像实际上是可直接启动的(而几年前并非如此)。 - mogsie
如果你想使用VirtualBox,你可以使用VBoxManage internalcommands createrawvmdk -filename cloud-image.vmdk -rawdisk cloud-image.img来创建一个元描述文件,以便在新的虚拟机中使用该镜像。 - Florian

现在有一个Ova格式的镜像,在导入到VirtualBox后可以正常工作,请参见下面我长时间的搜索。我还没有弄清楚如何在Virt-manager中引导镜像,但是extlinux没有帮助。它无法通过直接引导来识别内核文件位置。 Ubuntu云镜像有哪些不同版本可用?