Custom Linux bootable CD

From WBITT's Cooker!

(Difference between revisions)
Jump to: navigation, search
(comps.xml)
Line 1: Line 1:
-
This article is in relation to the article [[CENTOS Server CD project]] , and is "heavily" based on http://people.redhat.com/rkeech/custom-distro.txt . So here it goes.  
+
This article is in relation to the article [[CENTOS Server CD project]]. It took few concepts from http://people.redhat.com/rkeech/custom-distro.txt , which is now totally out-dated. In recent versions of RedHat and CentOS, most of the steps/commands are now taken care by a single "createrepo" command. So here it goes.  
===First, the setup===
===First, the setup===
-
My machine, on which I am doing all these steps / building the Custom CENTOS CD, is named kworkhorse, but will be referred to as the role <b><i>buildhost</i></b> in this text. It runs Fedora 11 64 bit.  
+
Originally I tried to use my Fedora-11 machine (named kworkhorse), for doing all these steps of  building the Custom CentOS cd. However, after burning two weeks of time, I realized that I have to build CentOS CD from a CentOS build host.
-
I have a directory <b>/data/cdimages</b>, which contains full install tree of original CENTOS 5.4 64 bit CD in <b>CENTOS-5.4-x86_64</b> subdirectory, and an empty <b>CENTOS-5.4-x86_64-core</b> (build) directory. The directory layout looks like the following:
+
So what I did is, I simply created a small virtual machine, within my Fedora 11, which runs CentOS-5.4-x86_64. It is named <b>"buildhost"</b>. I assigned 1GB of RAM and 3 GB of diskspace to this virtual machine. I did not use more space, because, I wanted to use least amount of disk space, and kind of re-use the already prepared "build-tree" from the Fedora11 machine. What I did was export /data/cdimages from Fedora11 host using NFS and mounted that on /mnt/cdimages on the newly  CentOS VM.
-
<pre>
+
The directory <b>/data/cdimages</b>, on my Fedora machine, contains full install tree of original CENTOS 5.4 64 bit CD in <b>CENTOS-5.4-x86_64</b> subdirectory, and an empty <b>CENTOS-5.4-x86_64-core</b> (build) directory. When this directory is mounted on my buildhost, ove nfs, the directory layout looks like the following:
-
[root@kworkhorse cdimages]# pwd
+
<pre>
-
/data/cdimages
+
[root@buildhost cdimages]# pwd
 +
/mnt/cdimages
-
[root@kworkhorse cdimages]# tree -d
+
[root@buildhost cdimages]# tree -d
.
.
├── CentOS-5.4-x86_64
├── CentOS-5.4-x86_64
Line 24: Line 25:
└── CentOS-5.4-x86_64-core
└── CentOS-5.4-x86_64-core
-
[root@kworkhorse cdimages]#
 
</pre>
</pre>
-
The directory <b>/data/cdimages/CentOS-5.4-x86_64-core</b> (which is empty at the moment), will be the custom install tree, and referred to as <b>$RHROOT</b> in this document. Once again:
+
The directory <b>/mnt/cdimages/CentOS-5.4-x86_64-core</b> (which is empty at the moment), will be the custom install tree, and will be referred to as <b>build-tree</b> or <b>build-directory</b> in this document. Once again:
<b>
<b>
-
* BuildHost: kworkhorse
+
* Machine on which CentOS CD is built: BuildHost
-
* BuildDirectory ( $RHROOT): /data/cdimages/CentOS-5.4-x86_64-core
+
* OS on build host: CentOS-5.4-x86_64
 +
* BuildDirectory: /mnt/cdimages/CentOS-5.4-x86_64-core
</b>
</b>
Line 41: Line 42:
</pre>
</pre>
-
Note: anaconda-runtime is RHEL/CENTOS specific package, and is part of the RHEL/CENTOS distribution. As evident below:
+
Note: anaconda-runtime is RHEL/CENTOS specific package, and is part of the RHEL/CENTOS distribution.  
-
<pre>
 
-
[kamran@kworkhorse CentOS]$ ls /data/cdimages/CentOS-5.4-x86_64/CentOS/anaconda-* -1
 
-
anaconda-11.1.2.195-1.el5.centos.x86_64.rpm
 
