Sign inSign up

linkacloud/d2vm

By linkacloud

•Updated 8 months ago

Image
0

9.6K

linkacloud/d2vm repository overview

⁠d2vm (Docker to Virtual Machine)

Language: Go Go Reference Chat

Build virtual machine image from Docker images

The project is heavily inspired by the article⁠ and the work done by iximiuz⁠ on docker-to-linux⁠.

Many thanks to him.

Status: alpha

asciicast

⁠Supported Environments:

Only Linux is supported.

If you want to run it on OSX or Windows (the last one is totally untested) you can do it using Docker:

alias d2vm='docker run --rm -i -t --privileged -v /var/run/docker.sock:/var/run/docker.sock -v $PWD:/build -w /build linkacloud/d2vm' 

⁠Supported VM Linux distributions:

Working and tested:

  • Ubuntu
  • Debian
  • Alpine

Need fix:

  • CentOS

Unsupported:

  • RHEL

The program use the /etc/os-release file to discover the Linux distribution and install the Kernel, if the file is missing, the build cannot succeed.

Obviously, Distroless images are not supported.

⁠Getting started

Clone the git repository:

git clone https://github.com/linka-cloud/d2vm && cd d2vm

Install using the Go tool chain:

go install ./cmd/d2vm
which d2vm
# Should be install in the $GOBIN directory
/go/bin/d2vm

Or use an alias to the docker image:

alias d2vm='docker run --rm -i -t --privileged -v /var/run/docker.sock:/var/run/docker.sock -v $PWD:/build -w /build linkacloud/d2vm'
which d2vm
d2vm: aliased to docker run --rm -i -t --privileged -v /var/run/docker.sock:/var/run/docker.sock -v $PWD:/build -w /build linkacloud/d2vm
⁠Converting an existing Docker Image to VM image:
b2vm convert --help
Convert Docker image to vm image

Usage:
  d2vm convert [docker image] [flags]

Flags:
  -d, --debug                  Enable Debug output
  -f, --force                  Override output qcow2 image
  -h, --help                   help for convert
  -o, --output string          The output image (default "disk0.qcow2")
  -O, --output-format string   The output image format, supported formats: qcow2 qed raw vdi vhd vmdk (default "qcow2")
  -p, --password string        The Root user password (default "root")
      --pull                   Always pull docker image
  -s, --size string            The output image size (default "10G")

Create an image based on the ubuntu official image:

sudo d2vm convert ubuntu -o ubuntu.qcow2 -p MyP4Ssw0rd
INFO[0000] pulling image ubuntu                         
INFO[0001] inspecting image ubuntu                      
INFO[0002] docker image based on Ubuntu                 
INFO[0002] building kernel enabled image                
INFO[0038] creating root file system archive            
INFO[0040] creating vm image                            
INFO[0040] creating raw image                           
INFO[0040] mounting raw image                           
INFO[0040] creating raw image file system               
INFO[0040] copying rootfs to raw image                  
INFO[0041] setting up rootfs                            
INFO[0041] installing linux kernel                      
INFO[0042] unmounting raw image                         
INFO[0042] writing MBR                                  
INFO[0042] converting to qcow2

You can now run your ubuntu image using the created ubuntu.qcow2 image with qemu:

./qemu.sh ununtu.qcow2
SeaBIOS (version 1.13.0-1ubuntu1.1)


iPXE (http://ipxe.org) 00:03.0 CA00 PCI2.10 PnP PMM+BFF8C920+BFECC920 CA00



Booting from Hard Disk...

SYSLINUX 6.04 EDD 20191223 Copyright (C) 1994-2015 H. Peter Anvin et al
Now booting the kernel from SYSLINUX...
Loading /boot/vmlinuz... ok
Loading /boot/initrd.img...ok
[    0.000000] Linux version 5.4.0-109-generic (buildd@ubuntu) (gcc version 9)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz ro root=UUID=b117d206-b8
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Hygon HygonGenuine
[    0.000000]   Centaur CentaurHauls
[    0.000000]   zhaoxin   Shanghai

...

Welcome to Ubuntu 20.04.4 LTS!

[    3.610631] systemd[1]: Set hostname to <localhost>.
[    3.838984] systemd[1]: Created slice system-getty.slice.
[  OK  ] Created slice system-getty.slice.
[    3.845038] systemd[1]: Created slice system-modprobe.slice.
[  OK  ] Created slice system-modprobe.slice.
[    3.852054] systemd[1]: Created slice system-serial\x2dgetty.slice.
[  OK  ] Created slice system-serial\x2dgetty.slice.

...

Ubuntu 20.04.4 LTS localhost ttyS0

localhost login: 

Log in using the root user and the password configured at build time.

localhost login: root
Password:


Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-109-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@localhost:~#

Type poweroff to shutdown the vm.

⁠Building a VM Image from a Dockerfile

The example directory contains very minimalistic examples:

cd examples

ubuntu.Dockerfile :

FROM ubuntu

RUN apt update && apt install -y openssh-server && \
    echo "PermitRootLogin yes" >> /etc/ssh/sshd_config \

When building the vm image, d2vm will create a root password, so there is no need to configure it now.

Build the vm image:

The build command take most of its flags and arguments from the docker build command.

d2vm build --help
Build a vm image from Dockerfile

Usage:
  d2vm build [context directory] [flags]

Flags:
      --build-arg stringArray   Set build-time variables
  -d, --debug                   Enable Debug output
  -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile') (default "Dockerfile")
      --force                   Override output image
  -h, --help                    help for build
  -o, --output string           The output image (default "disk0.qcow2")
  -O, --output-format string    The output image format, supported formats: qcow2 qed raw vdi vhd vmdk (default "qcow2")
  -p, --password string         Root user password (default "root")
  -s, --size string             The output image size (default "10G")

sudo d2vm build -p MyP4Ssw0rd -f ubuntu.Dockerfile -o ubuntu.qcow2 .

Or if you want to create a VirtualBox image:

sudo d2vm build -p MyP4Ssw0rd -f ubuntu.Dockerfile -O vdi -o ubuntu.vdi .
⁠Complete example

A complete example setting up a ZSH workstation is available in the examples/full⁠ directory.

⁠Internal Dockerfile templates

You can find the Dockerfiles used to install the Kernel in the templates⁠ directory.

⁠TODO / Questions:
  • Create service from ENTRYPOINT CMD WORKDIR and ENV instructions ?
  • Inject Image ENV variables into .bashrc or other service environment file ?
  • Use image layers to create rootfs instead of container ?

Tag summary

Content type

Image

Digest

sha256:736f29275…

Size

75.9 MB

Last updated

8 months ago

docker pull linkacloud/d2vm