This guide will discuss how one can create a CentOS 8 KVM image to be used on OpenStack when creating CentOS 8 instances. CentOS 8 was released on September 24th, 2019 and guys are starting to adopt it for running Production workloads. OpenStack is one of the main Virtualization/Cloud environment used by many. companies.

Step 1 : Download CentOS 8 ISO image

Download CentOS 8 ISO image to your Workstation.

wget http://isoredirect.centos.org/centos/8/isos/x86_64/CentOS-8-x86_64-1905-dvd1.iso

Upload CentOS 8 ISO image to OpenStack.

openstack image create CentOS8-ISO \
--file CentOS-8-x86_64-1905-dvd1.iso \
--disk-format iso --container-format bare

Confirm image upload from Glance.

 $ openstack image list
+--------------------------------------+---------------+--------+
| ID                                   | Name          | Status |
+--------------------------------------+---------------+--------+
| b8d75f31-fb6b-428b-8b83-f3904b0bd114 | CentOS-7      | active |
| 685d52c7-ad42-45e6-9419-a9971dcad9c1 | CentOS8-ISO   | active |
| fbcf16a0-c7cc-42c1-b836-a39bc34c9666 | Cirros        | active |
| d900bcad-047a-4d01-bcbc-42426bb4315d | CoreOS        | active |
| f0ac705b-ee73-4de8-95f7-4e06569f0f5c | Debian-10     | active |
| 01e6f07b-ca99-439d-9cd0-ab28c2573abf | Fedora-30     | active |
| 1953e548-779c-4fe5-86c1-854d71f35d14 | FreeBSD12     | active |
| 7bd462ad-cc11-4d89-8b85-9aab0cfe114b | Ubuntu-18     | active |
| 86e42aae-d959-4b79-b9a4-b899d85ba303 | fed31         | active |
| 3a56d733-de76-490a-9dac-1419219b5803 | manageiq      | active |
| 47b5b6ed-5599-420a-a602-35d964e86de5 | rhcos         | active |
| 6b3dc49b-a53f-4cfc-98e0-9eb6925219de | rhel-7        | active |
| 965cb833-b97e-4488-9bc6-84495b9a9b7b | rhel-8        | active |
+--------------------------------------+---------------+--------+

Step 2: Launch CentOS 8 Instance from ISO

Login to your OpenStack Horizon dashboard.

Navigate to Project > Compute > Instances.

Click on “Launch Instance“. Give the VM a name and description under details section.

Under source, select image as boot source, create Volume of 20GB then pick the CentOS 8 ISO image uploaded earlier.

Select flavor to use in the next page. I’ll use m1.small flavor which has 20GB of disk space, 1vcpu and 2GB of RAM. See how to create OpenStack Flavors for more details.

Choose network to use for VM creation.

Select security group to assign and other optional parameters then Launch the instance.

Wait for the instance to enter “Active” state.

Step 3: Create a Cinder Volume

Once the VM is in active state, create a volume then attach to the instance by following our guide How To Create OpenStack Cinder Volumes and Attach to a VM Instance to create and attach volume. This is where OS will be installed.

Step 4: Begin CentOS 8 Installation

Once the volume is attached, Click on the instance, then “Console” tab

Follow the standard CentOS installation as covered in:

Installing CentOS 8 Step by Step with Screenshots

But on Software selection, choose Server.

Choose the second disk added for OS installation.

Once you confirm all settings to be okay, begin installation of CentOS 8. Set root password.

Optionally create admin user, although cloud-init will be used to create a user later.

Finish CentOS 8 configuration.

Reboot the system once installation is complete.

The server attempt to boot from the ISO image once more. Press any key to stop the countdown.

Step 7: Terminate CentOS 8 Build Instance

We can now terminate the instance we created under Project > Compute > Instances

Select “CentOS8-build” and hit the “Delete Instances” button. Confirm deletion.

Step 8: Convert Volume to Qcow2 Image