-
anaconda-runtime-11.1.2.195-1.el5.centos.x86_64.rpm
 
-
[kamran@kworkhorse CentOS]$
 
-
</pre>
 
-
This package "anaconda-runtime" provides the following packages:
+
Off-the-topic: On Fedora, if you want to generate custom fedora spin-offs, you can use "revisor" . It has a wizard-like GUI interface.
-
 
+
-
<pre>
+
-
[kamran@kworkhorse CentOS]$ rpm -qpl anaconda-runtime-11.1.2.195-1.el5.centos.x86_64.rpm
+
-
. . .
+
-
/usr/lib/anaconda-runtime
+
-
/usr/lib/anaconda-runtime/boot
+
-
/usr/lib/anaconda-runtime/boot/boot.msg
+
-
/usr/lib/anaconda-runtime/boot/general.msg
+
-
/usr/lib/anaconda-runtime/boot/options.msg
+
-
/usr/lib/anaconda-runtime/boot/param.msg
+
-
/usr/lib/anaconda-runtime/boot/rescue.msg
+
-
/usr/lib/anaconda-runtime/boot/syslinux.cfg
+
-
/usr/lib/anaconda-runtime/buildinstall
+
-
. . .
+
-
. . .
+
-
/usr/lib/anaconda-runtime/pyrc.pyo
+
-
/usr/lib/anaconda-runtime/readmap
+
-
/usr/lib/anaconda-runtime/screenfont-x86_64.gz
+
-
/usr/lib/anaconda-runtime/scrubtree
+
-
/usr/lib/anaconda-runtime/splittree.py
+
-
/usr/lib/anaconda-runtime/splittree.pyc
+
-
/usr/lib/anaconda-runtime/splittree.pyo
+
-
/usr/lib/anaconda-runtime/trimmodalias
+
-
/usr/lib/anaconda-runtime/trimpciids
+
-
/usr/lib/anaconda-runtime/upd-instroot
+
-
/usr/lib/anaconda-runtime/yumcache
+
-
. . .
+
-
[kamran@kworkhorse CentOS]$
+
-
</pre>
+
-
 
+
-
 
+
-
If you are using Fedora, you may not find anaconda-runtime. Instead anaconda and anaconda-runtime are (kind of) merged into single package, which provides (almost) the same functionality :
+
-
 
+
-
<pre>
+
-
[root@kworkhorse cdimages]# rpm -ql anaconda  | grep runtime
+
-
. . .
+
-
/usr/lib/anaconda-runtime
+
-
/usr/lib/anaconda-runtime/boot
+
-
/usr/lib/anaconda-runtime/boot/boot.msg
+
-
/usr/lib/anaconda-runtime/boot/grub.conf
+
-
/usr/lib/anaconda-runtime/boot/syslinux.cfg
+
-
/usr/lib/anaconda-runtime/buildinstall
+
-
/usr/lib/anaconda-runtime/buildinstall.functions
+
-
/usr/lib/anaconda-runtime/genmodinfo
+
-
/usr/lib/anaconda-runtime/getkeymaps
+
-
/usr/lib/anaconda-runtime/keymaps-override-x86_64
+
-
/usr/lib/anaconda-runtime/loader
+
-
/usr/lib/anaconda-runtime/loader/init
+
-
/usr/lib/anaconda-runtime/loader/loader
+
-
. . .
+
-
. . .
+
-
/usr/lib/anaconda-runtime/pyrc.pyc
+
-
/usr/lib/anaconda-runtime/pyrc.pyo
+
-
/usr/lib/anaconda-runtime/readmap
+
-
/usr/lib/anaconda-runtime/screenfont-x86_64.gz
+
-
/usr/lib/anaconda-runtime/scrubtree
+
-
/usr/lib/anaconda-runtime/trimpciids
+
-
/usr/lib/anaconda-runtime/upd-instroot
+
-
/usr/lib/anaconda-runtime/upd-updates
+
-
. . .
+
-
[root@kworkhorse cdimages]#
+
-
</pre>
+
-
 
+
-
You may need the following additional packages on more recent distributions. On my build host (Fedora 11 64 bit), I had to install "pungi" to get the "pkgorder" command/tool.
+
-
 
+
-
<pre>
+
-
yum -y install pungi
+
-
</pre>
+
-
 
