Home Linux Community Community Blogs

Community Blogs

Portable JumpStart Environment with PXE and Kickstart


In addition to the basic requirements of DHCP, TFTP, and NFS, you will need to add another component called PXE (Pre-boot Execution Environment). Much like Sun systems use the OpenBoot firmware to allow booting from their network devices, PXE works with your x86 system to provide that same functionality. This means that before you begin, be sure your client is PXE aware. If you have older hardware, you may want to look into Etherboot as an alternative. To enable PXE on your client, simply enter your systems BIOS and turn it on.

With PXE enabled and listed as your primary boot device, your system is ready to boot from the network. Once the request is received by DHCP from your client, the server assigns an IP address and tells PXE where to find its pxelinux.0 file. This binary is then transferred through TFTP with instructions on the location of the netboot image. This file contains the data stating which kernel and initial ramdisk to load. It also gives the necessary information to NFS to mount the install directory. After all of the above is accounted for, your system will begin installing in the same manner as if you installed it from CD-ROM.

Now that you have a basic idea of the differences and similarities of performing a network install with both Solaris and Red Hat, let's put it all together.

Copying Software

Begin by copying the Red Hat software to your laptop. You may want to consider structuring the file system under the same parent directory used for Solaris. This will shorten your exports file and keep you from having to add new entries. Once you have the CD-ROM mounted, you can use dd to create the ISO image. You will need to do this for each CD-ROM:

[root@host]# dd if=/dev/cdrom of=/home/BUILD/RedHat/rhe3/rhe3-disc1.iso bs=32k

The ISO images alone are sufficient to complete the install; you do not need to unpack the software. However, this makes upgrading the software more difficult. To see the contents of the ISO, you can mount it up with a loop-back device. You will need to do this anyway to extract the correct initial ramdisk and kernel. Here is an example:

[root@host]# mount -o loop /home/BUILD/RedHat/rhe3/rhe3upd6-i386-disc1.iso /mnt

Obtaining the Initial Ramdisk and Kernel

After you have mounted up the first ISO image with the above command, you can copy the initial ramdisk and kernel to your /tftpboot directory. The initial ramdisk is called initrd.img and the kernel is vmlinuz. It's a good idea for you to rename both files with specific names related to the version of Red Hat you're installing. This will also allow you to store multiple copies of the kernel and initial ramdisk for different versions of the OS:

[root@host]# cd /mnt/images/pxeboot
[root@host]# cp initrd.img /tftpboot/rhe3-initrd.img
[root@host]# cp vmlinuz /tftpboot/rhe3-vmlinuz

The initrd.img file can be customized with specific modules to fit your needs. Here is how to take a look inside:

[root@host]# cp /tftpboot/rhe3-initrd.img /tmp
[root@host]# cd /tmp
[root@host]# gunzip -dc rhe3-initrd.img > initrd.ext2
[root@host]# mount -o loop /tmp/initrd.ext2 /mnt2

PXE Configuration

After copying the correct initrd.img and vmlinuz files, you can address the server-side requirements for PXE. As I said previously, PXE is what makes network-booting a PC possible. The first file you will need is called pxelinux.0. There are a couple of ways to obtain this file. If you already have some Red Hat systems in your environment, you can copy it from one of them. Here is how to find it after you are logged into a running system:

[root@host]# locate pxelinux.0
[root@host]# cp /usr/lib/syslinux/pxelinux.0 /tftpboot

If you don't have an existing system, you can download the file from This site will also help to answer any questions related to PXELINUX.

Creating a Netboot Image

The next file addressed in this process is the netboot image. A netboot image is basically a bootloader that determines whether your client will boot from the network or its hard drive. This file defines things such as kernel, initial ramdisk, network device, and method used for booting, as well as where to look for the kickstart configuration file. An important note about the append line within this file is that it needs to be entirely on one line. Line breaks and continuation slashes will cause problems resulting in failure of the boot process. You will need to create the directory /tftpboot/pxelinux.cfg and then create the file. I'm using vi:

[root@host]# mkdir /tftpboot/pxelinux.cfg
[root@host]# vi default.netboot-rhe3
default linux
serial 0,38400n8
label linux
kernel vmlinuz
append ksdevice=eth0 ip=dhcp console=tty0 load_initial
ramdisk=1 initrd=initrd.img network

Another important piece to this file is how it is called via TFTP. There are three methods to load this file. The first is a symbolic link of your client's MAC address:

01-00-0F-1F-AB-39-19 -> default.netboot-rhe3

The next method is similar to how we set up a Sun to load its mini-kernel, and that's with a Hex representation of your client's IP address:

0A0A0A0A -> default.netboot-rhe3

If you're going to use one netboot file for everything, just make a symbolic link called "default":

default -> default.netboot-rhe3

Kickstart Configuration

The ks.cfg file is really the guts of your Red Hat configuration. This is where you lay out your partition table, define which services will be turned on or off, configure network settings, and ultimately tell the system which software packages to load. You can also instruct the system to perform any post-install scripts you may have. There are many directives that can be used to customize your Red Hat install. When defining disks, it's important to specify SCSI vs. IDE (sda, hda). Here is a simple configuration to get you started:

# simple ks.cfg
nfs --server= -dir=/home/BUILD/RedHat/rhe3
lang en_US.UTF-8
langsupport --default en_US.UTF-8 en_US.UTF-8
keyboard us
mouse none
network --device eth0 --bootproto static --ip=
--netmask= --gateway=
--nameserver= --hostname=node1
rootpw --iscrypted $3$y606grSH$SUzlwxKc73Lhgn82yu1bnF1
firewall --disabled
authconfig --enableshadow --enablemd5
timezone America/New_York
bootloader --location=mbr
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
clearpart --all --initlabel
part /boot --fstype ext3 --size=100 --ondisk=sda
part / --fstype ext3 --size=1024 --grow --ondisk=sda
part swap --size=1000 --grow --maxsize=2000 --ondisk=sda

@ everything

wget http://foo.server/


Now that I've covered the specific pieces needed to complete a Red Hat install over the network, I will explain the additional configurations that need to be made to your existing services. As you could probably tell from the information on PXE, the service most changed in all of this is the TFTP server. There are several new files you will need to add to its directory structure as well as a new sub-directory. The files that should exist at the top level of the /tftpboot directory are pxelinux.0, rhe3-initrd.img, and rhe3-vmlinuz. Here is an example of what it might look like:

drwxr-xr-x 2 root root 152 Aug 31 2004 pxelinux.cfg
lrwxrwxrwx 1 root root 15 Aug 31 2004 initrd.img -> rhe3-initrd.img
lrwxrwxrwx 1 root root 12 Aug 31 2004 vmlinuz -> rhe3-vmlinuz

The /tftpboot/pxelinux.cfg directory is where you will put the netboot image you have created. It is also where you will need to decide how you will call that file:

lrwxrwxrwx 1 root root 20 Aug 31 2004 default -> default.netboot-rhe3

DHCP is the next service where you will need to make changes. In its simplest form, you are basically defining the TFTP server and the bootloader program. Below is a stripped-down version of the dhcpd.conf file I used for testing:

ddns-update-style none; ddns-updates off;

## PXE Stuff

deny unknown-clients;
not authoritative;

option domain-name "";
option domain-name-servers,;
option subnet-mask;

allow bootp; allow booting;

option ip-forwarding false; # No IP forwarding
option mask-supplier false; # Don't respond to ICMP Mask req