Upload the Volume with CentOS 8 installation to Glance Image. This is done by navigating to Project > Compute > Volumes. Select the volume and click “UPLOAD TO IMAGE”

Give it a name and choose QCOW2 Disk Format.

Confirm if image was successfully uploaded under Project > Compute > Images

Select image and update metadata like below:

hypervisor_type: kvm
auto_disk_config: true
hw_qemu_guest_agent: true

To update image Metadata, enter metadata name in the custom box and click on the + button, then provide the value on the right side box.

Save settings when done. You can now delete the Volume on Project > Volumes > CentOS8-Template > Delete

Step 9: Create Instance from new Image

Create an instance from the image we just uploaded to Glance. Click on Project > Compute > Instances > Launch Instance.

Give the instance the name “centOS8-build”, use m1.small flavor (One with 20GB disk), and select “Boot from image” and the “CentOS8-Template” image.

Launch the instance and wait for it to enter Active state. SSH to the new instance as “root“, using the root password used during setup, or access the instance using OpenStack Console.

$ ssh [email protected]
The authenticity of host '10.10.1.71 (10.10.1.71)' can't be established.
ECDSA key fingerprint is SHA256:9OOv/wC5aB5XownQPr4udNtiKvouvzr8UQoDcj6wdfE.
ECDSA key fingerprint is MD5:b6:32:c7:59:fd:25:48:07:11:f5:fb:cf:7e:cb:25:45.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.10.1.71' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sat Oct 26 21:44:14 2019 from 10.10.1.186
[[email protected] ~]# 

Prepare Instance to be used as OpenStack template.

Update system

sudo yum -y update

Install cloud-init, qemu guest agent, vim, bash-completion, cloud-utils-growpart.

sudo yum -y install vim bash-completion cloud-init qemu-guest-agent cloud-utils-growpart

Start and enable the qemu-guest-agent service:

sudo systemctl enable --now qemu-guest-agent.service

Disable the zeroconf route

For the instance to access the metadata service, you must disable the default zeroconf route:

echo "NOZEROCONF=yes" >> /etc/sysconfig/network

Enable kernel console logging:

Open the file /etc/sysconfig/grub

sudo vim /etc/sysconfig/grub

Delete the rhgb quiet and add console=tty0 console=ttyS0,115200n8 to the option. Mine looks like below.

GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap console=tty0 console=ttyS0,115200n8"

Run the following command to save the changes:

# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
done

Update cloud-init configuration file

You can change the name of the account used by cloud-init by editing the /etc/cloud/cloud.cfg file and adding a line with a different user.

sudo vim /etc/cloud/cloud.cfg

The default user created is cloud-user:

system_info:
  default_user:
    name: cloud-user
    lock_passwd: true
    gecos: Cloud User
    groups: [wheel, adm, systemd-journal]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash
  distro: rhel
  paths:
    cloud_dir: /var/lib/cloud
    templates_dir: /etc/cloud/templates
  ssh_svcname: sshd

Root account is disabled, to enable, set the line (Not recommended)

disable_root: 0

When done, delete the static network configuration file:

rm /etc/sysconfig/network-scripts/ifcfg-ens3

Then clear the bash history for root user.

rm /root/.bash_history; history -c

Step 10: Create Final CentOS 8 image

Navigate to Compute > Instances >centos8-build > Create Snapshot button.

Give it a name then create the Snapshot.

You can now delete the centos8-build Instance and centos8-template image created earlier. Use the Image created to launch CentOS 8 instances on OpenStack.

More OpenStack articles:

How To Install ManageIQ / CloudForms on OpenStack & KVM

How To Assign a Floating IP Address to an Instance in OpenStack

How To Create OpenStack Instance With a Fixed / Static IP Address

How To Create OpenStack projects, users and roles

How To Migrate OpenStack Instance from one Compute Host to Another

How To Resize OpenStack Instance / Virtual Machine