+
-
Optional: On Fedora, if you want to generate custom fedora spin-offs, you can use "revisor" . It has a wizard-like GUI interface.
+
<pre>
<pre>
Line 126: Line 51:
</pre>
</pre>
-
===The environment variables===
 
-
 
-
Quote from the original Howto:
 
-
<i>Many of the scripts provided in these packages are Python scripts.  For them to work properly the PYTHONPATH variable must be set to /usr/lib/anaconda and be exported in the shell environment in which the commands are run.  Many of the scripts are from the directory /usr/lib/anaconda-runtime, so either put this in the PATH or provide an absolute path to commands.</i>
 
-
 
-
So, you should setup the necessary environment variables. I would advise you to add the following two lines to your ~/.bash_profile, so each time you open a terminal, these values are set.
 
-
 
-
<pre>
 
-
export RHROOT=/data/cdimages/CentOS-5.4-x86_64-core
 
-
export PYTHONPATH=/usr/lib/anaconda
 
-
export PATH=$PATH:/usr/lib/anaconda-runtime
 
-
</pre>
 
-
 
-
<b>Note:</b> It is important to note, that even on a 64 bit system (as I have), these two paths are /usr/lib/anaconda and /usr/lib/anacoda-runtime. i.e. These two directories does not exist in /usr/lib64.
 
===Build the install tree===
===Build the install tree===
Line 146: Line 57:
<pre>
<pre>
# rsync -av --exclude CentOS/  \  
# rsync -av --exclude CentOS/  \  
-
   /data/cdimages/CentOS-5.4-x86_64/  /data/cdimages/CentOS-5.4-x86_64-core/
+
   /mnt/cdimages/CentOS-5.4-x86_64/  /mnt/cdimages/CentOS-5.4-x86_64-core/
</pre>
</pre>
 +
 +
Note: I prefer rsync, because it copies the .dot-files too. Later, we would be needing a special file named .discinfo, from the original tree.
When done, your buildtree would look like this:
When done, your buildtree would look like this:
<pre>
<pre>
-
[root@kworkhorse CentOS-5.4-x86_64-core]# pwd  
+
[root@buildhost CentOS-5.4-x86_64-core]# pwd  
-
/data/cdimages/CentOS-5.4-x86_64-core
+
/mnt/cdimages/CentOS-5.4-x86_64-core
-
[root@kworkhorse CentOS-5.4-x86_64-core]# tree -d
+
[root@buildhost CentOS-5.4-x86_64-core]# tree -d
.
.
├── images
├── images
Line 165: Line 78:
6 directories
6 directories
-
[root@kworkhorse CentOS-5.4-x86_64-core]#  
+
[root@buildhost CentOS-5.4-x86_64-core]#  
</pre>
</pre>
-
Now we need to copy selected RPMs from the source directory into the build directory. I created this file, by first creating a test VM using minimal Kickstart, and noted the list of packages installed in it. I could not think of any easier way. The file is located in /tmp/minivm, as installed-rpms.txt . (Look in [[CENTOS Server CD project]] to see how I generated it. Or use the [[Core Packages List CentOS-5.4-x86 64]] list for list of packages required for CentOS 5.4 64 bit.)
+
Now we need to copy selected RPMs from the source directory into the build directory. I created this file, by first creating a test VM using minimal kickstart, and noted the list of packages installed in it. I could not think of any easier way. The file is located in /tmp/minivm, as "installed-rpms.txt" . (Look in [[CENTOS Server CD project]] to see how I generated it. Or use the [[Core Packages List CentOS-5.4-x86 64]] list for list of packages required for CentOS 5.4 64 bit.)
<pre>
<pre>
-
# mkdir /data/cdimages/CentOS-5.4-x86_64-core/CentOS/
+
# mkdir /mnt/cdimages/CentOS-5.4-x86_64-core/CentOS/
# for filename in $(cat /tmp/minivm/installed-rpms.txt); do  
# for filename in $(cat /tmp/minivm/installed-rpms.txt); do  
-
   cp -v /data/cdimages/CentOS-5.4-x86_64/CentOS/"${filename}.rpm" \  
+
   cp -v /mnt/cdimages/CentOS-5.4-x86_64/CentOS/"${filename}.rpm" \  
