14

Cloudinit is used by many cloud images e.g. on EC2 to obtain their initial configuration, like IP address, ssh keys and the like. Is there a way of using it with VirtualBox in a similar way?

I'm looking for a way of putting an ssh authorized_keys file on an VirtualBox instance without having to hard-code it into the image itself.

There is a section on "No Cloud" here but I'm not entirely understanding how this would apply to VirtualBox. Can I generate a /dev/sdb with the files in question, and provide this to VirtualBox as a second drive before booting the instance, and it somehow magically will pick the info up?

2 Answers 2

11

I figured it out and blogged about it here. From that link:

#VirtualBox and cloud-init

In case somebody else wants to know:

  • You can use cloud-init to configure VirtualBox virtual machines without too much trouble.

  • One way of doing this is to use a “config drive”, i.e. to mount another virtual hard drive that (only) has the cloud-init configuration data on it.

  • Here’s a way of creating it:

      # Create empty virtual hard drive file
      dd if=/dev/zero of=config.img bs=1 count=0 seek=2M
      # put correct filesystem and disk label on
      mkfs.vfat -n cidata config.img
      # mount it somewhere so you can put the config data on
      sudo mount config.img /mnt
    
  • Now put your config data into /mnt/user-data and /mnt/meta-data,

  • Example: /mnt/user-data. This will create a user ubos-admin with a ssh key so you can log on via ssh without a password.

      #cloud-config
      users:
       - name: ubos-admin
         gecos: UBOS administrative user
         ssh-authorized-keys:
          - insert ssh key here
         sudo: "ALL=(ALL) NOPASSWD: /usr/bin/ubos-admin *, /usr/bin/bash *"
    
  • Example /mnt/meta-data:

      instance-id: my-instance-1
    
  • Then, unmount:

      sudo umount /mnt
    
  • and attach as second hard drive before you boot. If cloud-init is installed in the main image, it should pick up the configuration info.

  • The .vmdk image file for this second hard drive can be created using the following commands, if you are on a Linux distro that uses apt:

     sudo apt-get install qemu-kvm
     qemu-img convert -O vmdk  config.img config.vmdk
    
4
  • 1
    Can you please copy the relevant information here? It is good practise in case the original url is removed. Which happened.
    – Jan
    Sep 21, 2015 at 19:14
  • 2
  • 1
    This is a bit misleading: your example is for a "NoCloud" datasource rather than a "Cloud Drive" datasource. The cidata label on config.img is one of the determinants.
    – Dan Dye
    Jan 3, 2017 at 14:00
  • This post has been such a great help to me—thank you! But I'm stuck at the step "attach as second hard drive before you boot". How does one attach config.img as a second hard drive? .img files do not seem to be directly supported by VirtualBox (version 6.1), so it seems I'm missing something. I thought the answer would be a simple Google search away, but... not having much luck so far.
    – evadeflow
    Dec 3, 2020 at 15:33
3

A slightly different approach that also works:

Using the CentOS 7 Cloud Image found here: https://cloud.centos.org/centos/7/images/ (choose CentOS-7-x86_64-GenericCloud.qcow2)

user-data

#!/bin/bash
##
## dependencies required for:
##        VBoxGuestAdditions
##        Minimal Desktop
##
DEPS='wget unzip python-pip git gnome-classic-session gnome-terminal nautilus-open-terminal control-center liberation-mono-fonts bzip2 libguest libguestfs binutils gcc make kernel-headers kernel-devel'

update(){
    sudo yum -y -q update
}


install_epel(){
    sudo yum -y install epel-release
    sudo yum -y update
}

configure(){
    sudo yum -y -q install $DEPS
    yum -y groupinstall "X Window System"
    unlink /etc/systemd/system/default.target
    ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target

    reboot
}

set -x
update
install_epel
configure

meta-data

instance-id: dev
local-hostname: dev.example.com
public-keys:
    - ssh-rsa AAAAB3NzaC1y[...]2yX3 admin@example.com

network-interfaces: |
    auto eth1
    iface eth1 inet dhcp

vbox-config-drive.sh

#!/bin/bash

##
## generate the config-drive iso
##
gen_iso(){
    echo "Generating ISO"
    genisoimage -output vbox-config.iso -volid cidata -joliet -r meta-data user-data
}

##
## resize as necessary
##
resize(){
    echo "Resizing Disk"
    qemu-img create -f qcow2 -o preallocation=metadata CentOS-7-x86_64-GenericCloud.qcow2.new 12G
    virt-resize --quiet --expand /dev/sda1 CentOS-7-x86_64-GenericCloud.qcow2 CentOS-7-x86_64-GenericCloud.qcow2.new
    mv CentOS-7-x86_64-GenericCloud.qcow2.new CentOS-7-x86_64-GenericCloud.qcow2
}
##
## convert the qcow to vmdk
##
make_vmdk(){
    echo "Converting QCOW to VMDK"
    qemu-img convert -f qcow2 CentOS-7-x86_64-GenericCloud.qcow2 -O vmdk CentOS-7-x86_64-GenericCloud.vmdk
}

gen_iso
##
## OPTIONAL
## resize
##
make_vmdk
echo "Done"

Use the resulting VMDK as your VirtualBox primary disk and the resulting ISO as the optical drive.

Hope this helps. M.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.