.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
.. Copyright 2017 Huawei Technologies Co., Ltd.

SO Install & Configure
======================

Get Ubuntu
----------
Get the Ubuntu ISO image from ubuntu.com. The recommended version is 16.04.3 LTS (Long Term Support), desktop edition.

Get VirtualBox and VirtualBox Guest Additions
---------------------------------------------
Make sure you have the VirtualBox Guest Additions ISO for your version of VirtualBox.  I'm using VirtualBox 5.1.28.  Save the Guest Additions ISO on your host computer along with the Ubuntu ISO.  Get the Guest Additions ISO from here:
    http://download.virtualbox.org/virtualbox

*NOTE*: Guest Additions versions prior to 5.1 will not work with Ubuntu 16.04.3.  If you have an earlier version of VirtualBox, you should upgrade to the latest 5.1 version.

Create a new VM in VirtualBox for Ubuntu
----------------------------------------
Type: Linux

Version: Ubuntu (64-bit)

At least 2048 MB memory

At least 40 GB VDI

Network: Attached to: NAT

Create a port-forwarding rule for SSH
-------------------------------------
Create a port-forwarding rule so that you can use PuTTY (or other SSH client) to connect to the VM.

Go to "Network" settings in VirtualBox, add a port forwarding rule:

Name: SSH

Protocol: TCP

Host IP: 127.0.0.1

Host Port: 1022

Guest IP: <leave blank>

Guest Port: 22

.. image:: ../images/Configure_ubuntu_SO_1.png

.

.. image:: ../images/Configure_ubuntu_SO_2.png

Create Shared Folder
--------------------
This is oriented to Windows users.  If you're using a MAC or a Linux host computer, the details may be different.  You can share any folder on the host computer with the Ubuntu VM.  On Windows, a practical choice is to share the C:\Users folder, so that your Windows home directory will be accessible from the Ubuntu VM.

Go to "Shared Folders" settings in VirtualBox, add a share:

Folder Path: C:\Users

Folder Name: Users

Auto-mount: <checked>

Read-only: <unchecked>

.. image:: ../images/Configure_ubuntu_SO_3.png

.

.. image:: ../images/Configure_ubuntu_SO_4.png

Install Ubuntu in the VM
------------------------
On the "Storage" panel in VirtualBox, click on "[ optical drive ]" and then "Choose Disk Image".

Select your Ubuntu ISO image:

.. image:: ../images/Configure_ubuntu_SO_5.png

After selecting the ISO image, start the VM.

Follow the prompts to install Ubuntu.

Proxy Configuration (optional)
------------------------------
If you're behind a corporate firewall, configure some proxy settings.
NOTE: your proxy configuration may require username and password credentials, not shown here.
**Ubuntu system proxy setting:**

	System Settings → Network → Network proxy
	
	(Replace "proxyhost" and port with your actual proxy information)

.. image:: ../images/Configure_ubuntu_SO_6.png
	
**apt proxy setting:**
	Edit /etc/apt/apt.conf and add one line at the top (replace "proxyhost:port" with your actual proxy information):
	
		Acquire::http::Proxy "http://proxyhost:port";
		
	Reboot the VM.
	
Install SSH Server
------------------

.. code-block:: bash

    sudo apt update
    sudo apt install openssh-server

Connect to the VM from your host computer
-----------------------------------------
	The PuTTY SSH client is popular.  A connection to localhost:1022 (or whatever port you have forwarded) will go to the VM.

.. image:: ../images/Configure_ubuntu_SO_7.png
	
Install VirtualBox Guest Additions
----------------------------------
On the "Storage" panel in VirtualBox, click on "[ optical drive ]" and then "Choose Disk Image".  Select your VirtualBox Guest Additions ISO image.

.. image:: ../images/Configure_ubuntu_SO_8.png

In a VM terminal window, mount the cdrom:

.. code-block:: bash

	sudo mkdir -p /media/cdrom
	sudo mount /dev/cdrom /media/cdrom
	
Install necessary dependencies:

.. code-block:: bash

    sudo apt update
    sudo apt install gcc g++ dkms
	
Install the guest additions.  NOTE: look for errors in the command output!  If you see an error that says you are missing kernel headers, the most likely cause is that you are using a VirtualBox version that is too old.  The error message is misleading.

  .. code-block:: bash

	cd /media/cdrom
	sudo ./VBoxLinuxAdditions.run

.. image:: ../images/Configure_ubuntu_SO_9.png	
	
Add yourself to the vboxsf user group (replace "userid" with your user ID):
	
.. code-block:: bash	
	
	sudo usermod -a -G vboxsf userid
	
Reboot the VM.

In a VM terminal window, verify that you can access your home directory on the host computer, which should be mounted under here:
	/media/sf_Users
	
Further Reading
----------------------------------------	

.. toctree::
   :maxdepth: 1

   Install_Docker.rst
   Configure_git_and_gerrit.rst
   Workspace_and_Development_Tools.rst