-
     /data/cdimages/CentOS-5.4-x86_64-core/CentOS/  
+
     /mnt/cdimages/CentOS-5.4-x86_64-core/CentOS/  
done
done
</pre>
</pre>
 +
 +
Make sure you copy kernel-* files to the build tree. This is important, because at times, you may be using this CD in all sorts install scenarios, such as installation of bare-metal hosts, KVM hosts, XEN hosts, etc. So you would need at least two types of kernels in your installation.
===comps.xml===
===comps.xml===
-
From the original howot: <i>Comps file.  The file $RHROOT/RedHat/base/comps.xml defines the set of packages known to the installer.  The set of packages described in comps.xml must be reduced to  only those required.  It is not necessary to remove the unused package files from $RHROOT/RedHat/RPMS/. Some packages from $RHROOT/RedHat/RPMS/ are necessary in the process of building the install CD even though they might be excluded from the custom build.</i>
+
From the original howto: <i>Comps file.  The file $RHROOT/RedHat/base/comps.xml defines the set of packages known to the installer.  The set of packages described in comps.xml must be reduced to  only those required.  It is not necessary to remove the unused package files from $RHROOT/RedHat/RPMS/. Some packages from $RHROOT/RedHat/RPMS/ are necessary in the process of building the install CD even though they might be excluded from the custom build.</i>
Here is an <b>[[example comps.xml file]]</b> from the original howto (RHEL3 based).
Here is an <b>[[example comps.xml file]]</b> from the original howto (RHEL3 based).
-
As I mentioned in the related article, (borrowing the term from another author), th comps.xml has gazillion languages represented in it. I want to at least get rid of the languages stuff from the file, so I can work on it.
+
As I mentioned in the related article, (borrowing the sentence/term from another author), "the comps.xml has gazillion languages represented in it". I want to at least get rid of the languages stuff from the file, so I can work on it.
Here is something interesting. The original comps.xml file (CentOS-5.4) is 11418 lines.  
Here is something interesting. The original comps.xml file (CentOS-5.4) is 11418 lines.  
<pre>
<pre>
-
[root@kworkhorse CentOS-5.4-x86_64-core]# wc -l repodata/comps.xml  
+
[root@buildhost CentOS-5.4-x86_64-core]# wc -l repodata/comps.xml  
11418 repodata/comps.xml
11418 repodata/comps.xml
-
[root@kworkhorse CentOS-5.4-x86_64-core]#
+
[root@buildhost CentOS-5.4-x86_64-core]#
</pre>
</pre>
Line 198: Line 113:
<pre>
<pre>
-
[root@kworkhorse CentOS-5.4-x86_64-core]# grep  "xml:lang" repodata/comps.xml | wc -l
+
[root@buildhost CentOS-5.4-x86_64-core]# grep  "xml:lang" repodata/comps.xml | wc -l
8811
8811
</pre>
</pre>
Line 207: Line 122:
     <name xml:lang="nl">Cluster-opslag</name>
     <name xml:lang="nl">Cluster-opslag</name>
. . .  
. . .  
-
. . .
 
     <description xml:lang="nl">Pakketten die ondersteuning bieden voor cluster-opslag.</description>
     <description xml:lang="nl">Pakketten die ondersteuning bieden voor cluster-opslag.</description>
</pre>
</pre>
Line 214: Line 128:
<pre>
<pre>
-
[root@kworkhorse CentOS-5.4-x86_64-core]# grep -v  "xml:lang" repodata/comps.xml > /tmp/no-lang.comps.xml
+
[root@buildhost CentOS-5.4-x86_64-core]# grep -v  "xml:lang" repodata/comps.xml > /tmp/no-lang.comps.xml
-
[root@kworkhorse CentOS-5.4-x86_64-core]# wc -l /tmp/no-lang.comps.xml  
+
[root@buildhost CentOS-5.4-x86_64-core]# wc -l /tmp/no-lang.comps.xml  
2607 /tmp/no-lang.comps.xml
2607 /tmp/no-lang.comps.xml
Line 228: Line 142:
<pre>
<pre>
-
[root@kworkhorse CentOS-5.4-x86_64-core]# pwd
+
[root@buildhost CentOS-5.4-x86_64-core]# pwd
-
/data/cdimages/CentOS-5.4-x86_64-core
+
/mnt/cdimages/CentOS-5.4-x86_64-core
-
[root@kworkhorse CentOS-5.4-x86_64-core]# rm repodata/* -f
+
[root@buildhost CentOS-5.4-x86_64-core]# rm repodata/* -f
-
[root@kworkhorse CentOS-5.4-x86_64-core]# cp /tmp/no-lang.comps.xml  repodata/comps.xml
+
[root@buildhost CentOS-5.4-x86_64-core]# cp /tmp/no-lang.comps.xml  repodata/comps.xml
</pre>
</pre>
===Building the stuff===
===Building the stuff===
-
Original howto:
+
The RHEL3 based howto recommends to run the commands pkgorder, buildinstall, etc, on the build tree. This is no longer valid. A simple createrepo command takes care of everything.
-
<pre>
+
-
Pkgorder.  Run the command:
+
-
 
