Fedora has been my primary operating system for many years. Recently I was doing some computation in the Google Compute Engine. In case you don’t know about Google Compute Engine, you can start from here . I’ve been disappointed that there is no prebuilt image of Fedora in Google Compute Engine. But they provide a way to create custom images from source disks, images, snapshots, or images stored in Cloud Storage. We can use these images to create virtual machine (VM) instances. In this article we use Fedora Cloud Base Image to create the custom image for Google Compute Engine virtual machine instances.
To start, you need a linux machine where we’re going to build and modify the official Fedora Cloud image for Google Compute Engine. You also need the gcloud command-line tool to upload and create the image from Google Cloud Storage Bucket. If you don’t have the gcloud command-line tool installed in your machine, you can install it from here .
After installing the gcloud command-line tool, use the
gcloud init command to perform several common SDK setup tasks. These include authorizing the SDK tools to access Google Cloud using your user account credentials and setting up the default SDK configuration.
To create a custom image for Google Compute Engine, the first thing we will need is a Fedora Cloud Base Image. You can find a full list of Fedora Cloud Images here . Among those, we download the Cloud Base compressed raw image. In this article, we use Fedora 32 Cloud Base Compressed Raw Image. To download the raw image, run,
Once download is done, decompress the downloaded file.
xz --decompress "Fedora-Cloud-Base-32-1.6.x86_64.raw.xz"
This may take a few minutes to decompress. On the next step, we will mount this raw disk image, chroot inside it, install
google-compute-engine-tools so it can be compatible with Google Compute Engine, remove a few unnecessary software, clean up various temporary files and then finally create a compressed disk image to upload on Google Cloud Storage.
Customizing the raw image
First create an empty directory, where we can mount the raw disk image.
And then mount the raw disk image to the
sudo mount -o loop,offset=1048576 "$PWD/Fedora-Cloud-Base-32-1.6.x86_64.raw" "$PWD/cloud"
Change the current directory to the
cloud directory and mount a few more directories for any decent application and network to work.
cd "cloud" sudo mount --bind "/dev" "dev" && sudo mount --bind "/sys" "sys" && sudo mount --bind "/proc" "proc" && sudo mount --bind "/etc/resolv.conf" "etc/resolv.conf"
Now, we can chroot to the mounted raw disk
sudo chroot "./" "/usr/bin/bash"
You have successfully chroot to Fedora loop-mounted raw disk. Let’s update the loop mounted system.
dnf upgrade --assumeyes --nogpgcheck "*"
It may take a few minutes to complete. Once done, install
cloud-utils-growpart to make this image compatible with Google Compute Engine and resize the disk using
dnf install --assumeyes --nogpgcheck "google-compute-engine-tools" "cloud-utils-growpart"
This is going to install all Google Cloud related all softwares. Once installation is done, let’s enable a few systemd services to run on boot.
systemctl enable "google-accounts-daemon" "google-clock-skew-daemon" \ "google-instance-setup" "google-network-daemon" \ "google-shutdown-scripts" "google-startup-scripts"
Since we installed and removed a few softwares, let’s relabel the entire file system on the next boot. We don’t want selinux to give us any headache.
Now clean dnf caches, clear bash history, exit chroot and get out of the loop-mounted directory.
dnf clean all cat /dev/null > /root/.bash_history && history -c && exit cd ../
After getting out of the loop-mounted directory, you can unmount the directories.
sudo umount "cloud/dev" "cloud/proc" "cloud/sys" "cloud/etc/resolv.conf"
After that, remove temporary files and unmount the
sudo fstrim --verbose "cloud" sudo umount "cloud"
Now it’s time to create the final image.
mv "Fedora-Cloud-Base-32-1.6.x86_64.raw" "disk.raw" tar --create --auto-compress --file="Fedora-Cloud-Base-32-1.6.x86_64.tar.gz" --sparse "disk.raw"
You have successfully created a custom compressed image that we are going to upload in the next step to the Google Cloud Bucket.
Creating the custom image for Google Compute Engine
Till now, we created a custom compressed image from Fedora Cloud Base raw image. Now we are going to create a Google Cloud Storage bucket and upload this compressed image to that storage bucket.
gsutil mb "gs://dev-al-shakib-custom-images"
This will create a Google Cloud Storage bucket as
dev-al-shakib-custom-images. Please note that, you can pick only a globally unique name. So choose wisely. Once done, let’s upload our custom image to this bucket.
gsutil cp "Fedora-Cloud-Base-32-1.6.x86_64.tar.gz" "gs://dev-al-shakib-custom-images/"
This may take a few minutes. Once done, create a custom Google Compute Engine image from this uploaded compressed image.
gcloud compute images create --source-uri \ gs://dev-al-shakib-custom-images/Fedora-Cloud-Base-32-1.6.x86_64.tar.gz \ fedora-cloud-base-32
Congratulations! You have successfully created the Fedora Cloud Base 32 custom image.
Now it’s time to test that custom image.
- Visit here
- Click on
- Under the
Boot disksection, click on the
- Go in the
Custom imagestab and then pick the image you just created.
- Change the boot disk size to 10GB.
- You might want to set the VM as Preemptible, since you’ll use it only for tests and not keep it.
- Click on the
It may take a few minutes to boot up the instance. Once it’s up and running, click on the
SSH button. Finally you’re logged in to your Fedora VM, run by Google Cloud Platform.