首页 > 其他分享 >从容器镜像构建虚拟机镜像——d2vm工具介绍

从容器镜像构建虚拟机镜像——d2vm工具介绍

时间:2023-04-18 11:23:57浏览次数:40  
标签:容器 -- 虚拟机 d2vm 镜像 image

从容器镜像构建虚拟机镜像——d2vm工具介绍

简介

容器镜像是容器技术的核心组成部分之一,得益于基于UnionFS的多层次容器镜像, 开发者在构建镜像时能够做到对已有镜像层的高度复用,而在使用镜像时也能够较大程度上节约磁盘空间和网络带宽,从而为容器技术的广泛流行奠定了基础。

虚拟机镜像指包含可启动操作系统的虚拟磁盘文件,虚拟机镜像是虚拟机创建流程的前提条件,用户在创建虚拟机时需要事先准备一个虚拟机镜像,随后使用该镜像创建一个虚拟机实例。目前为止,虚拟机镜像格式已经发展得十分成熟,除了原始的raw镜像格式外,众多镜像格式在此基础上添加了一些高级特性,如快照、扩容、加密、后备镜像等等。

不过,对于如何制作虚拟机镜像这方面,仍没有一个能够像容器镜像构建那样简单方便且好用的工具,一部分工具将构建过程嵌入到代码中,可读性较差,且扩展性受限,而一些新的工具采用了声明式的方式,虽说提升了可读性,但镜像复用、构建速度等方面仍有待提升。那么,有没有一种办法将容器镜像转化成虚拟机镜像,从而完整地享受到容器镜像构建的优势?在网上搜索,已经有一些热心的开源开发者贡献了自己的方案,本文主角:d2vm 就是其中之一。

使用

首先,按照文档中提供的方法安装d2vm,这里采用容器化部署方式:

docker pull linkacloud/d2vm:latest
alias d2vm="docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock --privileged -v \$PWD:/d2vm -w /d2vm linkacloud/d2vm:latest"

将容器镜像centos:7.9.2009转换为虚拟机镜像centos7.9.qcow2

d2vm convert centos:7.9.2009 -o centos7.9.qcow2 -p 000000
Using local image centos:7.9.2009
Inspecting image centos:7.9.2009
Docker image based on CentOS Linux 7 (Core)
Building kernel enabled image
Creating vm image
Creating raw image
Mounting raw image
Creating raw image file system
Copying rootfs to raw image
Setting up rootfs
Installing linux kernel
Unmounting raw image
Writing MBR
Converting to qcow2

随后,对已生成的虚拟机镜像进行调试:

# 如果是centos,需要执行ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-system-x86_64
d2vm run qemu centos7.9.qcow2
...
[  OK  ] Reached target Network.
[  OK  ] Reached target Network is Online.
[  OK  ] Started Update UTMP about System Runlevel Changes.
[    4.623933] tsc: Refined TSC clocksource calibration: 2199.996 MHz
[    4.855933] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

CentOS Linux 7 (Core)
Kernel 3.10.0-1160.88.1.el7.x86_64 on an x86_64

localhost login:

可以看到,该镜像成功启动。

原理

众所周知,容器常常类比为轻量级的虚拟机,因为复用了宿主机的操作系统内核,不需要运行额外的内核,其省去了内核运行的开销,且也省去了内核的启动过程。那么容器镜像转虚拟机镜像的重点则自然也在于补全内核和启动过程这两部分。

基础的Linux发行版容器镜像出于节省磁盘空间的目的,往往会在镜像制作的最后删除/boot、/lib/modules等目录,或者制作时压根不安装kernel相关的软件包,转虚拟机镜像的第一步就是安装这类必备的软件包,包括kernel、systemd、network等等。

其次需要补全启动过程,容器镜像缺失了一部分系统启动所需要的文件,这部分文件需要补全。在Linux系统的启动过程中,bios会事先读取磁盘的分区表,从中获取引导程序并转交控制权,引导程序从配置文件中获取内核和initrd的位置并加载,initrd使用完后会挂载根分区并执行初始进程。在定义分区表并划分分区后,容器镜像至少需要补全如下文件:

  1. 引导程序;
  2. 引导配置文件,包括内核的位置与启动参数;
  3. /etc/fstab文件中需要包括根目录的挂载信息;
  4. 视情况初始化/etc/resolv.conf、/etc/hostname、/etc/hosts等文件。

如下是d2vm工具将容器镜像转化为虚拟机镜像的流程:

graph TB A(开始)-->B[执行d2vm convert命令] B-->D[检测镜像发行版] D-->E["准备Dockerfile,安装kernel"] E-->F["创建空白镜像,并生成分区"] F-->G["为分区创建文件系统,并挂载"] G-->H[将容器镜像文件导出到挂载目录] H-->J[配置根文件系统] J-->I[安装引导程序] I-->K[写入mbr至磁盘头部] K-->L[卸载镜像挂载点] L-->M[转换镜像格式] M-->Z(结束)

小结

