如何生成在许多不同的虚拟化系统上可用的文件系统映像?

我写了一个脚本,生成适合用户模式Linux的根文件系统映像(基于Debian lenny)。 (本质上,这个脚本创build一个文件系统镜像,安装一个循环设备,使用debootstrap创build一个lenny安装,为TUN / TAPnetworking设置一个静态IP,添加公共密钥以便通过SSHlogin并安装一个web应用程序。

这些文件系统的图像对于UML来说工作得非常好,但是能够生成类似的图像让人们可以在其他虚拟化软件上使用,而且我对这些选项根本不熟悉。 特别是,由于这个想法是将这个镜像作为一个独立的服务器来testingWeb应用程序,所以networking的工作是非常重要的。

我想知道是否有人可以build议定制这样的根文件系统映像,以便可以将其与其他虚拟化软件(如VMware,Xen)或Amazon EC2实例一起使用? 两个特别的问题是:

非常感谢您的build议…

VirtualBox有“VBoxManage convertdd”导入原始磁盘映像(用dd生成)到它自己特殊的.vdi格式。 我相信VMWare等也有类似的东西

各种虚拟化产品通常具有一些内核扩展(如VirtualBox访客扩展),使客户操作系统能够以各种方式与主机协同工作,这对安装通常是有帮助的。

开放虚拟化格式(OVF)似乎正在获得支持 – 请参阅http://en.wikipedia.org/wiki/Open_Virtualization_Format

与OP不同,我使用的是Centos7,主要的hypervisor是HyperV。 也就是说,其中大部分将适用于其他发行版和pipe理程序。

我有systemd-networkdconfiguration为在任何连接的接口上默认为DH​​CP,我没有networkingconfiguration的问题。 尽pipe我喜欢systemd-networkd的强大function,但是对于DNS来说,它需要systemd-resolved – 这与传统的parsing器行为显着不同 。 我坚持下去…现在。

我遇到的麻烦是内核模块。 首先,各种pipe理程序的许多模块没有安装。 其次, dracut (在centos和其他发行版上构buildinitramfs)查看当前的硬件,只包含与该硬件一起工作的模块。 可以通过--add-drivers强制包含其他模块,但必须知道模块的确切文件名。 对于任何给定的虚拟机pipe理程序,您可能需要虚拟存储和虚拟networking模块,也许还需要一个气球内存驱动程序等。

在为dracut创build参数时,请注意dracut modulekernel module之间的区别。

dracut选项列表可以在http://man7.org/linux/man-pages/man8/dracut.8.html#OPTIONSfind; 我结束了类似于以下内容(注意,我不知道内核模块名称是否准确 – 如果他们是只为HyperV):

dracut --kver 0 -f --xz -a "busybox mdraid" -o "bootchart dash plymouth btrfs dmraid fcoe-uefi iscsi nbd biosdevname" --no-kernel --add-drivers "hv_storvsc hv_vmbus hv_utils"

另一个答案build议OVF格式。 IIRC OVF导入到HyperV需要下载一个需要非常旧的.NET版本的插件…换句话说,如果HyperV将成为您最常用的虚拟机pipe理程序,那将是很痛苦的。

幸运的是,VHD可以被许多pipe理程序导入,并可以通过qemu-img从raw,qcow2等轻松创build。

另一种方式,可能是直接附加分区。

qemu它只是在命令行。

在VirtualBox你必须按照VirtualBox用户手册第9章 – “高级存储configuration”一节中所描述的步骤操作: http : //www.virtualbox.org/manual/ch09.html#id504534看起来或多或less像这样:

 VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda -register VBoxManage storageattach MyVM --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium /path/to/file.vmdk 

当然/ dev / sda可以改成任何块设备,尤其是分区(也许在LVM2上)。

在VMWare上也可以直接附加分区或磁盘。

多亏了这一点,在这样的configuration中,您甚至可以使用相同的安装从一个VM 切换到另一个。

你知道这个根文件系统的网站吗? 那里的所有文件系统最初是为与UML一起使用而开发的,但是它们应该可以与任何虚拟化解决scheme一起工作。 但请注意,由于映像是由单个循环安装的磁盘(没有分区表)组成的,因此没有安装引导加载程序。 您仍然可以使用-kernel命令行选项使用kvm启动它们,对于启动另一个映像(recovery or cd / image?)的其他-kernel ,您也可以自行安装bootloader。 很明显,您可能必须使用相关工具将此原始格式转换为您需要的任何格式(vdi / vmware / ..)。 如果您想自己创build文件系统,则包含脚本。