mirror of https://github.com/apache/jclouds.git
239 lines
13 KiB
Markdown
239 lines
13 KiB
Markdown
# VirtualBox as a local cloud provider
|
||
jclouds-virtualbox is a local cloud provider modelled on the virtualbox hypervisor. Similar to other jclouds supported providers, it supports the same portable abstractions offered by jclouds.
|
||
|
||
##Setup
|
||
|
||
Please follow these steps to configure your workstation for jclouds-virtualbox:
|
||
|
||
- install the latest VirtualBox release (please visit https://www.virtualbox.org/wiki/Downloads)
|
||
- assign passwordless ssh and passwordless sudo rights to your user
|
||
|
||
### Passwordless ssh
|
||
|
||
jclouds-virtualbox uses the current user.name and private key for sending commands to localhost over ssh.
|
||
|
||
The current user (user.name) should have passwordless ssh. On a *nix system, you can enable this feature using `ssh-keygen` and `ssh-copy-id`.
|
||
|
||
- ssh-keygen \- creates the public and private keys (by default in `${user.home}/.ssh/id_rsa.pub` and `${user.home}/.ssh/id_rsa`)
|
||
> $ ssh-keygen
|
||
- ssh-copy-id \- copies the user’s public key to a specified host’s `authorized_keys` file.
|
||
ssh-copy-id also assigns proper permission to the remote-host’s home, ~/.ssh, and ~/.ssh/authorized_keys
|
||
|
||
In this case:
|
||
> $ ssh-copy-id -i ~/.ssh/id_rsa your-user@localhost
|
||
|
||
If your system does not have an `ssh-copy-id` command, use something like this:
|
||
> $ cat ~/.ssh/id_rsa.pub | ssh your-user@localhost "cat -> ~/.ssh/authorized_keys"
|
||
|
||
### Passwordless sudo
|
||
|
||
You need to have passwordless sudo rights on localhost. This is done by editing the sudoers file (/etc/sudoers). Use caution when editing this file, as introducing errors will lock you out of the system. Therefore, it is recommended to edit this file through the visudo command.
|
||
|
||
The sudoers file should have a line like this (replace your-user):
|
||
> your-user ALL=(ALL) NOPASSWD: ALL
|
||
|
||
At this point, you should be able to login to localhost with `ssh your-user@localhost` without password.
|
||
|
||
#How it works
|
||
|
||
|
||
--------------- -------------
|
||
| Image(s) | | Node(s) |
|
||
--------------- -------------
|
||
------------------------------- -------
|
||
| VirtualBox || Jetty |
|
||
------------------------------- -------
|
||
--------- passwordless ssh+sudo ----------------------------------------
|
||
| jclouds | ---------------------------> | localhost |
|
||
--------- ----------------------------------------
|
||
|
||
###Components
|
||
- jclouds \- acts as a java (or clojure) client to access to virtualbox functionalities
|
||
- localhost \- hosts the VirtualBox hypervisor and a jetty server which is automatically installed by jclouds-virtualbox during Images creation
|
||
- VirtualBox \- jclouds-virtualbox assumes that the latest VirtualBox is installed (please see https://www.virtualbox.org/wiki/Downloads)
|
||
- Jetty \- in this scenario, this http server is used to serve the preseed.cfg specified in YAML descriptor file
|
||
- Image \- it logically represents a master VM (Virtual Machine) that can be cloned. It is a union of 2 sets of entities:
|
||
* a list of supported images, described in the YAML descriptor files
|
||
* a list of existing virtualbox VMs with name starting with "jclouds-image-0x0-"
|
||
- Node \- is a virtualbox VM, linked cloned from another virtualbox VM marked as Image
|
||
|
||
## Image creation
|
||
|
||
ssh ---------------
|
||
/----------------------------------> | Image(s) |
|
||
| ---------------
|
||
| ------------------------------- -------
|
||
| | VirtualBox || Jetty |
|
||
| ------------------------------- -------
|
||
--------- passwordless ssh+sudo ----------------------------------------
|
||
| jclouds | ---------------------------> | localhost |
|
||
--------- ----------------------------------------
|
||
|
||
The OS supported by jclouds-virtualbox are described in a YAML file `default-images.yaml` stored at `src/main/resources/`.
|
||
|
||
For each OS supported, it stores the following information:
|
||
a unique id, a name, a description, an os_arch, os_family, os_description, os_version, the iso url, the iso md5, username and credential to access this vm, a keystroke sequence for the OS installer and a preseed configuration file that contains the settings for this OS installation.
|
||
|
||
For example, the corresponding YAML section for ubuntu 10.04.4 server (32 bit) looks like:
|
||
|
||
- id: ubuntu-10.04.4-server-i386
|
||
name: ubuntu-10.04-server-i386
|
||
description: ubuntu 10.04.4 server (i386)
|
||
os_arch: x86
|
||
os_family: ubuntu
|
||
os_description: ubuntu
|
||
os_version: 10.04.4
|
||
iso: http://releases.ubuntu.com/10.04.4/ubuntu-10.04.4-server-i386.iso
|
||
iso_md5: fc08a01e78348e3918180ea91a6883bb
|
||
username: toor
|
||
credential: password
|
||
keystroke_sequence: |
|
||
<Esc><Esc><Enter>
|
||
/install/vmlinuz noapic preseed/url=http://10.0.2.2:8080/src/test/resources/preseed.cfg
|
||
debian-installer=en_US auto locale=en_US kbd-chooser/method=us
|
||
hostname=vmName
|
||
fb=false debconf/frontend=noninteractive
|
||
console-setup/ask_detect=false console-setup/modelcode=pc105 console-setup/layoutcode=us
|
||
initrd=/install/initrd.gz -- <Enter>
|
||
preseed_cfg: |
|
||
## Options to set on the command line
|
||
d-i debian-installer/locale string en_US
|
||
d-i console-setup/ask_detect boolean false
|
||
d-i console-setup/layoutcode string us
|
||
d-i netcfg/get_hostname string unassigned-hostname
|
||
d-i netcfg/get_domain string unassigned-domain
|
||
d-i time/zone string UTC
|
||
d-i clock-setup/utc-auto boolean true
|
||
d-i clock-setup/utc boolean true
|
||
d-i kbd-chooser/method select American English
|
||
d-i netcfg/wireless_wep string
|
||
d-i base-installer/kernel/override-image string linux-server
|
||
d-i debconf debconf/frontend select Noninteractive
|
||
d-i pkgsel/install-language-support boolean false
|
||
tasksel tasksel/first multiselect standard, ubuntu-server
|
||
d-i partman-auto/method string lvm
|
||
#d-i partman-auto/purge_lvm_from_device boolean true
|
||
d-i partman-lvm/confirm boolean true
|
||
d-i partman-lvm/device_remove_lvm boolean true
|
||
d-i partman-auto/choose_recipe select atomic
|
||
d-i partman/confirm_write_new_label boolean true
|
||
d-i partman/confirm_nooverwrite boolean true
|
||
d-i partman/choose_partition select finish
|
||
d-i partman/confirm boolean true
|
||
# Write the changes to disks and configure LVM?
|
||
d-i partman-lvm/confirm boolean true
|
||
d-i partman-lvm/confirm_nooverwrite boolean true
|
||
d-i partman-auto-lvm/guided_size string max
|
||
## Default user, we can get away with a recipe to change this
|
||
d-i passwd/user-fullname string toor
|
||
d-i passwd/username string toor
|
||
d-i passwd/user-password password password
|
||
d-i passwd/user-password-again password password
|
||
d-i user-setup/encrypt-home boolean false
|
||
d-i user-setup/allow-password-weak boolean true
|
||
d-i pkgsel/include string openssh-server ntp
|
||
# Whether to upgrade packages after debootstrap.
|
||
# Allowed values: none, safe-upgrade, full-upgrade
|
||
d-i pkgsel/upgrade select full-upgrade
|
||
d-i grub-installer/only_debian boolean true
|
||
d-i grub-installer/with_other_os boolean true
|
||
d-i finish-install/reboot_in_progress note
|
||
#For the update
|
||
d-i pkgsel/update-policy select none
|
||
# debconf-get-selections --install
|
||
#Use mirror
|
||
choose-mirror-bin mirror/http/proxy string
|
||
|
||
The OS isos and guest additions isos will be stored in the jclouds working directory (by default ~/.jclouds-vbox/isos/)
|
||
|
||
##Cloning nodes
|
||
|
||
ssh --------------- -------------
|
||
/----------------------------------> | Node(s) | | Image |
|
||
| --------------- -------------
|
||
| -------------------------------
|
||
| | VirtualBox |
|
||
| -------------------------------
|
||
--------- (a) passwordless ssh+sudo ----------------------------------------
|
||
| jclouds | ---------------------------> | localhost |
|
||
--------- ----------------------------------------
|
||
|
||
###Cloning strategy
|
||
By default, a new node is cloned from a matching 'Image' with 'CloneOptions.Link'. This advanced option will save a lot of disk space and installation time as opposed to creating completely unique VMs for each new node.
|
||
|
||
### Networking
|
||
Each Node will have 2 NICs (Network Interface Cards) to enable an NAT+Host-Only networking strategy:
|
||
|
||
* NIC1 at port 0 will be attached to Host-Only network to allow localhost-nodes communication and node-node communication
|
||
* NIC2 at port 1 will be attached to NAT network to give each node internet access
|
||
|
||
--------------
|
||
|
||
#Interacting with jclouds-vbox and connecting to machines
|
||
|
||
For java guidance, please see [src/test/java/org/jclouds/virtualbox/compute/VirtualBoxExperimentLiveTest.java].
|
||
For now nat+host-only is the only available network configuration, nodes should be accessible from the host by:
|
||
|
||
ssh user@192.168.56.X
|
||
|
||
where:
|
||
|
||
- user \- has passwordless ssh and sudo rights
|
||
- X (2-253) \- is assigned by DHCP server of `vboxnet0`
|
||
|
||
--------------
|
||
|
||
|
||
#Customization
|
||
|
||
##Identity and Credential
|
||
By default, jclouds-virtualbox will try to use the current user (with passwordless ssh and sudo rights), but you can also override this default by specifying
|
||
`-Dvirtualbox.identity` and `-Dvirtualbox.credential`, if you want to use another user available on your local machine.
|
||
|
||
##Preseed file
|
||
In order to make available a preseed file, jclouds-virtualbox will start a PreseedServer at `http://localhost:23232` that will serve a preseed.cfg file.
|
||
Make sure your firewall rules are not blocking this port.
|
||
If you need to override this default you can use `-Djclouds.virtualbox.preconfigurationurl=http://localhost:PORT/preseed.cfg`, with a different PORT.
|
||
|
||
##Working directory
|
||
By default, cached isos for the OSs, guest additions, VMs and most configs are kept at the default working directory named `~/.jclouds-vbox/`,
|
||
you can override the default working directory using `-Dtest.virtualbox.workingDir=/path/to/your/workingDir`.
|
||
|
||
##Host-Only network
|
||
jclouds-virtualbox needs an Host-Only network with DHCP enabled. This DHCP server will be responsible for assigning local IP addresses to the Nodes created by jclouds-virtualbox.
|
||
|
||
jclouds-virtualbox will automatically create an Host-Only network with these settings:
|
||
|
||
- IPv4: 192.168.56.1
|
||
- IPv4 Network Mask: 255.255.255.0
|
||
- DHCP Server: enabled
|
||
|
||
with
|
||
- Server Address: 192.168.56.254
|
||
- Server Mask: 255.255.255.0
|
||
- Lower Address Bound: 192.168.56.2
|
||
- Upper Address Bound: 192.168.56.253
|
||
|
||
Check virtualbox->Preferences->Networks for more details.
|
||
|
||
**NB**: jclouds-virtualbox will not edit/replace a pre-exisiting Host-Only network.
|
||
|
||
--------------
|
||
|
||
#Notes:
|
||
|
||
- jclouds-virtualbox is still at alpha stage please report any issues you find at [jclouds issues](https://github.com/jclouds/jclouds/issues?state=open) or [jclouds google group](http://groups.google.com/group/jclouds).
|
||
- jclouds-virtualbox has been tested on Mac OSX, it might work on Linux iff vbox is running and set up correctly. However, it will not currently run on Windows.
|
||
|
||
--------------
|
||
|
||
#Troubleshooting
|
||
|
||
As jclouds vbox support is quite new, issues may occasionally arise. Please follow these steps to get things going again:
|
||
|
||
1. Remove all relevant VMs (named "jclouds-* ") with the vbox GUI. Make sure to select "delete all files". This step will solve most issues.
|
||
2. If you are still receiving errors, please try the following steps to resolve any issues:
|
||
* Kill all vbox processes (VboxHadless, VBoxSVC, VBoxXPCOMIPCD, VirtualBox, vboxwebsrv)
|
||
* Manually delete the files by executing: "rm -rf ~/.jclouds-vbox/jclouds-*"
|
||
* Restart the vbox GUI and make sure to delete all remaining machines while ignoring all errors
|