---
# System prepended metadata

title: Virtual Machine on Ubuntu20.04
tags: [Medium]

---

# Virtual Machine on Ubuntu20.04

###### tags: `Medium`

## [0. System and Hardware Information](https://www.tecmint.com/commands-to-collect-system-and-hardware-information-in-linux/)
:::success
This is the information for my Ubuntu20.04 that I'm using to create Virtual Machines (VMs) on. But this guide should be applicable to all Ubuntu20.04 OS
:::
- System Information: 
```bash
$ uname
Linux

$ uname -m
x86_64
```
- System Hardware Information
```bash
$ lshw -short
H/W path         Device           Class          Description
============================================================
                                  system         Computer
/0                                bus            Motherboard
/0/0                              memory         128GiB System memory
/0/1                              processor      Intel(R) Xeon(R) Gold 6212U CPU @ 2.40GHz
```
- CPU Information
```shell
$ lscpu
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   46 bits physical, 48 bits virtual
CPU(s):                          48
On-line CPU(s) list:             0-47
Thread(s) per core:              2
Core(s) per socket:              24
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           85
Model name:                      Intel(R) Xeon(R) Gold 6212U CPU @ 2.40GHz
```

## 1. Create our first VM
:::success
We will create a Ubuntu18.04 using the [**ubuntu-18.04.6-desktop-amd64.iso**](https://releases.ubuntu.com/18.04/) image and enable openSSH for ease of development.
:::
- [KVM Installation](https://ubuntu.com/blog/kvm-hyphervisor)
```bash
# Step 1: Install required packages
$ sudo apt -y install bridge-utils cpu-checker libvirt-clients libvirt-daemon qemu qemu-kvm

# Step 2: Check virtualisation capabilities
$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
```
- Create a guess network using NAT interface
```bash
# Step 1: Create a network configuration file with your prefered subnet range
$ cat kvm-network.xml
<network>
  <name>kvm</name>
  <forward mode='nat'/>
  <domain name='kvm'/>
  <ip address='10.0.3.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='10.0.3.2' end='10.0.3.254'/>
    </dhcp>
  </ip>
</network>

# Step2 : Define network
$ virsh net-define kvm-network.xml
Network kvm defined from kvm-network.xml

# Step 3: Start the network and mark as autostart
$ virsh net-start kvm
Network kvm started

$ virsh net-autostart kvm
Network kvm marked as autostarted

# Step 4: Check network configuration
$ virsh net-list
 Name   State    Autostart   Persistent
-----------------------------------------
 kvm    active   yes         yes
```
- Create Ubuntu18.04 VM
```bash
# Step 1: Download the image
$ wget https://releases.ubuntu.com/18.04/ubuntu-18.04.6-desktop-amd64.iso

# Step 2: Create a qemu qcow2 storage
$ qemu-img create -f qcow2 node-0.qcow2 32G
Formatting 'node-0.qcow2', fmt=qcow2 size=34359738368 cluster_size=65536 lazy_refcounts=off refcount_bits=16

# Step 3: Create the VM
$ virt-install \
    --name node-0 \
    --memory 32768 \
    --vcpus 16 \
    --cdrom [path/to/your/mini.iso] \
    --disk [path/to/your/node-0.qcow2],bus=virtio,size=10,format=qcow2 \
    --network network=kvm \
    --graphics vnc,listen=0.0.0.0 \
    --noautoconsole \
    --os-type=linux \
    --os-variant=ubuntu18.04
    
Starting install...
Domain installation still in progress. You can reconnect to
the console to complete the installation process.
```
- Continue our [Ubuntu installation](https://docs.openstack.org/image-guide/ubuntu-image.html) using the KVM's GUI `$ virt-manager`. I will use all default config except the following options:
    - Hostname: `node-0`
    - Username and Password: `master`
- Before we restart our VM to finish the installation, we can configure static IP address for our VM:
    - First, take note of the current MAC address and IP address using the KVM's GUI
    ![](https://i.imgur.com/EH2McPk.png)
    - Second, edit the guess network configuration file and restart the network and VM for the change to take effect
    ```bash
    # Step 1: Add the following configuration under network.ip.dhcp
    $ virsh net-edit kvm
    <network>
        <ip address='10.0.3.1' netmask='255.255.255.0'>
            <dhcp>
               <range start='10.0.3.2' end='10.0.3.254'/>
               <host mac='52:54:00:2e:c8:4c' name='node-0' ip='10.0.3.2'/>
            </dhcp>
        </ip>
    </network>

    # Step 2: Restart the network
    $ virsh net-destroy kvm
    $ virsh net-start kvm

    # Step 3: Restart the VM for the change to take effect
    $ virsh shutdown node-0
    $ virsh start node-0

    # Step 4: Check the newly assigned IP
    $ virsh net-dhcp-leases kvm
     Expiry Time           MAC address         Protocol   IP address    Hostname   Client ID or DUID
    -----------------------------------------------------------------------------------------------------------------------------------------
     2022-11-22 17:07:24   52:54:00:2e:c8:4c   ipv4       10.0.3.2/24   node-0     ff:56:50:4d:98:00:02:00:00:ab:11:56:78:25:52:47:eb:44:93
    ```
- We can login to our VM to install some main utilities and enable SSH
```bash
$ sudo apt-get update
$ sudo apt-get install openssh-server ubuntu-desktop tmux -y

$ systemctl enable ssh --now
```
- We can make use of snapshot to safeguard our development progress:
```bash
# Create snapshot (shut down first to capture both memory and disk state)
virsh shutdown node-0

virsh snapshot-create-as \
--name [your-snapshot-name] \
--domain node-0

virsh start node-0

# Check snapshot
virsh snapshot-list node-0

# Revert to snapshot
virsh shutdown node-0

virsh snapshot-revert \
--snapshotname [your-snapshot-name] \
--running \ 
--domaain node-0

# Delete snapshot
virsh snapshot-delete \
--snapshotname [your-snapshot-name] \
--domain node-0
```