该工具目前仍处于初期阶段,虽说已经能够成功跑通容器镜像转虚拟机镜像的流程,验证了方案的可行性,但也有一些问题有待解决。如下列举了部分已知问题:

  • 仅支持docker,没有适配其他容器镜像构建工具如buildah等
  • 仅支持mbr分区表格式,不支持efi,也不支持grub
  • 无法自定义分区划分
  • 镜像构建过程固化在代码中,无法自定义,导致内网中会因网络问题无法安装软件包而构建失败
  • 不支持openEuler等发行版
  • 部分代码存在bug,比如容器镜像地址不允许指定端口

总的来说,d2vm作为一款容器镜像转虚拟机镜像工具,已经能够顺利地实现转换的流程,而且处理流程浅显易懂,而在执行过程中所需要的问题,也可随着项目的发展而逐渐修复掉,因此值得先作为一个玩具尝试一下。

另外,有另外一款容器镜像转虚拟机镜像的项目:[elemental-toolkit](rancher/elemental-toolkit: The toolkit to build, ship and maintain cloud-init driven Linux derivatives based on container images (github.com)),该项目更加庞大,也更复杂,之后有时间也可以看看。

参考文档

Tool support for image creation — Virtual Machine Image Guide documentation (openstack.org)

linka-cloud/d2vm: Build Virtual Machine Image from Dockerfile or Docker image (github.com)

From Docker Container to Bootable Linux Disk Image (iximiuz.com)

标签:容器,--,虚拟机,d2vm,镜像,image
From: https://www.cnblogs.com/frankming/p/17319153.html

相关文章

  • 虚拟机网卡启动不了
    昨天晚上家中断电,早上起来重启虚拟机发现ssh连不上去了,在虚拟机内部发现ens33网卡没有启动,想着通过systemctl restart network重启该网卡,发现重启失败,通过journalctl-xe发现错误提示:Bringingupinterfaceens33:Error:Connectionactivationfailed在网上搜索一圈后尝试......
  • 配置淘宝镜像
    1.npm淘宝镜像npmconfigsetregistryhttps://registry.npm.taobao.org,切换国内镜像,使用淘宝镜像npmconfiggetregistry,查看当前镜像使用的地址,返回成功,则代表设置成功代码执行情况: 如果国内镜像使用不合适,则可切换为默认镜像(国外)命令如下:npmconfigsetregistryhttps......
  • 虚拟机ubuntu22.4报错ok_update_request:I/oerror, dev fdo, sector 0 op OX0:(READ)tl
    ok_update_request:I/oerror,devfdo,sector0opOX0:(READ)tlags0x0phys_segprioclass0BufferI/oerrorondevfdo,logicalblock0,asyncpageread如下图 不管你用的HYPER-V创建虚拟机,还是VMVBOX等。只要找到这里: 把DVD/CD或者软驱修改为物理驱动器,即可。 ......
  • 虚拟机的三种网络模式分别是什么含义?
    桥接模式:其实就是你的虚拟机当做局域网中的一员,跟你的主机是平起平坐的。虚拟机的网段和主机的网段是一样的。比如主机是192.168.1.101,虚拟机也是192.168.1.102.....弊端:假如你现在从学院回家了,主机的IP会发生变化,而你的虚拟机由于都是设置的静态,所以不发生变化,此时主机......
  • VMware中安装系统提示windows无法显示可用的安装镜像
    在虚拟机设置里将软盘删除即可......
  • VMWare虚拟机IP变成127.0.0.1怎么办
    输入命令:dhclient-v即可如果还不好使,可以试试下面的方法(Cnetos7)打配置文件vim/etc/sysconfig/network-scripts/ifcfg-ens33打开配置文件找到ONBOOT=no要改为ONBOOT=yes默认是ONBOOT=no,它打意思是:是否随网络服务启动,eth0生效,如果为no,则ifconfig看不到eth0 ......
  • 如何在 Parallels Desktop for Mac 中备份、恢复或转移 Windows 虚拟机
    备份是个好习惯,现实生活中来说,它堪比后悔药。除了潜在的计算机丢失的隐患,有时候预料不到的硬件故障也会需要我们有个备份。所以今天,小编来教大家如何在ParallelsDesktop中备份Windows虚拟机以避免数据丢失。你需要什么?以下步骤适用于任何版本的Windows。(或者,任何版本的Linux......
  • Dockerfile自定义镜像
    常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。镜像结构镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。我们以MySQL为例,来看看镜像的组成结构:简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、......
  • 交换机镜像口配置
    H3C交换机配置镜像端口配置步骤1.进入配置模式:system-view;2.创建本地镜像组:mirroring-group1local3.为镜像组配置源端口:mirroring-group1mirroring-port4.为镜像组配置目的端口:mirroring-group1monitor-port配置举例1.<sysname>system-vies     (进入配置模式)2.......
  • 企业级镜像仓库Harbor
    Harbor私有仓库安装1.安装Docker和DockerComposeDockerCE支持64位版本CentOS7,并且要求内核版本不低于3.10,CentOS7满足最低内核的要求,所以我们在CentOS7安装Docker。1.1.卸载(可选)如果之前安装过旧版本的Docker,可以使用下面命令卸载:yumremovedocker\......