Rocky Linux is one of the most anticipated Enterprise Linux releases after direction shift in CentOS Project. As of this article update, Rocky Linux 8.4 is the first stable release that you can use in production as an alternative to CentOS 8 / CentOS Stream 8. If you’re ready to take it for a spin on OpenStack Cloud environment then this article is for you. We will discuss in detail the process of generating Rocky Linux 8 Qcow2 Image for OpenStack / KVM / Qemu.

With Rocky Linux 8.4 stable release, it can be that ultimate CentOS replacement, potentially deprecating any reason to switch to CentOS Stream. There are no official Qcow2 images available for OpenStack users, at the moment, hence the need to create them yourself. All of the tasks should be performed on a Linux Server / Desktop with Virtualization support and KVM tools installed.

Step 1: Install KVM Virtualization Tools

If you’re new to KVM Hypervisor refer to our previous articles on the installation and usage on standard Linux distributions:

Install KVM Hypervisor on Ubuntu Linux

How To Install KVM Hypervisor on Debian

How To Install KVM on Rocky Linux 8 / RHEL 8 / CentOS 8

After installation check if kvm.ko kernel module is loaded:

$ lsmod | grep vhost
vhost_net              28672  2
vhost                  49152  1 vhost_net
vhost_iotlb            16384  1 vhost
tap                    28672  1 vhost_net
tun                    53248  5 vhost_net

If not available load them manually using the command below:

sudo modprobe vhost_net vhost

The virt-install package must be installed on your Linux system.

# CentOS / Fedora / Rocky Linux
sudo yum -y install virt-install libguestfs-tools virt-top bridge-utils

# Ubuntu / Debian
sudo apt update
sudo apt install virtinst libguestfs-tools virt-top bridge-utils

Step 2: Download Rocky Linux ISO File

Visit Rocky Linux official ISO downloads page and download the latest release ISO image.

# Rocky Linux 8.4 Minimal ISO (Small in size, good for server installations)
mkdir ~/isos
cd ~/isos
curl -O https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.4-x86_64-minimal.iso

# Rocky Linux 8.4 DVD (Huge in size, only fit for Desktop Workstation)
mkdir ~/isos
cd ~/isos
curl -O https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.4-x86_64-dvd1.iso

The ISO file we downloaded will be located in the ~/isos directory:

$ file ~/isos/Rocky-8.4-x86_64-minimal.iso
/root/isos/Rocky-8.4-x86_64-minimal.iso: ISO 9660 CD-ROM filesystem data (DOS/MBR boot sector) 'Rocky-8-4-x86_64-dvd' (bootable)

Copy the ISO file to /var/lib/libvirt/images directory:

sudo cp ~/isos/Rocky-8.4-x86_64-minimal.iso /var/lib/libvirt/images/Rocky-8.4-x86_64-minimal.iso

Step 3: Create Rocky Linux 8 VM on KVM Hypervisor

Identify bridge that will be used in VM creation:

$ brctl show

In this guide we’ll use the default Libvirt bridge – virbr0 that is Nated for internet access.

$ brctl show virbr0
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.525400f2930e	yes

Create a new Kickstart file called ks.cfg installation:

vim ks.cfg

File contents – At least change root password and rocky user password. The default SSH user is called rocky, but you can change this to your preferred username.

install
cdrom
lang en_US.UTF-8
keyboard us
network --bootproto=dhcp --noipv6 --onboot=on --device=eth0
rootpw --plaintext StrongRootPassword
firewall --disabled
selinux --permissive
timezone UTC
bootloader --timeout=1 --location=mbr --append="net.ifnames=0 biosdevname=0"
text
skipx
zerombr
clearpart --all --initlabel
autopart --nohome --nolvm --noboot
firstboot --disabled
reboot --eject
user --name=rocky --plaintext --password StrongRockySUserPassword

%packages --ignoremissing --excludedocs --instLangs=en_US.utf8
# rocky needs this to copy initial files via scp
openssh-clients
sudo
selinux-policy-devel
nfs-utils
net-tools
tar
bzip2
drpm
rsync
dnf-utils
elfutils-libelf-devel
network-scripts
-fprintd-pam
-intltool
-iwl*-firmware
-microcode_ctl
%end

