In this article I will share the steps to create anaconda updates.img which is used with inst.updates in GRUB2 menu or in PXE configuration file for boot menu with examples.

What is product.img or updates.img image file?
A product.img or updates.img image file is an archive containing
files which replace existing files or add new ones in the installer
runtime. During boot, Anaconda loads this file from the images/
directory on the boot media. Then, it uses files present inside this
file to replace identically named files in the installer’s file system;
this is necessary to customize the installer (for example, for replacing
default images with custom ones).
product.img or updates.img image must contain a directory
structure identical to the installer.
Create anaconda updates.img
If you are working on anaconda or looking at a bug and want to test your
own bug fixes, it’s easy to create your own updates.img file. An
updates.img can include more than just files from anaconda, though. It
can also include shared libraries, graphics, other python modules, and
certain data files used by anaconda.
Now before I share the steps to create anaconda updates.img, you must
be familiar with the directory structure so that your changes can be
dumped properly on the host. For the sake of this article I will create
a new udev rule file and add it in my updates.img file
The location fo this udev rule file must be
/usr/lib/udev/rules.d/
Navigate to a working directory such as /tmp, and create the directory
structure similar to as the above rules.d under a temporary folder.
# cd /tmp
Here I will create a temporary directory custom_updates_img where we
will create anaconda updates.img
[root@rhel-7 tmp]# mkdir custom_updates_img
[root@rhel-7 tmp]# cd custom_updates_img
Create the required directory structure
[root@rhel-7 custom_updates_img]# mkdir -p usr/lib/udev/rules.d/
Now place your rule file inside
/tmp/custom_updates_img/usr/lib/udev/rules.d/
[root@rhel-7 custom_updates_img]# cd usr/lib/udev/rules.d/
[root@rhel-7 rules.d]# ls -l
total 4
-rw-r--r--. 1 root root 876 Sep 14 01:05 20-persistent-net.rules
Repeat the above steps (create a directory structure and move modified files into it) for every file you want to add to the installer.
Create a .buildstamp file in the root of the directory which will
become the updates.img file. The .buildstamp file describes the
system version and several other parameters. The following is an example
of a .buildstamp file from Red Hat Enterprise Linux 7.6:
[Main]
Product=Red Hat Enterprise Linux
Version=7.6
BugURL=your distribution provided bug reporting tool
IsFinal=False
UUID=201904040748.x86_64
[Compose]
Lorax=19.6.92-1
IsFinal parameter, which specifies whether the image is for a
release (GA) version of the product (True), or a pre-release such as
Alpha, Beta, or an internal milestone (False). Since this change is for
demonstration, I will use False
The tool used to create such installation media is lorax. Whenever Engineering needs to modify the boot.iso or create an ISO, lorax is used.
Below is our final list for updates.img
[root@rhel-7 custom_updates_img]# ls -la
total 8
drwxr-xr-x. 3 root root 36 Sep 14 01:35 .
drwxrwxrwt. 10 root root 4096 Sep 14 01:15 ..
-rw-r--r--. 1 root root 170 Sep 14 01:35 .buildstamp
drwxr-xr-x. 3 root root 17 Sep 14 01:20 usr
Change into the /tmp/custom_updates_img directory, and create the
updates.img archive:
[root@rhel-7 rules.d]# cd /tmp/custom_updates_img
[root@rhel-7 custom_updates_img]# find . | cpio -c -o | gzip -9cv > ../updates.img
5 blocks
80.3%
This creates an updates.img file one level above the
custom_updates_img/ directory.
Verify your updates.img file
[root@rhel-7 custom_updates_img]# ls -lh ../updates.img
-rw-r--r--. 1 root root 361 Sep 14 01:15 ../updates.img
Check the content of updates.img image file
[root@rhel-7 custom_updates_img]# lsinitrd /tmp/updates.img
Image: /tmp/updates.img: 4.0K
========================================================================
Version:
Arguments:
dracut modules:
========================================================================
drwxr-xr-x 3 root root 0 Sep 14 01:05 .
-rw-r--r-- 1 root root 170 Sep 14 01:35 .buildstamp
drwxr-xr-x 3 root root 0 Sep 14 01:02 usr
drwxr-xr-x 3 root root 0 Sep 14 01:02 usr/lib
drwxr-xr-x 3 root root 0 Sep 14 01:02 usr/lib/udev
drwxr-xr-x 2 root root 0 Sep 14 01:05 usr/lib/udev/rules.d
-rw-r--r-- 1 root root 876 Sep 14 01:05 usr/lib/udev/rules.d/20-persistent-net.rules
========================================================================
Now you can copy your updates.img to the location using which you wish
to mount and share the image
file.
How to use or mount updates.img during boot up stage?
Instead of adding the updates.img or product.img file on the boot
media, you can place this file into a different location and use the
inst.updates= boot option at the boot menu to load it.
In that case, the image file can have any name, and it can be placed in any location (USB flash drive, hard disk, HTTP, FTP or NFS server), as long as this location is reachable from the installation system.
inst.updates=
Specifies the location of the updates.img file to be applied to the installation program runtime.
The syntax to be used is shown in below table. In all formats, if you do not specify a file name but only a directory, the installation program will look for a file named updates.img
| Installation Source | Option Format |
|---|---|
| Any CD/DVD drive | inst.updates=cdrom |
| Specific CD/DVD drive | inst.updates=cdrom:device |
| Hard Drive | inst.updates=hd:device:/path |
| HMC | inst.updates=hmc |
| HTTP Server | inst.updates=http://host/path |
| HTTPS Server | inst.updates=https://host/path |
| FTP Server | inst.updates=ftp://username:password@host/path |
| NFS Server | inst.updates=nfs:server:/path,nfsvers=3 (For NFSv3) inst.updates=nfs:server:/path,nfsvers=4 (For NFSv4) |
Mount updates.img with PXE based installation
Here I am using NFS protocol to mount the updates.img at the initial
stage of PXE based installation. Below is my sample PXE boot file
default autoinst
label autoinst
IPAPPEND 2
kernel rhel7_64/vmlinuz
append initrd=rhel7_64/initrd.img ramdisk_size=65536 vga=no ksdevice=bootif ks=nfs:10.10.10.20:/home/custom_install/kickstart.conf,nfsvers=4 inst.updates=nfs:10.10.10.20:/tmp/custom_initrd/updates.img,nfsvers=3
Mount updates.img with DVD based installation
Here I will boot my vm running on Oracle VirtualBox installed on my Linux Server with RHEL 7.6 ISO DVD.

You will get this screen to start the installation, here press TAB to bring the boot menu

Here append the additional content to mount updates.img using
inst.updates as shown below (I have used HTTP as example but you can use
any other supported protocol)

Extract updates.img image file
Now after you create anaconda updates.img, you can also extract the
updates.img image file for further modification. Again create a
temporary directory and extract the updates.img file using below
command
[root@rhel-7 custom_updates_img]# gunzip -dc /tmp/updates.img | cpio -id
4 blocks
Check the content of your updates.img
[root@rhel-7 custom_updates_img]# ls -l
total 0
drwxr-xr-x. 3 root root 17 Sep 14 01:20 usr
Lastly I hope the steps from the article to create anaconda updates.img on RHEL 7 and 8 Linux was helpful. So, let me know your suggestions and feedback using the comment section.