subnet netmask {
option routers;

group {
next-server; # name of your TFTP server
filename "pxelinux.0"; # name of the bootloader program

host node1 {
hardware ethernet 00:11:43:d 9:46:29;

Finally, depending on how you structured your file systems, the only other service you may need to adjust is your NFS server. If you have several versions of the OS you want to install, I recommend exporting your data at a higher level so you don't need to keep adding to your exports file. Here is the exports file I used:

/home/BUILD/RedHat *(ro,async,anonuid=0,anongid=0)

In addition to Solaris, you now have a system that is capable of installing the Red Hat operating system over the network.


Naming Network Interfaces on LInux


When the Linux kernel boots, it assigns names (eth0 etc..) to network devices in the order that it finds them. This means that two different versions of the kernel, say 2.4 and 2.6, might find the network interfaces in a diffent order. When this happens you might have to swap all the cables to get your connections to work the way you want. The proper way to do this is to name the interfaces with the nameif command (part of the net-tools).

You can install net-tools by running:

[root@host]# yum install net-tools


The nameif command can be driven from the command line, if you want to do that, then read it's man page. Another way is to set up a /etc/mactab file to relate the MAC addresses of the network cards to the names you want.

Every NIC interface in the (known) universe has a unique MAC address (Media Access Control address), which is usually expressed as a 12 digit hexadecimal number, colon-dotted in pairs for readability.

You will need to find the MAC addresses of each of your network cards. The easiest way to find these (if you didn't make a note of the MAC label when you installed the card) is to use ifconfig, each interface that is configured will report its MAC address. e.g:

[root@host]# /sbin/ifconfig

eth0 Link encap:Ethernet HWaddr 00:60:97:52:9A:94
inet addr: Bcast: Mask:
RX packets:6043 errors:0 dropped:0 overruns:0 frame:0
TX packets:6039 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:1439604 (1.3 Mb) TX bytes:509857 (497.9 Kb)
Interrupt:10 Base address:0xc800

lo Link encap:Local Loopback
inet addr: Mask:
RX packets:7218 errors:0 dropped:0 overruns:0 frame:0
TX packets:7218 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1085452 (1.0 Mb) TX bytes:1085452 (1.0 Mb)

Take note of the HWaddr, this the NIC's MAC address.

Now you can decide what you would like the NIC to be called, and set up your /etc/mactab, here's mine as an example:

# Begin /etc/mactab
# This file relates MAC addresses to interface names.
# We need this so that we can force the name we want
# even if the kernel finds the interfaces in the
# wrong order.

# eth0 under 2.4, eth1 under 2.6
cyberint 00:60:97:52:9A:94

# eth1 under 2.4, eth0 under 2.6
newint 00:A0:C9:43:8F:77

# End /etc/mactab

If you run nameif (without parameters) now you will probably get an error message, since nameif must be run when the interfaces are down.

[root@host]# nameif
cannot change name of eth0 to beannet: Device or resource busy

so, first take the interface down, then rename it:

[root@host]# ifconfig eth0 down
[root@host]# nameif
[root@host]# ifconfig eth0 up
[root@host]# ifconfig

cyberint Link encap:Ethernet HWaddr 00:60:97:52:9A:94
inet addr: Bcast: Mask: UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6617 errors:0 dropped:0 overruns:0 frame:0
TX packets:6596 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:1748349 (1.6 Mb) TX bytes:598513 (584.4 Kb)
Interrupt:10 Base address:0xc800

lo Link encap:Local Loopback
inet addr: Mask:
RX packets:9097 errors:0 dropped:0 overruns:0 frame:0
TX packets:9097 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1340480 (1.2 Mb) TX bytes:1340480 (1.2 Mb)

Using ifrename as a newer alternative

nameif has been obsoleted by the ifrename command.

To use the ifrename command first create the /etc/iftab file containing the new interface name and the corresponding MAC address like this:

ifname mac 00:16:3E:3B:B0:52

Bring the interface down and run:

[root@host]# ifrename

Then bring the interface up with the new name specified in the config file:

[root@host]# ifconfig ifname up



The sudo command gives users access to otherwise inaccessible commands. The /etc/sudoers file makes use of 3 sets of groups to allow or deny access to commands on the nodes of a network.

UbuntuOne -- Selling a sevice? Or themselves?

I recently applied for the UbuntuOne beta program. It seems interesting enough, and sounds like a good idea. But the thing is, why is Canonical trying to hide a storage server and make it seem like it's so much more? What is UbuntuOne you say. Well here's a cap:


Sync your files, share your work with others or work remotely, all with your Ubuntu computer.Sync your files, share your work with others or work remotely, all with your Ubuntu computer. 


Well, that's not very descriptive now is it. If you go to the plans page, it will give you the option of choosing a 2GB (free) or 10GB (pay) for storage. I'm not saying that this is a bad thing. I'm just trying to say that disguising a FTP storage site as a brand new idea isn't very sportsmanshiplike.

So, am I going to buy an account? Probably. But I still don't like the cover up. Oh ya, and one more thing--Linux Mint had this first, with a storage site and their own FTP for access to it. Just some thoughts for chew.


Kubuntu Karmic Alpha 1 Released

Just a quick note letting you all know that Kubuntu Karmic Alpha 1 has been released. If you are looking to contribute to an open source project, there is no better time than now. The Kubuntu team is looking for a few good contributors. We can always use supporters, documentation writers, packagers, developers, translators and more! If you are interested in contributing, I urge you to join #kubuntu-devel on

Note: This is an alpha release, so it is not for the faint of heart, it is for those of you who are a bit crazy and like living dangerously. It is not for production use at all, and if you do use it for production use and get fired, it is not our fault!


Copy files recursive with folder hierarchy (rsync method)

rsync --include-from=/tmp/include.txt --exclude-from=/tmp/exclude.txt -aRvm ./src /tmp/dest




-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)

-R, --relative              use relative path names

-m, --prune-empty-dirs      prune empty directory chains from file-list

-v, --verbose               increase verbosity




My name is jiakon.I am a graduate student of Xiamen University.My major is mathematics and I use ubuntu.In addition,I pay much attention on education and organization.


Stack Growth Direction.

#include <stdio.h>

void foo(int *);
int main(int argc, char *argv[])
int i;
void foo(int *ii)
int j;
if ( &j <>
printf("I think the stack grows down.\n");
else if ( &j > ii )
printf("I think the stack grows up.\n");
printf("I'm really confused now.\n");

Good Luck

Good luck!linux.

First post!

First post!

 Which isn't that spectacular considering only I can post here. Joined the new yesterday and I'm certainly looking forward to see how this effort evolves.

Not much of a blogger really, but will occasionally try to share my experiences using linux while pretending to actually know what I'm talking about, as well as sharing some personal thoughts while pretending that somebody else actually knows what I'm talking about.


NOOB's adventures in Linux From Scratch

 All I've got to say is if you're from the Windows world, there's no curveballs here. I breezed thru the X windows explanations all except the configuration files area without a hitch.

  Next up .... Getting things done in Linux    

Page 130 of 143

Upcoming Linux Foundation Courses

  1. LFD320 Linux Kernel Internals and Debugging
    03 Nov » 07 Nov - Virtual
  2. LFS416 Linux Security
    03 Nov » 06 Nov - Virtual
  3. LFS426 Linux Performance Tuning
    10 Nov » 13 Nov - Virtual

View All Upcoming Courses

Who we are ?

The Linux Foundation is a non-profit consortium dedicated to the growth of Linux.

More About the foundation...

Frequent Questions

Join / Linux Training / Board