%post
# sudo
echo 'Defaults:rocky !requiretty' > /etc/sudoers.d/rocky
echo '%rocky ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/rocky
chmod 440 /etc/sudoers.d/rocky


# Since we disable consistent network naming, we need to make sure the eth0
# configuration file is in place so it will come up.
# Delete other network configuration first because RHEL/C7 networking will not
# restart successfully if there are configuration files for devices that do not
# exist.
rm -f /etc/sysconfig/network-scripts/ifcfg-e*
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << _EOF_
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
DEVICE=eth0
ONBOOT=yes
_EOF_
%end

Hosting kickstart on http server

You can host the kickstart file in an http server for use on difference hypervisor hosts. See below examples:

# CentOS / Fedora / RHEL
sudo yum install httpd
sudo systemctl enable --now httpd
sudo cp ks.cfg /var/www/html/

# Ubuntu / Debian
sudo apt update
sudo apt install apache2
sudo cp ks.cfg /var/www/html/

Start installation of Rocky Linux 8 Virtual Machine on KVM using the virt-install command line tool:

sudo virt-install \
  --name rocky-linux-8 \
  --memory=1024 \
  --vcpus=1 \
  --os-type linux \
  --location /var/lib/libvirt/images/Rocky-8.4-x86_64-minimal.iso \
  --disk size=10  \
  --network bridge=virbr0 \
  --graphics=none \
  --os-variant=rhl8.0 \
  --console pty,target_type=serial \
  --initrd-inject ks.cfg --extra-args "inst.ks=file:/ks.cfg console=tty0 console=ttyS0,115200n8"
  #--extra-args="ks=http://192.168.122.1/ks.cfg console=tty0 console=ttyS0,115200n8"

Where:

  • rocky-linux-8 is the name of the virtual machine domain created.
  • 1024 is the amount of memory assigned in Megabytes
  • 1 is the number of CPU cores
  • /var/lib/libvirt/images/Rocky-8.4-x86_64-minimal.iso is the path to ISO file
  • 10 is the size of virtual disk created in GB
  • virbr0 is the name of Linux Bridge or Open vSwitch bridge attached to VM network interface.
  • http://192.168.122.1/ks.cfg is HTTP URL to kickstart file created – change accordingly.

Installation should begin immediately after execution of the command.

Starting install...
Retrieving file vmlinuz...                                                                                                                 | 9.6 MB  00:00:00
Retrieving file initrd.img...                                                                                                              |  72 MB  00:00:00
Allocating 'rocky-linux-8.qcow2'                                                                                                           |  10 GB  00:00:00
Connected to domain 'rocky-linux-8'
Escape character is ^] (Ctrl + ])
[    0.208717] PCI Interrupt Link [LNKB] enabled at IRQ 11
[    0.221323] pci 0000:00:03.7: quirk_usb_early_handoff+0x0/0x6a0 took 23503 usecs
[    0.222377] PCI: CLS 0 bytes, default 64
[    0.222981] Unpacking initramfs...
[    4.239724] Freeing initrd memory: 73676K
[    4.240460] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x32557ae966b, max_idle_ns: 440795369289 ns
[    4.252373] Initialise system trusted keyrings
[    4.253047] Key type blacklist registered
[    4.253719] workingset: timestamp_bits=36 max_order=18 bucket_order=0
[    4.256018] zbud: loaded
[    4.256743] pstore: using deflate compression
[    4.257727] Platform Keyring initialized
[    4.333565] NET: Registered protocol family 38
[    4.334401] Key type asymmetric registered
[    4.335176] Asymmetric key parser 'x509' registered
[    4.336083] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 247)
[    4.337422] io scheduler mq-deadline registered
[    4.338269] io scheduler kyber registered
[    4.339050] io scheduler bfq registered
[    4.339824] atomic64_test: passed for x86-64 platform with CX8 and with SSE
[    4.341174] shpchp: Standard Hot Plug PCI Controller Driver versi

Here is the extraction of Package installation:

