diff --git a/README.md b/README.md index 36276e5..1d5b50a 100644 --- a/README.md +++ b/README.md @@ -13,17 +13,11 @@ Many thanks to him. **Status**: *alpha* -[![asciicast](https://asciinema.org/a/4WFKxaSNWTMPMeYbZWcSNm2nm.svg)](https://asciinema.org/a/4WFKxaSNWTMPMeYbZWcSNm2nm) +[![asciicast](https://asciinema.org/a/520132.svg)](https://asciinema.org/a/520132) ## 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: - -```bash -alias d2vm='docker run --rm -i -t --privileged -v /var/run/docker.sock:/var/run/docker.sock -v $PWD:/build -w /build linkacloud/d2vm' -``` +**Only building Linux Virtual Machine images is supported.** **Starting from v0.1.0, d2vm automatically run build and convert commands inside Docker when not running on linux**. @@ -47,31 +41,22 @@ Obviously, **Distroless** images are not supported. ## Getting started +### Install from release + +Download the latest release for your platform from the [release page](https://github.com/linka-cloud/d2vm/releases/latest) + +### Install from source + Clone the git repository: ```bash git clone https://github.com/linka-cloud/d2vm && cd d2vm ``` -Install using the Go tool chain: +Install using the *make*, *docker* and the Go tool chain: ```bash -go install ./cmd/d2vm -which d2vm -``` -``` -# Should be install in the $GOBIN directory -/go/bin/d2vm -``` - -Or use an alias to the **docker** image: - -```bash -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 +make build-dev && sudo cp d2vm /usr/local/bin/ ``` ### Converting an existing Docker Image to VM image: @@ -86,13 +71,20 @@ 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, the extension determine the image format. Supported formats: qcow2 qed raw vdi vhd vmdk (default "disk0.qcow2") - -p, --password string The Root user password (default "root") - --pull Always pull docker image - -s, --size string The output image size (default "10G") + --append-to-cmdline string Extra kernel cmdline arguments to append to the generated one + -f, --force Override output qcow2 image + -h, --help help for convert + --network-manager string Network manager to use for the image: none, netplan, ifupdown + -o, --output string The output image, the extension determine the image format, raw will be used if none. Supported formats: qcow2 qed raw vdi vhd vmdk (default "disk0.qcow2") + -p, --password string The Root user password (default "root") + --pull Always pull docker image + --raw Just convert the container to virtual machine image without installing anything more + -s, --size string The output image size (default "10G") + +Global Flags: + -t, --time string Enable formated timed output, valide formats: 'relative (rel | r)', 'full (f)' (default "none") + -v, --verbose Enable Verbose output + ``` @@ -102,27 +94,27 @@ 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 +Pulling image ubuntu +Inspecting image ubuntu +No network manager specified, using distribution defaults: netplan +Docker image based on Ubuntu 22.04.1 LTS (Jammy Jellyfish) +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 ``` You can now run your ubuntu image using the created `ubuntu.qcow2` image with **qemu**: ```bash -./qemu.sh ununtu.qcow2 +d2vm run qemu ubuntu.qcow2 ``` ``` SeaBIOS (version 1.13.0-1ubuntu1.1) @@ -210,7 +202,7 @@ cd examples FROM ubuntu RUN apt update && apt install -y openssh-server && \ - echo "PermitRootLogin yes" >> /etc/ssh/sshd_config \ + echo "PermitRootLogin yes" >> /etc/ssh/sshd_config ``` @@ -231,14 +223,20 @@ 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 - --force Override output image - -h, --help help for build - -o, --output string The output image, the extension determine the image format. Supported formats: qcow2 qed raw vdi vhd vmdk (default "disk0.qcow2") - -p, --password string Root user password (default "root") - -s, --size string The output image size (default "10G") + --append-to-cmdline string Extra kernel cmdline arguments to append to the generated one + --build-arg stringArray Set build-time variables + -f, --file string Name of the Dockerfile + --force Override output image + -h, --help help for build + --network-manager string Network manager to use for the image: none, netplan, ifupdown + -o, --output string The output image, the extension determine the image format, raw will be used if none. Supported formats: qcow2 qed raw vdi vhd vmdk (default "disk0.qcow2") + -p, --password string Root user password (default "root") + --raw Just convert the container to virtual machine image without installing anything more + -s, --size string The output image size (default "10G") + +Global Flags: + -t, --time string Enable formated timed output, valide formats: 'relative (rel | r)', 'full (f)' (default "none") + -v, --verbose Enable Verbose output ``` diff --git a/cmd/d2vm/build.go b/cmd/d2vm/build.go index 3263cb7..868da52 100644 --- a/cmd/d2vm/build.go +++ b/cmd/d2vm/build.go @@ -67,7 +67,7 @@ var ( for i, v := range dargs { switch v { case file: - rel, err := filepath.Rel(in, file) + rel, err := filepath.Rel(in, dockerFileAbsPath) if err != nil { return fmt.Errorf("failed to construct Dockerfile container paths: %w", err) } diff --git a/cmd/d2vm/main.go b/cmd/d2vm/main.go index ee3f9b9..9eae0d6 100644 --- a/cmd/d2vm/main.go +++ b/cmd/d2vm/main.go @@ -87,6 +87,7 @@ const ( red = 31 yellow = 33 blue = 36 + white = 39 gray = 90 ) @@ -100,14 +101,12 @@ func (f *logfmtFormatter) Format(entry *logrus.Entry) ([]byte, error) { switch entry.Level { case logrus.DebugLevel, logrus.TraceLevel: c = color.New(gray) - // case logrus.InfoLevel: - // c = color.New(blue) case logrus.WarnLevel: c = color.New(yellow) case logrus.ErrorLevel, logrus.FatalLevel, logrus.PanicLevel: c = color.New(red) default: - c = color.New(color.FgWhite) + c = color.New(white) } msg := entry.Message if len(entry.Message) > 0 && entry.Level < logrus.DebugLevel { diff --git a/cmd/d2vm/run/sparsecat-linux-amd64 b/cmd/d2vm/run/sparsecat-linux-amd64 index bdf2fee..90fdeff 100755 Binary files a/cmd/d2vm/run/sparsecat-linux-amd64 and b/cmd/d2vm/run/sparsecat-linux-amd64 differ diff --git a/examples/debian.Dockerfile b/examples/debian.Dockerfile index 74997b2..4c1f475 100644 --- a/examples/debian.Dockerfile +++ b/examples/debian.Dockerfile @@ -1,5 +1,4 @@ FROM debian -RUN apt update && apt install -y openssh-server systemctl && \ - systemctl enable ssh && \ +RUN apt update && apt install -y openssh-server && \ echo "PermitRootLogin yes" >> /etc/ssh/sshd_config diff --git a/examples/full/README.md b/examples/full/README.md index 9275779..51be693 100644 --- a/examples/full/README.md +++ b/examples/full/README.md @@ -1,6 +1,6 @@ -# d2vm full example +# ZSH Workstation example -This example demonstrate the setup of a ZSH workstation. +This example demonstrate the setup of a ZSH workstation with *cloud-init* support. *Dockerfile* ```dockerfile @@ -9,14 +9,11 @@ FROM ubuntu # Install some system packages RUN apt update && DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \ qemu-guest-agent \ - netplan.io \ ca-certificates \ dnsutils \ sudo \ openssh-server -# Setup default network config -COPY 00-netconf.yaml /etc/netplan/ # Add a utility script to resize serial terminal COPY resize /usr/local/bin/ @@ -33,7 +30,10 @@ RUN DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \ git \ vim \ tmux \ - htop + htop \ + lsb-core \ + cloud-init \ + cloud-guest-utils # Create user with sudo privileged and passwordless sudo RUN useradd ${USER} -m -s /bin/zsh -G sudo && \ @@ -54,23 +54,11 @@ RUN bash -c "$(curl -fsSL https://gist.githubusercontent.com/Adphi/f3ce3cc4b2551 RUN bash -c "$(curl -fsSL https://gist.githubusercontent.com/Adphi/765e9382dd5e547633be567e2eb72476/raw/a3fe4b3f35e598dca90e2dd45d30dc1753447a48/tmux-setup)" # Setup auto login serial console RUN sudo sed -i "s|ExecStart=.*|ExecStart=-/sbin/agetty --autologin ${USER} --keep-baud 115200,38400,9600 \%I \$TERM|" /usr/lib/systemd/system/serial-getty@.service -``` - -*00-netconf.yaml* -```yaml -network: - version: 2 - renderer: networkd - ethernets: - eth0: - dhcp4: true - nameservers: - addresses: - - 8.8.8.8 - - 8.8.4.4 ``` +There is no need to configure the network as **d2vm** will generate a *netplan* configuration that use DHCP. + **Build** ```bash @@ -78,23 +66,29 @@ USER=mygithubuser PASSWORD=mysecurepasswordthatIwillneverusebecauseIuseMostlySSHkeys OUTPUT=workstation.qcow2 -d2vm build -o $OUTPUT --force --build-arg USER=$USER --build-arg PASSWORD=$PASSWORD --build-arg SSH_KEY=https://github.com/$USER.keys . +d2vm build -o $OUTPUT --build-arg USER=$USER --build-arg PASSWORD=$PASSWORD --build-arg SSH_KEY=https://github.com/$USER.keys --force -v . ``` -Run it using *libvirt's virt-install*: +Run it: ```bash -virt-install --name workstation --disk $OUTPUT --import --memory 4096 --vcpus 4 --nographics --cpu host --channel unix,target.type=virtio,target.name='org.qemu.guest_agent.0' +d2vm run qemu --mem 4096 --cpus 4 $IMAGE ``` ... you should be automatically logged in with a **oh-my-zsh** shell -From an other terminal you should be able to find the VM ip address using: +You should be able to find the ip address inside the VM using: ```bash -virsh domifaddr --domain workstation +hostname -I +# or +ip a show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1 ``` And connect using ssh... +In order to quit the terminal you need to shut down the VM with the `poweroff` command: +```bash +sudo poweroff +``` *I hope you will find it useful and that you will have fun...* diff --git a/examples/ubuntu.Dockerfile b/examples/ubuntu.Dockerfile index d7ce6c8..be9568c 100644 --- a/examples/ubuntu.Dockerfile +++ b/examples/ubuntu.Dockerfile @@ -1,5 +1,4 @@ FROM ubuntu -RUN apt update && apt install -y openssh-server systemctl && \ - systemctl enable ssh && \ +RUN apt update && apt install -y openssh-server && \ echo "PermitRootLogin yes" >> /etc/ssh/sshd_config