+
-
pkgorder $RHROOT i386 > $RHROOT/pkgorder-i386.txt
+
-
</pre>
+
-
 
+
-
So, doing it results in :
+
-
<pre>
+
-
[root@kworkhorse CentOS-5.4-x86_64-core]# pkgorder $RHROOT x86_64 > $RHROOT/pkgorder-x86_64.txt
+
-
pkgorder <toppath> <arch> <productpath>
+
-
<arch>: use rpm architecture for tree, eg i686
+
-
[root@kworkhorse CentOS-5.4-x86_64-core]#
+
-
</pre>
+

Revision as of 12:17, 3 July 2010

This article is in relation to the article CENTOS Server CD project. It took few concepts from http://people.redhat.com/rkeech/custom-distro.txt , which is now totally out-dated. In recent versions of RedHat and CentOS, most of the steps/commands are now taken care by a single "createrepo" command. So here it goes.

Contents

First, the setup

Originally I tried to use my Fedora-11 machine (named kworkhorse), for doing all these steps of building the Custom CentOS cd. However, after burning two weeks of time, I realized that I have to build CentOS CD from a CentOS build host.

So what I did is, I simply created a small virtual machine, within my Fedora 11, which runs CentOS-5.4-x86_64. It is named "buildhost". I assigned 1GB of RAM and 3 GB of diskspace to this virtual machine. I did not use more space, because, I wanted to use least amount of disk space, and kind of re-use the already prepared "build-tree" from the Fedora11 machine. What I did was export /data/cdimages from Fedora11 host using NFS and mounted that on /mnt/cdimages on the newly CentOS VM.

The directory /data/cdimages, on my Fedora machine, contains full install tree of original CENTOS 5.4 64 bit CD in CENTOS-5.4-x86_64 subdirectory, and an empty CENTOS-5.4-x86_64-core (build) directory. When this directory is mounted on my buildhost, ove nfs, the directory layout looks like the following:

[root@buildhost cdimages]# pwd
/mnt/cdimages

[root@buildhost cdimages]# tree -d
.
├── CentOS-5.4-x86_64
│   ├── CentOS
│   ├── images
│   │   ├── pxeboot
│   │   └── xen
│   ├── isolinux
│   ├── NOTES
│   └── repodata
└── CentOS-5.4-x86_64-core

The directory /mnt/cdimages/CentOS-5.4-x86_64-core (which is empty at the moment), will be the custom install tree, and will be referred to as build-tree or build-directory in this document. Once again:

  • Machine on which CentOS CD is built: BuildHost
  • OS on build host: CentOS-5.4-x86_64
  • BuildDirectory: /mnt/cdimages/CentOS-5.4-x86_64-core

Required Packages on the build host

Before you continue, you must install the following packages on your base OS.

yum -y install anaconda anaconda-runtime mkisofs cdrecord

Note: anaconda-runtime is RHEL/CENTOS specific package, and is part of the RHEL/CENTOS distribution.


Off-the-topic: On Fedora, if you want to generate custom fedora spin-offs, you can use "revisor" . It has a wizard-like GUI interface.

yum -y install revisor


Build the install tree

To create my minimal install tree, I first created a copy of the original install tree skipping the CentOS directory.

# rsync -av --exclude CentOS/  \ 
  /mnt/cdimages/CentOS-5.4-x86_64/  /mnt/cdimages/CentOS-5.4-x86_64-core/