Running pre-installation tasks
...
Installing.
Starting package installation process
Downloading packages
Preparing transaction from installation source
Installing libgcc.x86_64 (1/370)
Installing tzdata.noarch (2/370)
Installing python3-setuptools-wheel.noarch (3/370)
Installing python3-pip-wheel.noarch (4/370)
Installing hwdata.noarch (5/370)
Installing rocky-gpg-keys.noarch (6/370)
Installing rocky-release.noarch (7/370)
Installing rocky-repos.noarch (8/370)
Installing setup.noarch (9/370)
Installing filesystem.x86_64 (10/370)
Installing basesystem.noarch (11/370)
Installing quota-nls.noarch (12/370)
Installing publicsuffix-list-dafsa.noarch (13/370)
Installing pkgconf-m4.noarch (14/370)
Installing ncurses-base.noarch (15/370)
Installing pcre2.x86_64 (16/370)
Installing libselinux.x86_64 (17/370)
Installing ncurses-libs.x86_64 (18/370)
Installing glibc-all-langpacks.x86_64 (19/370)
Installing glibc-common.x86_64 (20/370)
Installing glibc.x86_64 (21/370)
Installing bash.x86_64 (22/370)
Installing libsepol.x86_64 (23/370)
Installing zlib.x86_64 (24/370)
Installing xz-libs.x86_64 (25/370)
Installing libcom_err.x86_64 (26/370)
Installing libcap.x86_64 (27/370)
Installing info.x86_64 (28/370)
Installing bzip2-libs.x86_64 (29/370)
Installing popt.x86_64 (30/370)
Installing elfutils-libelf.x86_64 (31/370)
Installing libuuid.x86_64 (32/370)
Installing libgpg-error.x86_64 (33/370)
Installing readline.x86_64 (34/370)
Installing libxml2.x86_64 (35/370)

As packages are installed you’ll see output from execution that looks like below:

.........
Verifying zlib-devel.x86_64 (370/370)
.
Installing boot loader
..
Performing post-installation setup tasks
.
Configuring installed system
...................
Writing network configuration
.
Creating users
Configuring addons
Executing org_fedora_oscap addon
Executing com_redhat_kdump addon
..
Generating initramfs

Upon the installation of Rocky Linux 8 on KVM using virt-install, you’ll get login console at the end.

....
[    4.591932] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[  OK  ] Started Network Manager Script Dispatcher Service.
[    4.610836] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[    4.612106] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
[    4.613627] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[  OK  ] Started OpenSSH server daemon.
[  OK  ] Started System Security Services Daemon.
[  OK  ] Reached target User and Group Name Lookups.
         Starting Login Service...
         Starting Permit User Sessions...
[  OK  ] Started Permit User Sessions.
[  OK  ] Started Command Scheduler.
[  OK  ] Started Getty on tty1.
[  OK  ] Started Serial Getty on ttyS0.
[  OK  ] Reached target Login Prompts.
[  OK  ] Started Login Service.
[  OK  ] Started Dynamic System Tuning Daemon.
[  OK  ] Reached target Multi-User System.
         Starting Update UTMP about System Runlevel Changes...
[  OK  ] Started Update UTMP about System Runlevel Changes.
[  OK  ] Started Network Manager Wait Online.
[  OK  ] Reached target Network is Online.
         Starting Crash recovery kernel arming...
         Starting Notify NFS peers of a restart...
[  OK  ] Started Notify NFS peers of a restart.

Rocky Linux 8.4 (Green Obsidian)
Kernel 4.18.0-305.3.1.el8_4.x86_64 on an x86_64

localhost login:

Login with user root and the password of root user as set in the Kickstart file:

rootpw --plaintext StrongRootPassword

The default password in my kickstart file is StrongRootPassword

localhost login: root
Password: <root-password-in-kickstart>
Last failed login: Fri Jul  2 17:49:22 UTC 2021 on ttyS0
There was 1 failed login attempt since the last successful login.
[[email protected] ~]#

Update root password after installation:

# passwd root
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

Also update rocky user password; default in kickstart file is StrongRockySUserPassword:

# passwd rocky
Changing password for user rocky.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

Perform system update:

yum -y update

Reboot after upgrade:

reboot

Install more packages that are required for general administration:

dnf -y install bash-completion vim cloud-utils-growpart wget redhat-lsb-core

