Rocky qcow2 images can be downloaded by clicking on the download link below, or if you would like to step through the process of building or customising your own image you can follow the step-by-step instructions below.

How to Build Your own Rocky Images from the ISO file:

To setup your Rocky Linux image, first download the iso and import into Openstack:

curl -L -O https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.4-x86_64-minimal.iso
openstack image create Rocky-8.4-iso --public --container-format bare --disk-format iso --file ./Rocky-8.4-x86_64-minimal.iso

Via the dashboard create a new instance using this image.

Attach a second volume to the instance as an installation target (if you do this after the boot you may need to rescan the drives during the installation if no disks are detected).

Proceed with the installation until it is complete. We added a Rocky user and gave that account a password – this will get cleaned up by sysprep later on.

Once the installation is complete you can shutdown the instance and detach the installation target volume.

Now, let’s boot up the new Rocky environment – where $VOLUME_ID is the cinder volume uuid which acted as the target installer for Rocky earlier:

openstack server create rocky-8.4-cloudimage --flavor m1.medium --network private --volume $VOLUME_ID

Once thats all up and running, we can ssh in to setup the system. First, log into the rocky OS and install cloud-init:

dnf install epel-release
dnf install cloud-init

On the cloud-init side, we set the following features in the configuration file:

/etc/cloud/cloud.cfg
system_info:
  default_user:
    name: rocky
    lock_passwd: true
    gecos: Cloud User
    groups: [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

Once we are happy with all of that, we can pull down the volume as a qcow2 image. Again, shut the instance down so the volume is not in a running state.

$VOLUME_ID is the block device we installed Rocky to earlier
$IMAGE_NAME whatever you wanted to call your Rocky image
$IMAGE_ID output from the cinder commands confirming the UUID of the newly created glance image file
$IMAGE_FILE_NAME is the local image qcow2 file name
cinder upload-to-image --disk-format qcow2 --force=True $VOLUME_ID $IMAGE_NAME
glance image-download $IMAGE_ID --file $IMAGE_FILE_NAME

You can now either copy the image over to an environment where the virt / libguestgs tools are present or install them locally. To install libguests-tools:

dnf install libguestfs-tools

And sysprep the image:

[root@rocky-8 rocky]# export LIBGUESTFS_BACKEND=direct
[root@rocky-8 rocky]# virt-sysprep -a ./rocky-8.4-cloudimage.qcow2
[ 0.0] Examining the guest ...
[ 117.5] Performing "abrt-data" ...
[ 118.1] Performing "backup-files" ...
[ 141.0] Performing "bash-history" ...
[ 141.3] Performing "blkid-tab" ...
[ 141.7] Performing "crash-data" ...
[ 141.9] Performing "cron-spool" ...
[ 143.1] Performing "dhcp-client-state" ...
[ 143.3] Performing "dhcp-server-state" ...
[ 143.3] Performing "dovecot-data" ...
[ 143.6] Performing "ipa-client" ...
[ 143.8] Performing "kerberos-hostkeytab" ...
[ 143.9] Performing "logfiles" ...
[ 149.1] Performing "machine-id" ...
[ 149.3] Performing "mail-spool" ...
[ 149.4] Performing "net-hostname" ...
[ 150.0] Performing "net-hwaddr" ...
[ 150.7] Performing "pacct-log" ...
[ 151.0] Performing "package-manager-cache" ...
[ 153.0] Performing "pam-data" ...
[ 153.2] Performing "passwd-backups" ...
[ 153.4] Performing "puppet-data-log" ...
[ 153.6] Performing "rh-subscription-manager" ...
[ 154.0] Performing "rhn-systemid" ...
[ 154.4] Performing "rpm-db" ...
[ 154.8] Performing "samba-db-log" ...
[ 155.3] Performing "script" ...
[ 155.3] Performing "smolt-uuid" ...
[ 155.7] Performing "ssh-hostkeys" ...
[ 156.1] Performing "ssh-userdir" ...
[ 156.6] Performing "sssd-db-log" ...
[ 156.9] Performing "tmp-files" ...
[ 158.0] Performing "udev-persistent-net" ...
[ 158.2] Performing "utmp" ...
[ 158.3] Performing "yum-uuid" ...
[ 158.5] Performing "customize" ...
[ 158.7] Setting a random seed
[ 159.1] Setting the machine ID in /etc/machine-id
[ 160.2] Performing "lvm-uuids" ...

Now, lets shrink down the image using virt-sparsify:

[root@rocky-8 rocky]# export TMPDIR=/scratch
[root@rocky-8 rocky]# virt-sparsify --compress rocky-8.4-cloudimage.qcow2 rocky-8.4-cloudimage-final.qcow2
[ 0.6] Create overlay file in /scratch to protect source disk
[ 1.7] Examine source disk
◓ 25% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════⟧ --:--
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[ 151.5] Fill free space in /dev/rl/root with zero
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[ 531.1] Clearing Linux swap on /dev/rl/swap
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[ 569.2] Fill free space in /dev/sda1 with zero
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[ 593.2] Copy to destination and make sparse
[1036.3] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.

[root@rocky-8 rocky]# ls -lah

-rw-r--r--. 1 root root 908M Jun 29 06:27 rocky-8.4-cloudimage-final.qcow2
-rw-r--r--. 1 rocky rocky 2.2G Jun 29 05:08 rocky-8.4-cloudimage.qcow2

Very nice! Now, let’s get this up online for people to try out. Our ready-made image is available via the download button at the beginning and end of this blog post.

If you have any suggestions for improvements on the above – please feel free to comment below!

Leave a Reply

Your email address will not be published. Required fields are marked *