# Customize RHEL/CentOS Installation Media (EL4/EL5+)

### Introduction

A standard install media, (let’s talk about a DVD for easier start) has several files/folders at his root, but most important are:

• isolinux (where the loader lives)
• images (for extra files for installer to load)
• Packages for installation (RedHat/ for EL4, Server/Client for EL5)

Usually, a distribution has for it’s main binaries more than 2 Gb of data, that enables one target to act as a multifunction server/workstation, but that you will not usually load on the same system. Furthermore, since the DVD creation, there have been so many updates/patches that make your installation a ‘outdated’ install that you’ll need to upgrade to have recent patches.

Wouldn’t it be better to have one install media suited for your target systems with all available updates applied?

### Preparing everything

First, we’ll need to copy all of our DVD media to a folder in our harddrive, including those hidden files on DVD root (the ones telling installer which cd-sets are included and some other info).

Let’s asume that we’ll work on /home/user/DVD/

After we’ve copied everything from our install media, we’ll start customizing :)

### DVD background image at boot prompt

We can customize DVD background image and even keyboard layout by tweaking “isolinux/isolinux.cfg” with all required fields (Check Syslinux Documentation to check proper syntax)

On Kickstart: instalaciones automatizadas para anaconda (spanish) you can also check how to create a kickstart, so you can embed it on this DVD and configure isolinux.cfg to automatic provision a system

The easiest way would be to install a system with all required package set from original DVD media, and then connect that system to an update server to fetch but not install them.

• EL4: up2date -du # yum upgrade —downloadonly
• EL5: yum upgrade —downloadonly

After you download every single update, you’ll need to copy them to a folder like /home/user/DVD/updates/.

Well, now let’s start the funny work:

For each package in updates/, you’ll need to remove old version from original folder (remember: Client/ Server/ or RedHat/RPMS ), and place in that folder the updated one…

After some minutes, you’ll have all updates in place… and you can remove the DVD/updates/ folder as it will be empty after placing each updated RPM in the folder where the previous versions was.

### Removing unused packages

Well, after having everthing in place, we’ll start removing unused files. Usually, we could check every package install status on ‘test’ system by checking rpm, but that’s going to be a way looooong task, so we can ‘automate’ it a bit by doing:

• If you have ssh password less connection between your systems (BUILD and TARGET):

On BUILD system:

for package in *.rpm
do
NAME=rpm -q —queryformat '%NAME' $package ssh TARGET "rpm -q$NAME >/dev/null 2>&1 || echo rm $package" |tee things-to-do done • If you don’t have ssh password-less setup (using private/public key auth or kerberos), you can do something similar this way: On BUILD system: for package in *.rpm do NAME=rpm -q —queryformat '%NAME'$package echo "$package:$NAME" > packages-on-DVD
done

Then copy that file on your TARGET system and running:

On TARGET system:

for package in cat packages-on-DVD
do
QUERY=echo $package|cut -d ":" -f 2 FILE=echo$package|cut -d ":" -f 1 rpm -q —queryformat '%NAME' $QUERY >/dev/null 2>&1 || echo rm$FILE|tee things-to-do
done

After you finish, you’ll have a file named things-to-do, in which you’ll see commands like ‘rm packagename-version.rpm’

If you’re confident about it’s contents, you can run sh things-to-do and have all ‘not installed on TARGET’ packages removed from your DVD folder.

In the same way we added updates, we can also add new software to be deployed along base system like monitoring utilities, custom software, HW drivers, etc, just add packages to desired folders before going throught next steps.

After all our adds and removals, we need to tell installer that we changed packages, and update it’s dependencies, install order, etc.

EL4

This one is trickier, but it is still possible in a not so hard way, first of all, we need to update some metadata files (hdlist) and Package order for installation, it can be dificult if we add extra packages, as we’ll have special care:

Gererate first version of hdlists:

export PYTHONPATH=/usr/lib/anaconda-runtime:/usr/lib/anaconda
/usr/lib/anaconda-runtime/genhdlist —withnumbers /home/user/DVD/
/usr/lib/anaconda-runtime/pkgorder /home/user/DVD/ i386 |tee /home/user/order.txt

Review order.txt to check all packages added by hand to check correct or include missing packages and then continue with next commands:

export PYTHONPATH=/usr/lib/anaconda-runtime:/usr/lib/anaconda
/usr/lib/anaconda-runtime/genhdlist —withnumbers /home/user/DVD/ —fileorder /home/user/order.txt

EL5

Using createrepo we’ll recreate metadata, but we’ve to keep care and use comps.xml to provide ‘group’ information to installer, so we’ll need to run:

createrepo -g /home/DVD/Server/repodata/groupsfile.xml /home/DVD/Server/

### Finishing

At this step you’ll have a DVD structure on your hard drive, and just need to get an ISO to burn and test:

mkisofs -v -r -N -L -d -D -J -V NAME -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -x lost+found -m .svn -o MyCustomISO.iso /home/user/DVD/

Now, it’s time to burn MyCustomISO.iso and give it a try ;-)

PD: While testing is just better to keep using rewritable media until you want to get a ‘release’