Configure Cloud init

Install cloud-init and openssh-server packages

dnf -y install openssh-server cloud-init 

Configure cloud-init and set rocky as default login user:

# vim /etc/cloud/cloud.cfg
# On line 5 : set to 1 if you want to enable SSH password authentication
ssh_pwauth:   1 # Not recommended for cloud use

# Line 57 - change system user from cloud-user to rocky
system_info:
  default_user:
    name: rocky
    lock_passwd: false
    gecos: Cloud User
    groups: [adm, systemd-journal]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash

Enable sshd and cloud-init services to start on system boot:

sudo systemctl enable cloud-init sshd

Step 4: Perform Rocky Linux 8 VM Cleaning after installation

After OS upgrade and successful reboot we can begin the cleanup process of the VM as we prepare it to be Template. The process involve removing packages not required for minimal server setup such as development and source packages, clean up of network interfaces and logs cleaning.

Create a script file called cleanup.sh inside the VM.

vim cleanup.sh

Paste below contents into the file:

#!/bin/sh -eux

major_version="`sed 's/^.\+ release \([.0-9]\+\).*/\1/' /etc/redhat-release | awk -F. '{print $1}'`";

# make sure we use dnf on EL 8+
if [ "$major_version" -ge 8 ]; then
  pkg_cmd="dnf"
else
  pkg_cmd="yum"
fi


echo "Remove development and kernel source packages"
$pkg_cmd -y remove gcc cpp gc kernel-devel kernel-headers glibc-devel elfutils-libelf-devel glibc-headers kernel-devel kernel-headers

if [ "$major_version" -ge 8 ]; then
  echo "remove orphaned packages"
  dnf -y autoremove
  echo "Remove previous kernels that preserved for rollbacks"
  dnf -y remove -y $(dnf repoquery --installonly --latest-limit=-1 -q)
else
  echo "Remove previous kernels that preserved for rollbacks"
  if ! command -v package-cleanup >/dev/null 2>&1; then
    yum -y install yum-utils
  fi
  package-cleanup --oldkernels --count=1 -y
fi

# Avoid ~200 meg firmware package we don't need
# this cannot be done in the KS file so we do it here
echo "Removing extra firmware packages"
$pkg_cmd -y remove linux-firmware

echo "clean all package cache information"
$pkg_cmd -y clean all  --enablerepo=\*;

# Clean up network interface persistence
rm -f /etc/udev/rules.d/70-persistent-net.rules;
mkdir -p /etc/udev/rules.d/70-persistent-net.rules;
rm -f /lib/udev/rules.d/75-persistent-net-generator.rules;
rm -rf /dev/.udev/;

for ndev in `ls -1 /etc/sysconfig/network-scripts/ifcfg-*`; do
    if [ "`basename $ndev`" != "ifcfg-lo" ]; then
        sed -i '/^HWADDR/d' "$ndev";
        sed -i '/^UUID/d' "$ndev";
    fi
done


echo "truncate any logs that have built up during the install"
find /var/log -type f -exec truncate --size=0 {} \;

echo "remove the install log"
rm -f /root/anaconda-ks.cfg /root/original-ks.cfg

