===== How to Add Kernel Modules to a Red Hat Installer's Kernel ===== The following was copied verbatim from http://linux.duke.edu/~mstenner/docs/add-driver. I admit this freely, the reason for doing this is that I've had to do this a lot recently and academic pages have a habit of going away eventually. These instructions still seem to be valid for current RHEL/Fedora/Centos versions as of June 2008. On with the show... Adding a driver to a RedHat install floppy Michael D. Stenner last modified 27-February-2002 OK... This was my experience with adding a driver to the RedHat bootnet disk image. In my specific case, I was making a kickstart floppy, and so couldn't really use the normal "insert driver disk now" method. I was also unable (for irrelevant reasons) to put the driver disk contents onto the hard drive. Anyway, here were my specifics: RedHat Linux 7.1 (Seth Vidal has made this work for 7.2) I needed to add the 3c509 driver Notes: (these may not make sense until you actually start the stuff below) 1) Don't edit files in place on the loopback device. Copy out the thing you want to edit, then edit it. When done editing, DELETE the original from the loopback device. Finally, copy your edited file back in. If you don't care about WHY you should do it this way, skip to the next item. The problem is this: you don't care about the used space on the (loopback mounted) filesystem, you care about how big it is after filesystem (as a single file) is gzipped. For a dramatic example, imagine the following. If I fill my hard drive with a bunch of files containing random data, and delete those files, the hard drive is still filled with that data, it's just flagged as free (i.e. over-writable). If I were to gzip my disk image, it would still be roughly the size of the total disk capacity. In contrast, if instead of deleting (with rm) those files, I overwrite them all with zeros, the compressed disk image will be really small. You want to make sure that your edited files take up the same place in your (loopback mounted) filesystem as the originals, leaving as little unused data laying about as possible. Thanks to Seth Vidal for the tip about deleting the old files. 2) If you add more than I did, you may need to trim things down a little. That shouldn't be hard: just remove some drivers that you don't need. Be sure to edit the appropriate files to reflect the modules absence. 3) I didn't actually _try_ what I suggest in (2). You may get burned by the fact that you are actually working on a loopback-mounted filesystem: simply rm-ing something won't really remove it. gzip will still include the data (as discussed in (1)). Sorry if this isn't clear. Since I didn't really have this problem, I don't want to spout off too much about it. I would love to hear from people who know about these issues. 4) I typed this up after figuring it all out. As a result, the commands I have here have not actually been tested verbatim. There may be typos. Please let me know if you find any :) Below are the commands you need to use. All of these should be ready for cut and paste. Do not just cut and paste the whole thing, though, since you need to do things like swap floppies and do the happy-bit dance in the middle. I hope that you find this useful! -Michael mstenner@phy.duke.edu ---- ################################################### # First, get the drivers we need ################################################### # download driver image to drivers.img # insert blank disk cat drivers.img > /dev/fd0 mount /mnt/floppy mkdir drivers cp /mnt/floppy/* drivers/ umount /mnt/floppy cd drivers gzip -d < modules.cgz | cpio -i --make-directories # now look in modules.dep to see if you're going to # need to get any other modules. # find the entries for each of the modules you need # in modules.dep, modinfo and pcitable # the actual modules should be in a dir called 2.4.2-2BOOT # (or something similar - will vary with version) cd .. ################################################### # Now, get the files from the bootnet image # that we must edit ################################################### # download bootnet image to bootnet.img # insert blank disk cat bootnet.img > /dev/fd0 mount /mnt/floppy mkdir initrd-mod cp /mnt/floppy/initrd.img initrd-mod/initrd.img.orig.gz cd initrd-mod/ # pwd = initrd-mod gzip -d < initrd.img.orig.gz > initrd.img.orig cp initrd.img.orig initrd.img.working mkdir loop mount -t ext2 -o loop initrd.img.working loop cd loop/modules # pwd = initrd-mod/loop/modules mkdir ../../modules-mod cp * ../../modules-mod/ cd ../../modules-mod/ # pwd = initrd-mod ################################################### # Back up these files and edit them ################################################### for FILE in *; do cp $FILE $FILE.orig; done # now edit each of (module-info modules.dep pcitable) that you # need to, adding the entries from the corresponding files on the # driver disk gzip -d < modules.cgz | cpio -i --make-directories # this should make a directory called 2.4.2-2BOOT (depending on # version). Put each of the modules that you need from the driver # disk into this directory. For example: cp ../../drivers/2.4.2-2BOOT/3c509.o 2.4.2-2BOOT/ # rebuild the modules.cgz file with find 2.4.2-2BOOT | cpio -o -H crc | gzip -9 > modules.cgz ################################################### # Put our changes back into the floppy ################################################### # copy each of the files that you changed back into # initrd-mod/loop/modules/ # this includes, of course, modules.cgz cd .. # pwd = initrd-mod umount loop gzip -9 < initrd.img.working > initrd.img.new cp initrd.img.new /mnt/floppy/initrd.img umount /mnt/floppy ============================================================