Note: I prefer rsync, because it copies the .dot-files too. Later, we would be needing a special file named .discinfo, from the original tree.

When done, your buildtree would look like this:

[root@buildhost CentOS-5.4-x86_64-core]# pwd 
/mnt/cdimages/CentOS-5.4-x86_64-core

[root@buildhost CentOS-5.4-x86_64-core]# tree -d
.
├── images
│   ├── pxeboot
│   └── xen
├── isolinux
├── NOTES
└── repodata

6 directories
[root@buildhost CentOS-5.4-x86_64-core]# 

Now we need to copy selected RPMs from the source directory into the build directory. I created this file, by first creating a test VM using minimal kickstart, and noted the list of packages installed in it. I could not think of any easier way. The file is located in /tmp/minivm, as "installed-rpms.txt" . (Look in CENTOS Server CD project to see how I generated it. Or use the Core Packages List CentOS-5.4-x86 64 list for list of packages required for CentOS 5.4 64 bit.)

# mkdir /mnt/cdimages/CentOS-5.4-x86_64-core/CentOS/

# for filename in $(cat /tmp/minivm/installed-rpms.txt); do 
  cp -v /mnt/cdimages/CentOS-5.4-x86_64/CentOS/"${filename}.rpm" \ 
    /mnt/cdimages/CentOS-5.4-x86_64-core/CentOS/ 
done

Make sure you copy kernel-* files to the build tree. This is important, because at times, you may be using this CD in all sorts install scenarios, such as installation of bare-metal hosts, KVM hosts, XEN hosts, etc. So you would need at least two types of kernels in your installation.

comps.xml

From the original howto: Comps file. The file $RHROOT/RedHat/base/comps.xml defines the set of packages known to the installer. The set of packages described in comps.xml must be reduced to only those required. It is not necessary to remove the unused package files from $RHROOT/RedHat/RPMS/. Some packages from $RHROOT/RedHat/RPMS/ are necessary in the process of building the install CD even though they might be excluded from the custom build.

Here is an example comps.xml file from the original howto (RHEL3 based).

As I mentioned in the related article, (borrowing the sentence/term from another author), "the comps.xml has gazillion languages represented in it". I want to at least get rid of the languages stuff from the file, so I can work on it.

Here is something interesting. The original comps.xml file (CentOS-5.4) is 11418 lines.

[root@buildhost CentOS-5.4-x86_64-core]# wc -l repodata/comps.xml 
11418 repodata/comps.xml
[root@buildhost CentOS-5.4-x86_64-core]#

Interestingly, there are 8811 "xml:lang" lines in it!

[root@buildhost CentOS-5.4-x86_64-core]# grep  "xml:lang" repodata/comps.xml | wc -l
8811

The "xml:lang" lines look like this and repeat themselves a lot!

    <name xml:lang="nl">Cluster-opslag</name>
. . . 
    <description xml:lang="nl">Pakketten die ondersteuning bieden voor cluster-opslag.</description>

Lets create a "language-free" version of this file.

[root@buildhost CentOS-5.4-x86_64-core]# grep -v  "xml:lang" repodata/comps.xml > /tmp/no-lang.comps.xml

[root@buildhost CentOS-5.4-x86_64-core]# wc -l /tmp/no-lang.comps.xml 
2607 /tmp/no-lang.comps.xml

As you can see, only 2607 lines to edit! Great! It's time to edit this file, remove anything which is not related to us, and replace the repodata/comps.xml file with the new one.

Here is the (80 lines) file I ended with: Comps.xml for CentOS-5.4-x86 64 minimal install !!!

Now remove all files in repodata/* and copy your newly created file to repodata, as comps.xml .

[root@buildhost CentOS-5.4-x86_64-core]# pwd
/mnt/cdimages/CentOS-5.4-x86_64-core

[root@buildhost CentOS-5.4-x86_64-core]# rm repodata/* -f

[root@buildhost CentOS-5.4-x86_64-core]# cp /tmp/no-lang.comps.xml  repodata/comps.xml

Building the stuff

The RHEL3 based howto recommends to run the commands pkgorder, buildinstall, etc, on the build tree. This is no longer valid. A simple createrepo command takes care of everything.

Personal tools