echo "remove the contents of /tmp and /var/tmp"
rm -rf /tmp/* /var/tmp/*

echo "Clear the history so our install commands aren't there"
rm -f /root/.wget-hsts
export HISTSIZE=0

Add execution bit to the script:

chmod +x cleanup.sh

Then run the script to perform cleanup process:

./cleanup.sh

Exit the terminal:

rm -f cleanup.sh
cat /dev/null > ~/.bash_history && history -c && shutdown -h now

Press CTRL+] to close VM console

Perform Clean up to remove MAC address details using virt-sysprep utility:

$ sudo virt-sysprep -d rocky-linux-8
[   0.0] Examining the guest ...
[   5.5] Performing "abrt-data" ...
[   5.5] Performing "backup-files" ...
[   5.8] Performing "bash-history" ...
[   5.8] Performing "blkid-tab" ...
[   5.8] Performing "crash-data" ...
[   5.9] Performing "cron-spool" ...
[   5.9] Performing "dhcp-client-state" ...
[   5.9] Performing "dhcp-server-state" ...
[   5.9] Performing "dovecot-data" ...
[   5.9] Performing "ipa-client" ...
[   5.9] Performing "kerberos-hostkeytab" ...
[   5.9] Performing "logfiles" ...
[   6.0] Performing "machine-id" ...
[   6.0] Performing "mail-spool" ...
[   6.0] Performing "net-hostname" ...
[   6.0] Performing "net-hwaddr" ...
[   6.1] Performing "pacct-log" ...
[   6.1] Performing "package-manager-cache" ...
[   6.1] Performing "pam-data" ...
[   6.1] Performing "passwd-backups" ...
[   6.1] Performing "puppet-data-log" ...
[   6.1] Performing "rh-subscription-manager" ...
[   6.2] Performing "rhn-systemid" ...
[   6.2] Performing "rpm-db" ...
[   6.2] Performing "samba-db-log" ...
[   6.2] Performing "script" ...
[   6.2] Performing "smolt-uuid" ...
[   6.2] Performing "ssh-hostkeys" ...
[   6.2] Performing "ssh-userdir" ...
[   6.2] Performing "sssd-db-log" ...
[   6.2] Performing "tmp-files" ...
[   6.2] Performing "udev-persistent-net" ...
[   6.3] Performing "utmp" ...
[   6.3] Performing "yum-uuid" ...
[   6.3] Performing "customize" ...
[   6.3] Setting a random seed
[   6.3] Setting the machine ID in /etc/machine-id
[   6.3] Performing "lvm-uuids" ...

Undefine the libvirt domain:

$ virsh undefine rocky-linux-8
Domain 'rocky-linux-8' has been undefined

Step 5: Upload the Image to OpenStack Glance

We can now upload Rocky Linux 8 image to Glance Image service since the virtual machine image is no longer being managed by libvirt.

The underlying image file that you created is ready to be uploaded using the commands below:

openstack image create Rocky-Linux-8 \
  --file /var/lib/libvirt/images/rocky-linux-8.qcow2 \
  --disk-format qcow2 \
  --container-format bare \
  --public

Confirm image upload status:

$ openstack image list
+--------------------------------------+-----------------+--------+
| ID                                   | Name            | Status |
+--------------------------------------+-----------------+--------+
| d24b5d89-dc55-4433-a6c1-8533d9f75a11 | CentOS-Stream-8 | active |
| e17a9d60-3a82-4074-b52c-f79cdc31295a | Cirros-0.5.2    | active |
| 6ba292c5-c96d-4daf-a9d3-ebb1375277e9 | Debian-10       | active |
| c141e02c-f040-48e4-8441-1eb07b5af62e | Fedora-34       | active |
| fd3d1a9e-8d7e-4cc8-8806-232f1443a5b9 | FreeBSD-12      | active |
| 4fb906ec-8112-495b-86c8-1e21ffd68642 | FreeBSD-13      | active |
| 682bdb8d-011b-4b50-87bf-d68d3c2468de | Rocky-Linux-8   | active |
| c7e795e9-c002-400c-90a1-bfcdc82d0bfc | Ubuntu-20.04    | active |
+--------------------------------------+-----------------+--------+

Step 5: Creating Rocky Linux 8 Instance on OpenStack

With the image uploaded to Glance we can create an instance on OpenStack to confirm its functionality.

Get network to use:

$ openstack network list
+--------------------------------------+---------+--------------------------------------+
| ID                                   | Name    | Subnets                              |
+--------------------------------------+---------+--------------------------------------+
| 34baac2e-2393-4607-b1c9-2d7044d40978 | private | 48789ed8-d7b7-4606-8ed8-0f1036312463 |
| 8fb37281-9c89-4110-ac84-44179011767d | public  | 23357ddf-d536-49d4-81e6-f80f6c4d2434 |
+--------------------------------------+---------+--------------------------------------+

Compute server flavor:

$ openstack flavor list
+----+-----------+-------+------+-----------+-------+-----------+
| ID | Name      |   RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+-------+------+-----------+-------+-----------+
| 0  | m1.tiny   |   512 |    5 |         0 |     1 | True      |
| 1  | m1.small  |  1024 |   10 |         0 |     1 | True      |
| 2  | m1.medium |  2048 |   20 |         0 |     2 | True      |
| 3  | m1.large  |  4096 |   30 |         0 |     2 | True      |
| 4  | m1.xlarge |  8192 |   40 |         0 |     4 | True      |
| 5  | m1.jumbo  | 16384 |   50 |         0 |     6 | True      |
+----+-----------+-------+------+-----------+-------+-----------+

Security group to use:

$ openstack security group list
+--------------------------------------+------------+------------------------+----------------------------------+------+
| ID                                   | Name       | Description            | Project                          | Tags |
+--------------------------------------+------------+------------------------+----------------------------------+------+
| 2cc466c8-56a9-4540-bacb-9fcba39f6079 | default    | Default security group | d87ec405cf8d409cb351e8a5a966aa3d | []   |
| b9348b10-e183-41ad-b1a6-ab15c4a3cf99 | permit_all | Allow all ports        | d87ec405cf8d409cb351e8a5a966aa3d | []   |
| ca6aee3a-53c6-4ce0-a2c4-d2d39532556a | default    | Default security group | 3109267d83094ae1a9f2bf165b48bed0 | []   |
+--------------------------------------+------------+------------------------+----------------------------------+------+

And lastly obtain the name of SSH keypair to use:

$ openstack keypair list
+---------+-------------------------------------------------+------+
| Name    | Fingerprint                                     | Type |
+---------+-------------------------------------------------+------+
| admin   | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f | ssh  |
| jkmutai | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f | ssh  |
+---------+-------------------------------------------------+------+

With the image uploaded to Glance we can create an instance on OpenStack to confirm its functionality:

openstack server create \
  --flavor m1.medium \
  --image Rocky-Linux-8 \
  --network private \
  --key-name admin \
  --security-group permit_all \
  rocky-linux-01

When running the status should show as Active:

$ openstack server list --name rocky-linux-01
+--------------------------------------+----------------+--------+-----------------------+---------------+-----------+
| ID                                   | Name           | Status | Networks              | Image         | Flavor    |
+--------------------------------------+----------------+--------+-----------------------+---------------+-----------+
| fbe3f02c-9584-492d-8930-02e7e2ee41c6 | rocky-linux-01 | ACTIVE | private=172.10.10.154 | Rocky-Linux-8 | m1.medium |
+--------------------------------------+----------------+--------+-----------------------+---------------+-----------+

You can create floating IP and attach to the instance if created on the private network:

openstack floating ip create <public-network>
openstack server add floating ip <instance-name> <floating-ip>

Let’s try SSH to our Rocky Linux 8 server:

$ ssh [email protected]
Warning: Permanently added 'serverip' (ED25519) to the list of known hosts.
Enter passphrase for key '/Users/jmutai/.ssh/id_rsa':
[[email protected] ~]$

Confirm OS release information:

[[email protected] ~]$ cat /etc/os-release
NAME="Rocky Linux"
VERSION="8.4 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel fedora"
VERSION_ID="8.4"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Rocky Linux 8.4 (Green Obsidian)"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:rocky:rocky:8.4:GA"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky Linux"
ROCKY_SUPPORT_PRODUCT_VERSION="8"

There you have Rocky Linux 8 server running on OpenStack. We started with VM creation on KVM, performed clean up, uploaded the Qcow2 image to OpenStack, and finally created an instance on OpenStack from the image. The same process can be used for any other RHEL 8 based operating system such as AlmaLinux 8.

Linux System Administration Video Courses:

Similar guides:

How To Install OKD OpenShift 4.x Cluster on OpenStack

How To Use Open vSwitch Bridge on KVM Virtual Machines

Install WebVirtCloud KVM Management on CentOS 8 / Stream 8

Your support is our everlasting motivation,
that cup of coffee is what keeps us going!


As we continue to grow, we would wish to reach and impact more people who visit and take advantage of the guides we have on our blog. This is a big task for us and we are so far extremely grateful for the kind people who have shown amazing support for our work over the time we have been online.

Thank You for your support as we work to give you the best of guides and articles. Click below to buy us a coffee.

LEAVE A REPLY

Please enter your comment!
Please enter your name here