home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 August / PCWorld_1999-08_cd.bin / doc / HOWTO / KickStart-HOWTO < prev    next >
Text File  |  1999-03-02  |  41KB  |  1,651 lines

  1.   RedHat Linux KickStart HOWTO
  2.   Martin Hamilton <martinh@gnu.org>
  3.   v0.2, 11 January 1999
  4.  
  5.   This HOWTO briefly describes how to use the RedHat Linux KickStart
  6.   system to rapidly install large numbers of identical Linux boxes.  For
  7.   advanced users, we describe how to modify the KickStart installation
  8.   procedure to do your own thing, and give a quick guide to building RPM
  9.   packages of your own.
  10.   ______________________________________________________________________
  11.  
  12.   Table of Contents
  13.  
  14.  
  15.   1. Copyright
  16.  
  17.   2. Homepage
  18.  
  19.   3. Introduction
  20.  
  21.   4. Prerequisites
  22.  
  23.   5. Setting up a boot floppy
  24.  
  25.   6. The KickStart config file
  26.  
  27.      6.1 System info
  28.      6.2 Packages to install
  29.      6.3 Post-installation shell commands
  30.  
  31.   7. Installation itself
  32.  
  33.   8. Mounting the boot/supp disks
  34.  
  35.   9. Modifying the RedHat installer
  36.  
  37.   10. FAQs/Wish list
  38.  
  39.   11. Credits
  40.  
  41.   12. Appendix A - Configuring BOOTP/DHCP and NFS
  42.  
  43.   13. Appendix B - Making your own RPMs
  44.  
  45.   14. Appendix C - Munging your own RPMs into the distribution
  46.  
  47.  
  48.  
  49.   ______________________________________________________________________
  50.  
  51.   1.  Copyright
  52.  
  53.  
  54.   Copyright (c) 1998 Martin Hamilton, All rights reserved.  This is free
  55.   documentware; you can redistribute it and/or modify it under the terms
  56.   of version 2 or later of the GNU General Public License
  57.   <http://www.gnu.org/copyleft/gpl.html>.
  58.  
  59.  
  60.  
  61.  
  62.   2.  Homepage
  63.  
  64.  
  65.   If you got this document from a Linux HOWTO mirror site or a CD-ROM,
  66.   you might want to check back to the KickStart HOWTO home page
  67.   <http://wwwcache.ja.net/dev/kickstart/> to see if there's a newer
  68.   version around.
  69.  
  70.  
  71.  
  72.  
  73.   3.  Introduction
  74.  
  75.  
  76.   RedHat Linux version 5 comes with a a little-known (and until now, not
  77.   hugely documented) feature called KickStart.  This lets you automate
  78.   most/all of a RedHat Linux installation, including:
  79.  
  80.  
  81.  
  82.   ╖  Language selection
  83.  
  84.   ╖  Network configuration and distribution source selection
  85.  
  86.   ╖  Keyboard selection
  87.  
  88.   ╖  Boot loader installation (e.g. lilo)
  89.  
  90.   ╖  Disk partitioning and filesystem creation
  91.  
  92.   ╖  Mouse selection
  93.  
  94.   ╖  X Window system server configuration
  95.  
  96.   ╖  Timezone selection
  97.  
  98.   ╖  Selection of an (initial) root password
  99.  
  100.   ╖  Which packages to install
  101.  
  102.  
  103.   Eagle eyed RedHat users will probably have realised by now that these
  104.   are essentially the main steps involved in the manual installation of
  105.   a RedHat Linux system.  KickStart makes it possible for you to script
  106.   the regular installation process, by putting the information you would
  107.   normally type at the keyboard into a configuration file.
  108.  
  109.  
  110.   But wait - there's more :-)
  111.  
  112.  
  113.   Having finished the normal installation process, KickStart also lets
  114.   you specify a list of shell level commands which you would like to be
  115.   executed.  This means that you can automatically install extra local
  116.   software not distributed as part of RedHat Linux (yes, there are even
  117.   more free software programs than the ones you get with the RedHat
  118.   distribution.  Some can't be distributed by RedHat on legal grounds,
  119.   e.g. the ssh and PGP encryption systems) and carry out any tidying up
  120.   you may need to do in order to get a fully operational system.
  121.  
  122.  
  123.  
  124.  
  125.   4.  Prerequisites
  126.  
  127.  
  128.   There are two approaches to a KickStart install - one is to simply
  129.   copy your KickStart configuration file to a RedHat boot floppy.  The
  130.   other is to use a regular boot floppy and get your KickStart config
  131.   file off the network.
  132.  
  133.   In both cases, you'll need:
  134.  
  135.  
  136.   1. Intel (i386) class machines - KickStart appears to only work on
  137.      these at the time of writing.
  138.  
  139.   2. KickStart config file - we'll talk about this in the next section.
  140.  
  141.   3. RedHat boot disk - preferably from the updates directory, to take
  142.      advantage of any fixes/driver updates.
  143.  
  144.   4. DNS entries for the IP addresses you'll be using - optional, but
  145.      will stop the installation from prompting you for your machine's
  146.      domain name.
  147.  
  148.  
  149.   If you want to fetch your config file over the network, you'll need to
  150.   export it via NFS - this is the only access method supported at the
  151.   moment.  The config file lets you specify a different NFS server to
  152.   fetch the RedHat distribution itself from.
  153.  
  154.  
  155.   You can configure a static IP address for your machine - e.g. a
  156.   special one reserved for KickStart installations.  Alternatively, if
  157.   you don't want to hard code an IP address in the config file you can
  158.   tell KickStart to use a BOOTP/DHCP server to fetch this.  Some servers
  159.   will allocate new addresses in a given range automatically, e.g. the
  160.   CMU BOOTP server with dynamic addressing extensions
  161.   <ftp://ftp.ntplx.net/pub/networking/bootp>.
  162.  
  163.  
  164.   More information on NFS and BOOTP/DHCP is in Appendix A.
  165.  
  166.  
  167.  
  168.  
  169.   5.  Setting up a boot floppy
  170.  
  171.  
  172.   Essentially, all you have to do is copy your KickStart config file to
  173.   /ks.cfg on the RedHat boot floppy, e.g.
  174.  
  175.  
  176.  
  177.  
  178.          mcopy ks.cfg a:
  179.  
  180.  
  181.  
  182.  
  183.  
  184.   However - the RedHat boot floppy is pretty full, and you may find that
  185.   you have to delete some of the other files to make room for the
  186.   KickStart config file.  I was able to make enough room for mine by
  187.   deleting the various message files normally displayed by the SYSLINUX
  188.   boot loader, e.g.
  189.  
  190.  
  191.  
  192.  
  193.          mdel a:\*.msg
  194.  
  195.  
  196.  
  197.  
  198.  
  199.   Another approach would be to throw away the drivers for some of the
  200.   hardware you don't have - see the section on modifying the boot floppy
  201.   below.
  202.  
  203.  
  204.   You may also want to edit syslinux.cfg, the SYSLINUX config file.
  205.   This also lives in the top level directory of the RedHat boot floppy.
  206.   For instance, the following syslinux.cfg will cause KickStart mode to
  207.   be entered into automatically as the machine boots up, without the
  208.   normal delay:
  209.  
  210.  
  211.  
  212.  
  213.          default ks
  214.          prompt 0
  215.          label ks
  216.            kernel vmlinuz
  217.            append ks=floppy initrd=initrd.img
  218.  
  219.  
  220.  
  221.  
  222.  
  223.   Note that you almost probably want to base your boot and supplementary
  224.   floppies on the most recent disk images available in the updates/i386
  225.   on your local RedHat mirror site.  Older images may be buggy or have
  226.   driver support for less hardware.
  227.  
  228.  
  229.  
  230.  
  231.   6.  The KickStart config file
  232.  
  233.  
  234.   There are three main sections to the config file:
  235.  
  236.  
  237.  
  238.   1. System info, e.g. disk partitioning and network config
  239.  
  240.   2. RedHat packages to install
  241.  
  242.   3. Post-installation shell commands to run
  243.  
  244.  
  245.   There are some other possibilities which we won't talk about here, but
  246.   might work.  For more information check out the sample KickStart
  247.   config in misc/src/install/ks.samp and doc/README.ks under the top
  248.   level i386 RedHat distribution directory on your CD-ROM or local
  249.   RedHat mirror site.
  250.  
  251.  
  252.  
  253.  
  254.   6.1.  System info
  255.  
  256.  
  257.   The available directives which I've been using are:
  258.  
  259.  
  260.  
  261.      lang
  262.         Language configuration, e.g. for English
  263.  
  264.  
  265.      lang en
  266.  
  267.  
  268.  
  269.  
  270.      network
  271.         Network configuration, e.g. to use BOOTP/DHCP
  272.  
  273.  
  274.           network --bootp
  275.  
  276.  
  277.  
  278.  
  279.      nfs
  280.         NFS server and directory to install from, e.g.
  281.  
  282.  
  283.           nfs --server chicken.swedish-chef.org /mnt/cdrom
  284.  
  285.  
  286.  
  287.  
  288.      to use the NFS server chicken.swedish-chef.org and try to mount the
  289.      RedHat distribution from the directory /mnt/cdrom.
  290.  
  291.      keyboard
  292.         Select keyboard type, e.g. for UK keyboards
  293.  
  294.  
  295.           keyboard uk
  296.  
  297.  
  298.  
  299.  
  300.      zerombr
  301.         Clear the Master Boot Record - removes any existing operating
  302.         system boot loader from your disk
  303.  
  304.      clearpart
  305.         Clear existing partitions - e.g. to remove all existing disk
  306.         partitions prior to installation
  307.  
  308.  
  309.           clearpart --all
  310.  
  311.  
  312.  
  313.  
  314.      part
  315.         Partition the disk, e.g. to make a root filesystem of 500MB
  316.  
  317.  
  318.           part / --size 500
  319.  
  320.  
  321.  
  322.  
  323.      install
  324.         Make a fresh installation of RedHat Linux.
  325.  
  326.      mouse
  327.         Set the mouse being used, e.g. for a PS/2 or compatible "bus
  328.         mouse"
  329.  
  330.  
  331.      mouse ps/2
  332.  
  333.  
  334.  
  335.  
  336.      timezone
  337.         Set the timezone, e.g. for local time in the UK
  338.  
  339.  
  340.           timezone --utc Europe/London
  341.  
  342.  
  343.  
  344.  
  345.      rootpw
  346.         Set the initial root password, based on a previously derived
  347.         encrypted password
  348.  
  349.  
  350.           rootpw --iscrypted XaacoeGPmf/A.
  351.  
  352.  
  353.  
  354.  
  355.      lilo
  356.         Install the LILO boot loader, e.g. in the Master Boot Record
  357.  
  358.  
  359.           lilo --location mbr
  360.  
  361.  
  362.  
  363.  
  364.      %packages
  365.         Packages to install - see below.
  366.  
  367.      %post
  368.         Post-installation shell commands - see below.
  369.  
  370.  
  371.   Note that the directory where KickStart is looking for the RedHat
  372.   distribution should have a subdirectory RedHat, which contains the
  373.   RedHat distribution tree for the platform in question.  In the above
  374.   example, we should see something like the following files and
  375.   directories:
  376.  
  377.  
  378.  
  379.  
  380.        /mnt/cdrom/RedHat
  381.        /mnt/cdrom/RedHat/base
  382.        /mnt/cdrom/RedHat/contents
  383.        /mnt/cdrom/RedHat/i386
  384.        /mnt/cdrom/RedHat/instimage
  385.        /mnt/cdrom/RedHat/RPMS
  386.        /mnt/cdrom/RPM-PGP-KEY
  387.  
  388.  
  389.  
  390.  
  391.  
  392.   If you're installing off a CD-ROM rather than off the network, the
  393.   contents should look something like this:
  394.  
  395.  
  396.  
  397.        RedHat
  398.        RedHat/base
  399.        RedHat/contents
  400.        RedHat/i386
  401.        RedHat/instimage
  402.        RedHat/RPMS
  403.        RPM-PGP-KEY
  404.  
  405.  
  406.  
  407.  
  408.  
  409.   If you have the RedHat distribution for multiple architectures (e.g.
  410.   on an NFS server - they're too big to fit more than one architecture's
  411.   version onto a single CD-ROM), you'll notice that each distribution
  412.   has the same files and directories under a subdirectory, e.g.
  413.  
  414.  
  415.  
  416.  
  417.        alpha/RPM-PGP-KEY
  418.        i386/RPM-PGP-KEY
  419.        sparc/RPM-PGP-KEY
  420.  
  421.  
  422.  
  423.  
  424.  
  425.   There should be a file architecture/Redhat/architecture, e.g.
  426.   i386/Redhat/i386.
  427.  
  428.  
  429.   If you want to create your own encrypted passwords, it's very easy
  430.   using Perl, e.g.
  431.  
  432.  
  433.  
  434.  
  435.        % perl -e 'print crypt("schmurrdegurr", "Xa") . "\n";'p
  436.  
  437.  
  438.  
  439.  
  440.  
  441.   Other options (or mooted options), which I've not tried:
  442.  
  443.  
  444.  
  445.      cdrom
  446.         Install off CD-ROM rather than network.
  447.  
  448.      device
  449.         Explicitly declare device details, e.g.
  450.  
  451.  
  452.           device ethernet 3c509 --opts "io=0x330, irq=7"
  453.  
  454.  
  455.  
  456.  
  457.      Alternative values of device include scsi for SCSI controllers and
  458.      cdrom for proprietary CD-ROM drives.
  459.  
  460.      upgrade
  461.         Upgrade an existing installation rather than make a fresh
  462.         installation.
  463.      xconfig
  464.         Configure X Window server, graphics card and monitor.  e.g.
  465.  
  466.  
  467.           xconfig --server "Mach64" --monitor "tatung cm14uhe"
  468.  
  469.  
  470.  
  471.  
  472.  
  473.   I've not delved too deeply into this last one, because I'm not ever
  474.   planning to run X on the console of any of my KickStarted machines.
  475.   I'm told that running xconfig within KickStart itself is a bit flaky,
  476.   but the same functionality is also available from the command line via
  477.   Xconfigurator - so you might be best off leaving this to the post-
  478.   installation script.
  479.  
  480.  
  481.   Here's how this first part of a KickStart config file looks when we
  482.   put all the bits together:
  483.  
  484.  
  485.  
  486.  
  487.        lang en
  488.        network --static --ip 198.168.254.253 --netmask 255.255.255.0
  489.          --gateway 198.168.254.1 --nameserver 198.168.254.2
  490.        nfs --server chicken.swedish-chef.org /mnt/cdrom
  491.        keyboard uk
  492.        zerombr yes
  493.        clearpart --all
  494.        part / --size 500
  495.        part swap --size 120
  496.        install
  497.        mouse ps/2
  498.        timezone --utc Europe/London
  499.        rootpw --iscrypted XaacoeGPmf/A.
  500.        lilo --location mbr
  501.  
  502.  
  503.  
  504.  
  505.  
  506.   Note that some of the RedHat documentation refers to an invocation of
  507.   the network directive which doesn't actually work in practice: network
  508.   --option.  The correct invocation is to put network followed by
  509.   --static, --bootp or --dhcp.  Be aware that the BOOTP and DHCP options
  510.   are different - to the extent that they even use different code.
  511.  
  512.  
  513.   You can add the --grow parameter to a part directive to indicate that
  514.   it's OK to grow the partition beyond the size you specify.  It
  515.   probably only makes sense to have one partition tagged with --grow.
  516.  
  517.  
  518.  
  519.  
  520.   6.2.  Packages to install
  521.  
  522.  
  523.   The start of the packages section of the KickStart config file is
  524.   indicated by the presence of a %packages directive on a line of its
  525.   own.  This is followed by one or both of two types of package
  526.   specifier - individual packages may be installed by giving the name of
  527.   their RPM (excluding the version and platform information), and groups
  528.   of packages may be installed by giving their group name.
  529.   Here's a sample packages section for a KickStart config file:
  530.  
  531.  
  532.  
  533.        %packages
  534.        @ Base
  535.        netkit-base
  536.        bind-utils
  537.        ncftp
  538.        rdate
  539.        tcp_wrappers
  540.        traceroute
  541.        cmu-snmp
  542.  
  543.  
  544.  
  545.  
  546.  
  547.   So, what are these groups ?  Well, there are a number of groups
  548.   defined by default in a file called base/comps under the RedHat
  549.   distribution's top level directory.  Here are the ones which were
  550.   current at the time of writing:
  551.  
  552.  
  553.  
  554.   ╖  Base
  555.  
  556.   ╖  Printer Support
  557.  
  558.   ╖  X Window System
  559.  
  560.   ╖  Mail/WWW/News Tools
  561.  
  562.   ╖  DOS/Windows Connectivity
  563.  
  564.   ╖  File Managers
  565.  
  566.   ╖  Graphics Manipulation
  567.  
  568.   ╖  X Games
  569.  
  570.   ╖  Console Games
  571.  
  572.   ╖  X multimedia support
  573.  
  574.   ╖  Console Multimedia
  575.  
  576.   ╖  Print Server
  577.  
  578.   ╖  Networked Workstation
  579.  
  580.   ╖  Dialup Workstation
  581.  
  582.   ╖  News Server
  583.  
  584.   ╖  NFS Server
  585.  
  586.   ╖  SMB (Samba) Connectivity
  587.  
  588.   ╖  IPX/Netware(tm) Connectivity
  589.  
  590.   ╖  Anonymous FTP/Gopher Server
  591.  
  592.   ╖  Web Server
  593.  
  594.  
  595.   ╖  DNS Name Server
  596.  
  597.   ╖  Postgres (SQL) Server
  598.  
  599.   ╖  Network Management Workstation
  600.  
  601.   ╖  TeX Document Formatting
  602.  
  603.   ╖  Emacs
  604.  
  605.   ╖  Emacs with X windows
  606.  
  607.   ╖  C Development
  608.  
  609.   ╖  Development Libraries
  610.  
  611.   ╖  C++ Development
  612.  
  613.   ╖  X Development
  614.  
  615.   ╖  Extra Documentation
  616.  
  617.  
  618.   You'll notice that they correspond to the various configurations which
  619.   you're prompted for during a manual installation.  Note that some of
  620.   the packages in a given package group are duplicated in other groups,
  621.   and that you can install multiple groups of packages without this
  622.   causing problems.  Each group's entry in the comps listing looks
  623.   similar to this:
  624.  
  625.  
  626.  
  627.  
  628.        0 Extra Documentation
  629.        sag
  630.        lpg
  631.        howto
  632.        faq
  633.        man-pages
  634.        end
  635.  
  636.  
  637.  
  638.  
  639.  
  640.   It seems that groups with a 1 next to their name (the first line
  641.   above) are selected for installation by default.  You can customise
  642.   the Linux installation process even further by creating your own
  643.   groups or redefine existing ones by editing this file.
  644.  
  645.  
  646.  
  647.  
  648.   6.3.  Post-installation shell commands
  649.  
  650.  
  651.   This is probably the best feature of all, and something which there is
  652.   no direct equivalent to in the manual installation process.  What we
  653.   can do here is specify a sequence of shell level commands which should
  654.   be executed after the main installation (disk partitioning, package
  655.   installation, and so on) is complete.
  656.  
  657.  
  658.   The beginning of this section is signified by the %post directive in
  659.   the KickStart config file.  In what follows you can take advantage of
  660.   all of the utilities which have been installed on your newly built
  661.   Linux system, e.g.
  662.  
  663.  
  664.  
  665.  
  666.        %post
  667.        ln -s /etc/rc.d/init.d /etc/init.d
  668.        ln -s /etc/rc.d/rc.local /etc/rc.local
  669.        ln -s /usr/bin/md5sum /usr/bin/md5
  670.        ln -s /usr/bin/perl /usr/local/bin/perl
  671.        chmod ug-s /bin/linuxconf
  672.        mkdir /var/tmp/tmp
  673.        perl -spi -e 's!image=/boot/vmlinuz-.*!image=/boot/vmlinuz!' /etc/lilo.conf
  674.        rm /etc/rc.d/rc*.d/*sendmail
  675.  
  676.  
  677.  
  678.  
  679.  
  680.   You can also use I/O redirection and here documents:
  681.  
  682.  
  683.  
  684.  
  685.        cat <<EOF >>/etc/passwd
  686.        squid:*:102:3500:Squid Proxy:/usr/squid:/bin/bash
  687.        EOF
  688.  
  689.        cat <<EOF >>/etc/group
  690.        cache:x:3500:
  691.        EOF
  692.  
  693.  
  694.  
  695.  
  696.  
  697.   Modify the run-time startup scripts:
  698.  
  699.  
  700.  
  701.  
  702.        cat <<EOF >>/etc/rc.local
  703.        echo 8192 > /proc/sys/kernel/file-max
  704.        echo 32768 > /proc/sys/kernel/inode-max
  705.  
  706.        [ -x /usr/sbin/sshd ] && /usr/sbin/sshd
  707.        [ -x /usr/sbin/cfd ] && /usr/sbin/cfd
  708.  
  709.        EOF
  710.  
  711.  
  712.  
  713.  
  714.  
  715.   Set up crontab entries:
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.   cat <<EOF >/tmp/crontab.root
  728.   # Keep the time up to date
  729.   0,15,30,45 * * * * /usr/sbin/ntpdate -s eggtimer 2>&1 >/dev/null
  730.   # Recycle Exim log files
  731.   1 0 * * * /usr/exim/bin/exicyclog
  732.   # Flush the Exim queue
  733.   0,15,30,45 * * * * /usr/exim/bin/exim -q
  734.   EOF
  735.  
  736.   crontab /tmp/crontab.root
  737.   rm /tmp/crontab.root
  738.  
  739.  
  740.  
  741.  
  742.  
  743.   And even install other RPMs which you made yourself:
  744.  
  745.  
  746.  
  747.  
  748.        rpm -i ftp://chicken.swedish-chef.org/rpms/squid.rpm
  749.        rpm -i ftp://chicken.swedish-chef.org/rpms/ssh.rpm
  750.        rpm -i ftp://chicken.swedish-chef.org/rpms/exim.rpm
  751.        rpm -i ftp://chicken.swedish-chef.org/rpms/cfengine.rpm
  752.        rpm -i ftp://chicken.swedish-chef.org/rpms/linux.rpm
  753.  
  754.        ssh-keygen -b 1024 -f /etc/ssh_host_key -N ""
  755.        depmod -a
  756.  
  757.  
  758.  
  759.  
  760.  
  761.   Note that you can achieve the same effect by making your own RPMs
  762.   containing the commands you want executed - see below for more
  763.   information.  Give them a carefully chosen name and you can force them
  764.   to be installed first (e.g. name starts with 'aaa') or last (e.g.
  765.   name starts with 'zzz').
  766.  
  767.  
  768.   Be aware that a less painful way of doing root crontab entries is to
  769.   create them as files in one or more of the directories
  770.   /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly and
  771.   /etc/cron.monthly.
  772.  
  773.  
  774.   More information about making your own RPMs is available in Appendix
  775.   B.
  776.  
  777.  
  778.  
  779.  
  780.   7.  Installation itself
  781.  
  782.  
  783.   Boot the to-be-installed machine off your RedHat boot floppy as usual,
  784.   but instead of pressing RETURN at the SYSLINUX prompt, type linux ks.
  785.  
  786.  
  787.   If you're lucky, this will be all you have to type!
  788.  
  789.  
  790.   If you customised your RedHat boot floppy as outlined above, you won't
  791.   even need to do this bit :-)
  792.  
  793.   Since we're really just automating the normal steps involved in a
  794.   RedHat installation, the normal dialogs may appear if/when KickStart
  795.   gets confused about what to do next.  The most likely case is that
  796.   your network interface won't be detected automatically, and you'll be
  797.   prompted for its IRQ and I/O address space.  KickStart tends to need
  798.   help for ISA bus cards, but detects PCI bus cards automatically.
  799.  
  800.  
  801.   You can keep an eye on what KickStart is doing by by switching virtual
  802.   consoles as usual:
  803.  
  804.  
  805.  
  806.   ╖  Alt-F1 - installation dialog
  807.  
  808.   ╖  Alt-F2 - shell prompt
  809.  
  810.   ╖  Alt-F3 - install log (messages from install program)
  811.  
  812.   ╖  Alt-F4 - system log (messages from kernel, etc.)
  813.  
  814.   ╖  Alt-F5 - other messages
  815.  
  816.  
  817.  
  818.  
  819.   8.  Mounting the boot/supp disks
  820.  
  821.  
  822.   The RedHat boot disk boot.img is in MS-DOS format, using the SYSLINUX
  823.   program to boot up.  The supplementary disk supp.img is a Linux ext2
  824.   filesystem.  If you have support for the loopback filesystem in your
  825.   Linux kernel, you can mount both of these files in your filesystem and
  826.   hack at them:
  827.  
  828.  
  829.  
  830.  
  831.        # mkdir -p /mnt/boot /mnt/supp
  832.        # mount -o loop -t msdos boot.img /mnt/boot
  833.        # mount -o loop supp.img /mnt/supp
  834.  
  835.  
  836.  
  837.  
  838.  
  839.   Now you should be able to see and manipulate the files on the boot and
  840.   supplementary disk under /mnt/boot and /mnt/supp respectively.  Phew!
  841.   Note that older versions of mount may not be able to handle the -o
  842.   loop option.  In these cases you'll need to explicitly use losetup to
  843.   configure the loopback device for each file, e.g.
  844.  
  845.  
  846.  
  847.  
  848.        # losetup /dev/loop0 boot.img
  849.        # mount -t msdos /dev/loop0 /mnt/boot
  850.  
  851.  
  852.  
  853.  
  854.  
  855.   You might also need to explicitly use the -t ext2 option when mounting
  856.   an ext2 filesystem like the one on the supplementary disk.  But, it
  857.   looks like people with modern Linux distributions shouldn't have to
  858.   worry about this.
  859.   Of course, if you don't want to mess around too much, you can cut a
  860.   corner and manipulate actual floppy disks rather than these floppy
  861.   disk images.  If time is important, you'll probably prefer to use the
  862.   loopback devices, since you can hack around with the disk images
  863.   without incurring the latency associated with a genuine floppy disk
  864.   read/write.
  865.  
  866.  
  867.  
  868.  
  869.   9.  Modifying the RedHat installer
  870.  
  871.  
  872.   If you want to mess around with the installation procedure itself, the
  873.   source code can be found on the RedHat CD-ROM or your local RedHat
  874.   mirror site.  It's in misc/src/install under the i386 distribution top
  875.   level directory.
  876.  
  877.  
  878.   If you examine the RedHat boot disk you'll see that, in addition to
  879.   the Linux kernel vmlinuz, there's a large file initrd.img:
  880.  
  881.  
  882.  
  883.  
  884.        - -rwxr-xr-x   1 root     root          559 May 11 15:48 boot.msg
  885.        - -rwxr-xr-x   1 root     root          668 May 11 15:48 expert.msg
  886.        - -rwxr-xr-x   1 root     root          986 May 11 15:48 general.msg
  887.        - -rwxr-xr-x   1 root     root       968842 May 11 15:48 initrd.img
  888.        - -rwxr-xr-x   1 root     root         1120 May 11 15:48 kickit.msg
  889.        - -r-xr-xr-x   1 root     root         5352 May 11 15:48 ldlinux.sys
  890.        - -rwxr-xr-x   1 root     root          875 May 11 15:48 param.msg
  891.        - -rwxr-xr-x   1 root     root         1239 May 11 15:48 rescue.msg
  892.        - -rwxr-xr-x   1 root     root          402 May 11 15:48 syslinux.cfg
  893.        - -rwxr-xr-x   1 root     root       444602 May 11 15:48 vmlinuz
  894.  
  895.  
  896.  
  897.  
  898.  
  899.   You guessed it, this is another ext2 filesystem saved as a file - -
  900.   but with a twist.  It's actually compressed as well.  You can
  901.   uncompress it and then mount the result, e.g.
  902.  
  903.  
  904.  
  905.  
  906.        # gzip -dc /mnt/boot/initrd.img >/tmp/initrd.ext2
  907.        # mkdir /mnt/initrd
  908.        # mount -o loop /tmp/initrd.ext2 /mnt/initrd
  909.  
  910.  
  911.  
  912.  
  913.  
  914.   Probably the most important part of this filesystem is the collection
  915.   of loadable kernel modules which are included with the boot disk.  If
  916.   you need to merge in a new version of a driver, you'll need to either
  917.   replace vmlinuz with a new kernel which has this statically linked, or
  918.   replace it in the modules collection.  What's more, you may need to
  919.   throw other modules away to make room.
  920.  
  921.  
  922.   The modules collection is the file modules/modules.cgz.  Wondering
  923.   what that might be ?  It's actually a compressed cpio archive, believe
  924.   it or not!  And you thought nobody used cpio any more...  Actually RPM
  925.   itself uses cpio internally, too.  Here's how to hack around with it:
  926.  
  927.  
  928.  
  929.  
  930.        # gzip -dc /mnt/initrd/modules/modules.cgz >/tmp/modules.cpio
  931.        # cpio -itv <modules.cpio >modules.listing
  932.        # mkdir modules
  933.        # cpio -idumv <../modules.cpio
  934.  
  935.  
  936.  
  937.  
  938.  
  939.   I don't believe that there is currently a way under Linux (at least in
  940.   mainstream distributions) to transparently access compressed
  941.   filesystems.  Let me know if you know better!
  942.  
  943.  
  944.   If you change anything, remember to:
  945.  
  946.  
  947.  
  948.   1. Use cpio to recreate the archive.  How to do this is left as an
  949.      exercise for the reader...
  950.  
  951.   2. Use gzip to compress the resulting archive.
  952.  
  953.   3. Copy it to /mnt/initrd, or wherever you put the uncompressed
  954.      initrd.img archive.
  955.  
  956.   4. Unmount /mnt/initrd (or whatever you called it).
  957.  
  958.   5. Compress the new initrd.img using gzip again.
  959.  
  960.   6. Copy the resulting archive onto the boot disk image -
  961.      /mnt/boot/initrd.img in our example.
  962.  
  963.   7. Unmount the boot disk image, e.g. /mnt/boot.
  964.  
  965.  
  966.   Finally, you can now create new boot floppies using this modified boot
  967.   disk setup, e.g.
  968.  
  969.  
  970.  
  971.  
  972.        # cat boot.img >/dev/fd0
  973.  
  974.  
  975.  
  976.  
  977.  
  978.  
  979.  
  980.   10.  FAQs/Wish list
  981.  
  982.  
  983.   Q: After KickStart installation, my machine won't boot up.  The BIOS
  984.   complains with a message like Missing operating system.
  985.  
  986.  
  987.   A: Sounds like the partition with the root filesystem on isn't
  988.   bootable.  Use fdisk to toggle its bootable status.
  989.  
  990.  
  991.   Q: After the floppy boots, I get the message: Error opening files for
  992.   kickstart copy: File exists.
  993.  
  994.  
  995.   A: Use a more recent version of boot.img and supp.img - look in the
  996.   updates directory of your local RedHat mirror site.  There was a bug
  997.   in some older versions of these for RedHat 5.1.
  998.  
  999.  
  1000.   Q: Can you have all outstanding patches (update RPMs) applied
  1001.   automatically too ?  How ?
  1002.  
  1003.  
  1004.   A1: Copy the RPMs you want installing to the RPMS directory from which
  1005.   the installation is going to take place, get rid of the older RPMs,
  1006.   and update the file RedHat/base/hdlist with the new RPM details.  See
  1007.   Appendix C for a script from Eric Doutreleau to do this for you.  If
  1008.   you do this yourself, remember to run genhdlist afterwards!
  1009.  
  1010.  
  1011.   A2: Try this Perl script: patchup
  1012.   <http://wwwcache.ja.net/dev/patchup/>.  This compares the RPMs your
  1013.   system has installed with those in a nominated directory and reports
  1014.   on the ones it thinks need updating.  It can even install them for you
  1015.   if you trust it to.
  1016.  
  1017.  
  1018.   A3: rpm2hml <http://rufus.w3.org/linux/rpm2html/> has a much more
  1019.   powerful (12MB of C code vs. a page of Perl!) version of A2.
  1020.  
  1021.  
  1022.   Q: A single config file on the install server for all of the clients,
  1023.   perhaps as a fallback after trying IPADDR-kickstart ?
  1024.  
  1025.  
  1026.   A1: Use the BOOTP/DHCP 'boot file' parameter bf to set the filename.
  1027.  
  1028.  
  1029.   A2: Add a a record bf=/kickstart/ks.cfg to the relevant entry in
  1030.   /etc/bootptab.
  1031.  
  1032.   Q: More flexibility when things go wrong - e.g. prompt for alternate
  1033.   locations if distribution not found on CD-ROM.
  1034.  
  1035.  
  1036.   A: ?
  1037.  
  1038.  
  1039.   Q: Explicit exclusion of packages - e.g. everything apart from
  1040.   sendmail.
  1041.  
  1042.  
  1043.   A: Rebuild the BASE package without sendmail.
  1044.  
  1045.  
  1046.   Q: Choose which services are started automatically on boot-up by the
  1047.   run-level scripts under /etc/rc.d/.
  1048.  
  1049.  
  1050.   A: The chkconfig utility lets you configure which services are run
  1051.   automatically on boot-up.  You can run this in your post-installation
  1052.   script section, e.g. to run ypbind in run levels 3, 4 and 5:
  1053.  
  1054.  
  1055.  
  1056.  
  1057.   chkconfig --level 345 ypbind on
  1058.  
  1059.  
  1060.  
  1061.  
  1062.  
  1063.   and it will start the ypbind level on the 345 level.
  1064.  
  1065.   Q: When executing the shell commands in the %post section, bring any
  1066.   output up in another virtual console rather than overwriting the main
  1067.   screen.  Could be done in the shell commands section using open?.
  1068.  
  1069.  
  1070.   A: No problem - do something like this:
  1071.  
  1072.  
  1073.  
  1074.  
  1075.          exec >/dev/tty5
  1076.  
  1077.  
  1078.  
  1079.  
  1080.  
  1081.   Q: Does the filesystem creation code check for bad blocks ?
  1082.  
  1083.  
  1084.   A: If you switch to the virtual console where the filesystem creation
  1085.   output is being displayed, you won't see any mention of the
  1086.  
  1087.  
  1088.   Q: Can I arrange things so some of my machines are configured
  1089.   differently from others ?
  1090.  
  1091.  
  1092.   A: You could move the host dependent stuff into the scripted section
  1093.   of the KickStart config - e.g. only install a given RPM if on a given
  1094.   machine.  It would be useful to have a conditional installation
  1095.   feature in the packages section of the config file, e.g. switching on
  1096.   architecture, or hostname/domain name/IP address.
  1097.  
  1098.  
  1099.   Q: Are there any changes between RedHat 5.1 and 5.2 ?
  1100.  
  1101.  
  1102.   A1: Lots of changes in the installer, but mostly bug fixes or cosmetic
  1103.   improvements.  No impact on KickStart as far as I can tell - from a
  1104.   diff -rcs of the two misc/src/install directories.
  1105.  
  1106.  
  1107.   A2: RH5.2 now apparently includes the automatic IP allocation/DHCP
  1108.   patches to bootpd, but they have left out the documentation which
  1109.   tells you how to use it.
  1110.  
  1111.   Q: (How) can you clear a specific partition or partitions ?  e.g. to
  1112.   leave /home but zap /.
  1113.  
  1114.  
  1115.   A: You can't - yet!
  1116.  
  1117.  
  1118.   Q: Can you arrange to have your partitions created across multiple
  1119.   drives ?  e.g. / on sda and /home on sdb.
  1120.  
  1121.  
  1122.  
  1123.   A: Don't think so - looks like you only get access to the first drive
  1124.   from the partitioning tool.
  1125.  
  1126.  
  1127.   Q: Is it possible to specify existing partitions to be included in the
  1128.   mount table, or is it only possible to specify the creation of new
  1129.   partitions that will then be included?
  1130.  
  1131.  
  1132.   A: ?
  1133.  
  1134.  
  1135.   Q: After running mkkickstart, where is the file it creates?
  1136.  
  1137.  
  1138.   A: It doesn't create a file - it dumps the KickStart config to stdout.
  1139.  
  1140.  
  1141.   Q: In virtual console 4 (Alt-F4) I get Unable to load NLS charset
  1142.   cp437(nls_cp437).  What does this mean ?  Should I be worried ?
  1143.  
  1144.  
  1145.   A: Sounds like you're trying to mount a CD-ROM burned with the Joliet
  1146.   (Unicode extensions to ISO 9660.  In theory the filenames on the CD-
  1147.   ROM might get munched and not make it through to Linux correctly.  In
  1148.   practice it doesn't seem to cause any problems - could be a spurious
  1149.   dependency ?
  1150.  
  1151.  
  1152.   Q: Why am i getting the X Window System installed ? I didn't put it in
  1153.   my list of packages.
  1154.  
  1155.  
  1156.   A: The XFree86-VGA16 RPM is a 'base' component, and as such always
  1157.   gets installed - unless you change the definition of the base class.
  1158.  
  1159.  
  1160.   Q: In my post-installation script, can I use the packages which have
  1161.   been installed by now to do funky things not possible with the limited
  1162.   tools on the floppies ?
  1163.  
  1164.  
  1165.   A: Yep - e.g. if you chose to install Perl when you put your KickStart
  1166.   config together, almost anything is possible in about five lines :-)
  1167.  
  1168.  
  1169.  
  1170.  
  1171.   11.  Credits
  1172.  
  1173.  
  1174.   Thanks to Eric Doutreleau for the info about chkconfig, the SYSLINUX
  1175.   config file hack, and the Perl script for updating your distribution
  1176.   server's RPMs.  Thanks to Robert Kaminsky for extensive
  1177.   investigations.  Thanks to Piete Brooks, Flavia Regina Munhoz, Tom
  1178.   Toffoli, Bob Robbins, Charlie Brady and Ragen Herrington, for their
  1179.   comments and questions.
  1180.  
  1181.  
  1182.  
  1183.  
  1184.   12.  Appendix A - Configuring BOOTP/DHCP and NFS
  1185.  
  1186.  
  1187.   If you're wondering what on earth this BOOTP and DHCP stuff is, more
  1188.   information is available at the DHCP WWW site <http://www.dhcp.org/>.
  1189.   NFS is documented separately in detail in the NFS HOWTO, and there's a
  1190.   DHCP mini-HOWTO too.  I've tried to provide enough details here to
  1191.   help you get started, whilst not treating the topics in depth - let me
  1192.   know if you think this is overkill.
  1193.  
  1194.  
  1195.   In the BOOTP/DHCP + NFS configuration we're discussing, the KickStart
  1196.   config file should be NFS mountable by the machine being installed
  1197.   from /kickstart/IPADDR-kickstart on the BOOTP/DHCP server, where
  1198.   IPADDR is the IP address of the new machine, e.g.
  1199.   /kickstart/198.168.254.254-kickstart for the machine 198.168.254.254.
  1200.  
  1201.  
  1202.   You should be able to override this location by returning the bf
  1203.   parameter (boot file) in your BOOTP/DHCP response.  It may even be
  1204.   possible to have this NFS mounted off another machine entirely.
  1205.  
  1206.  
  1207.   To NFS export some directories from an existing Linux box, create the
  1208.   file /etc/exports with contents something like:
  1209.  
  1210.  
  1211.  
  1212.  
  1213.        /kickstart *.swedish-chef.org(ro,no_root_squash)
  1214.        /mnt/cdrom *.swedish-chef.org(ro,no_root_squash)
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.   Note that if you didn't register the IP addresses you're going to be
  1221.   using in the DNS, you may be told to get lost by the NFS server and/or
  1222.   the RPC portmapper.  In this you can probably get away with putting IP
  1223.   address/netmask pairs in the config files, e.g.
  1224.  
  1225.  
  1226.  
  1227.  
  1228.        /kickstart 198.168.254.0/255.255.255.0(ro,no_root_squash)
  1229.  
  1230.  
  1231.  
  1232.  
  1233.  
  1234.   and in /etc/hosts.allow:
  1235.  
  1236.  
  1237.  
  1238.  
  1239.        ALL: 194.82.103.0/255.255.255.0: ALLOW
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.   This is because most Linux distributions use TCP wrappers to do access
  1246.   control for some or all of the NFS related daemons.  Be aware that the
  1247.   /etc/exports syntax tends to be different on other Unix variants - the
  1248.   NFS servers bundled with Linux distributions tend to offer a much
  1249.   wider range of options than the ones shipped with other versions of
  1250.   Unix.
  1251.  
  1252.   Be aware that if you include a root password in your KickStart config
  1253.   file, or NFS export directories containing sensitive information, you
  1254.   should take care to expose this information to as few people as
  1255.   possible.  This can be done by making the NFS export permissions as
  1256.   fine grained as you can, e.g. by specifying a particular host or
  1257.   subnet to export to rather than a whole domain.  If you keep a special
  1258.   IP address free for KickStart installations, everything's nice and
  1259.   simple, but you'll have to change it later - or reconfigure the
  1260.   machine to get its IP address via BOOTP/DHCP.
  1261.  
  1262.  
  1263.   Most NFS servers require you to tell mountd and nfsd (on some versions
  1264.   of Unix they're prefixed with a rpc.) that the /etc/exports file has
  1265.   changed - usually by sending a SIGHUP.  There's often a program or
  1266.   script called exportfs, which will do this for you, e.g.
  1267.  
  1268.  
  1269.  
  1270.  
  1271.        # exportfs -a
  1272.  
  1273.  
  1274.  
  1275.  
  1276.  
  1277.   If you didn't have NFS up and running when this machine was booted,
  1278.   the directories may not be exported automatically.  Try rebooting, or
  1279.   running the following programs as root:
  1280.  
  1281.  
  1282.  
  1283.  
  1284.        # portmap
  1285.        # rpc.nfsd
  1286.        # rpc.mountd
  1287.  
  1288.  
  1289.  
  1290.  
  1291.  
  1292.   As noted, on some systems the rpc. prefix isn't used.  In most modern
  1293.   Unix distributions, these programs can be found in the /usr/sbin or
  1294.   /usr/libexec directories.  These might not be in your path already,
  1295.   e.g. if you used su to become root.  The portmap program is also
  1296.   sometimes called rpcbind, e.g. on Solaris, some versions of nfsd
  1297.   require a command line argument specifying the number of instances of
  1298.   the server to run, and you may find you also need to run another
  1299.   daemon called biod.  The above should suffice on most (all?)  Linux
  1300.   systems.
  1301.  
  1302.  
  1303.   If you're using the CMU BOOTP server with DHCP and dynamic addressing
  1304.   extensions referred to earlier, a sample /etc/bootptab entry
  1305.   (/etc/bootptab is the normal location of the BOOTP/DHCP configuration
  1306.   file) would look something like this:
  1307.  
  1308.  
  1309.  
  1310.  
  1311.          .dynamic-1:ip=198.168.254.128:T254=0x30:T250="ds=198.168.254.2:
  1312.          dn=swedish-chef.org:sm=255.255.255.0:gw=198.168.254.1:
  1313.          dl=0xFFFFFFFF":
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.   (wrapped for clarity)
  1320.  
  1321.   This says to allocate IP addresses dynamically on encountering new
  1322.   machines, starting at 198.168.254.128 and continuing for the next 48
  1323.   (the hexadecimal value 30) addresses.  Each client will be passed back
  1324.   the value of T250.  In this case that sets:
  1325.  
  1326.  
  1327.  
  1328.   ╖  the DNS server ds to 198.168.254.2
  1329.  
  1330.   ╖  the domain name dn to swedish-chef.org
  1331.  
  1332.   ╖  the subnet mask sm to 255.255.255.0
  1333.  
  1334.   ╖  the default gateway gw to 198.168.254.1
  1335.  
  1336.   ╖  the lease length dl (how long the address is valid for) to
  1337.      "forever"
  1338.  
  1339.  
  1340.   There seem to be a number of other versions of this server kicking
  1341.   around which do not support dynamic addressing.  For these, you would
  1342.   have to list the hardware (typically Ethernet MAC) address of each to-
  1343.   be-installed machine in /etc/bootptab, and the entries would look
  1344.   something like this:
  1345.  
  1346.  
  1347.  
  1348.  
  1349.        bork.swedish-chef.org:ip=198.168.254.128:ha=0000E8188E56:
  1350.          ds=198.168.254.2:dn=swedish-chef.org:sm=255.255.255.0:
  1351.          gw=198.168.254.1:dl=0xFFFFFFFF":
  1352.  
  1353.  
  1354.  
  1355.  
  1356.  
  1357.   (wrapped for clarity)
  1358.  
  1359.  
  1360.   Note that the parameter ha corresponds to the hardware address of the
  1361.   machine being installed.
  1362.  
  1363.  
  1364.  
  1365.  
  1366.   13.  Appendix B - Making your own RPMs
  1367.  
  1368.  
  1369.   The RPM package format is already very well documented, particularly
  1370.   in the book Maximum RPM by Ed Bailey, which you can download from the
  1371.   RPM WWW site <http://www.rpm.org/> - also available from all good book
  1372.   stores!  This is just a couple of quick hints for people in a hurry.
  1373.  
  1374.  
  1375.   RPM packages are built from a spec file.  This consists (in a similar
  1376.   fashion to the KickStart config file) of a recipe of steps that need
  1377.   to be taken in order to build the package - it's expected that you'll
  1378.   have to build it from source, potentially for multiple platforms, and
  1379.   may need to apply patches before compiling.  Once built and installed,
  1380.   a binary RPM will be created from the files and directories you
  1381.   specify as being associated with the package.  It's important to note
  1382.   that RPM has no idea of which files and directories are related to a
  1383.   given package - you have to tell it.
  1384.  
  1385.   Here's a sample specification for a custom RPM of the Squid WWW cache
  1386.   server <http://squid.nlanr.net/>:
  1387.        Summary: Squid Web Cache server
  1388.        Name: squid
  1389.        Version: 1.NOVM.22
  1390.        Release: 1
  1391.        Copyright: GPL/Harvest
  1392.        Group: Networking/Daemons
  1393.        Source: squid-1.NOVM.22-src.tar.gz
  1394.        Patch: retry-1.NOVM.20.patch
  1395.        %description
  1396.        This is just a first attempt to package up the Squid Web Cache for easy
  1397.        installation on our RedHat Linux servers
  1398.  
  1399.        %prep
  1400.        %setup
  1401.        %build
  1402.        configure --prefix=/usr/squid
  1403.        perl -spi -e 's!#( -DALLOW_HOSTNAME_UNDERSCORES)!$1!' src/Makefile
  1404.        make
  1405.  
  1406.        %install
  1407.        make install
  1408.  
  1409.        %files
  1410.        /usr/squid
  1411.  
  1412.  
  1413.  
  1414.  
  1415.  
  1416.   Here's how to build this RPM:
  1417.  
  1418.  
  1419.  
  1420.  
  1421.        % mkdir -p SOURCES BUILD SRPMS RPMS/i386
  1422.        % cp ~/squid-1.NOVM.22-src.tar.gz SOURCES
  1423.        % cp ~/retry-1.NOVM.20.patch SOURCES
  1424.        % rpm -ba squid-1.NOVM.22+retry-1.spec
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.   This will automatically create a subdirectory under the BUILD
  1431.   directory, into which it'll unpack the source code and then apply the
  1432.   patch (there are a number of options available for patching - check
  1433.   the book for details).  Now, RPM will automatically build the package
  1434.   by running configure and then make, install it using make install, and
  1435.   take a snapshot of the files under /usr/squid.  It's the latter which
  1436.   will form the binary RPM of the Squid software.
  1437.  
  1438.  
  1439.   Note that we can insert arbitrary shell commands into the unpacking,
  1440.   building and installing processes, e.g. the call to perl which tweaks
  1441.   one of Squid's compile-time parameters.
  1442.  
  1443.  
  1444.   The final binary RPM will be left under the RPMS directory in the
  1445.   platform specific subdirectory i386.  In this case it will be called
  1446.   squid-1.NOVM.22-1.i386.rpm.  Note that the filename is created by
  1447.   concatenating the values of the following parameters from the spec
  1448.   file: Name, Version and Release - plus the hardware platform in
  1449.   question, i386 in this case.  Try to bear this in mind when creating
  1450.   your own RPMs, to avoid giving them overly long or painful names!
  1451.  
  1452.  
  1453.   It's also worth bearing in mind that you can build RPMs without having
  1454.   to rebuild the whole software package, e.g.
  1455.  
  1456.  
  1457.  
  1458.  
  1459.        Summary: Linux 2.0.36 kernel + filehandle patch + serial console patch
  1460.        Name: linux
  1461.        Version: 2.0.36+filehandle+serial_console
  1462.        Release: 1
  1463.        Copyright: GPL
  1464.        Group: Base/Kernel
  1465.        Source: linux-2.0.36+filehandle+serial_console.tar.gz
  1466.        %description
  1467.        This is just a first attempt to package up the Linux kernel with patches
  1468.        for installation on our RedHat Linux servers
  1469.  
  1470.        %prep
  1471.        echo
  1472.  
  1473.        %setup
  1474.        echo
  1475.  
  1476.        %build
  1477.        echo
  1478.  
  1479.        %install
  1480.        echo
  1481.  
  1482.        %post
  1483.        /sbin/lilo
  1484.  
  1485.        %files
  1486.        /lib/modules/2.0.36
  1487.        /boot/vmlinuz
  1488.  
  1489.  
  1490.  
  1491.  
  1492.  
  1493.   In this case we simply create an RPM based on the /boot/vmlinuz file
  1494.   and the contents of the directory /lib/modules/2.0.36, and execute
  1495.   /sbin/lilo after the package has been installed on a target machine.
  1496.   Let me know if you know much neater way of writing the spec file than
  1497.   this.
  1498.  
  1499.  
  1500.  
  1501.  
  1502.   14.  Appendix C - Munging your own RPMs into the distribution
  1503.  
  1504.  
  1505.   Here is Eric's script for munging updated RPMs into the RedHat
  1506.   distribution area:
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.   #!/usr/bin/perl
  1520.   #
  1521.   $redhatdir="/cdrom/i386";
  1522.   $rpmdir="/cdrom/i386/RedHat/RPMS/";
  1523.   $updatedir="/cdrom/updates/";
  1524.   @OTHERDIR=($updatedir);
  1525.   foreach $dir (@OTHERDIR)
  1526.           {
  1527.           print "update for $dir\n";
  1528.           system(" find $dir -name \"*.rpm\" -exec cp {} $rpmdir \\; ");
  1529.           }
  1530.   chdir($contribdir) || die "peux pas aller dans $contribdir $!\n";
  1531.   system("chmod -R 755 $redhatdir");
  1532.   chdir($rpmdir) || die "problem to go in $rpmdir $!\n";
  1533.   #
  1534.   # remove the old file
  1535.   #
  1536.   opendir(DIR,'.');
  1537.   @package=grep(/\.rpm$/,readdir(DIR));
  1538.   foreach $file (@package)
  1539.           {
  1540.           $file =~ /(.*)\-([\d+|\.]+\w*)\-(\d+)\.[i386|noarch].*/;
  1541.           $nom=$1;
  1542.           $version=$2;
  1543.           $buildvers=$3;
  1544.           if ($NOM{$nom})
  1545.                   {
  1546.                   $version2=$VERSION{$nom};
  1547.                   $buildver2=$BUILDVERS{$nom};
  1548.                   $file2=$FILE{$nom};
  1549.                   $nom2=$NOM{$nom};
  1550.                   if ( $version2 gt $version )
  1551.                           {
  1552.                           print "$file2 is newer than $file\n";
  1553.                           unlink($file);
  1554.                           }
  1555.                   else
  1556.                           {
  1557.                           if ( $version2 lt $version )
  1558.                                   {
  1559.                                   print "$file is newer than $file2\n";
  1560.                                   unlink($file2);
  1561.                                   $VERSION{$nom}=$version;
  1562.                                   $BUILDVERS{$nom}=$buildvers;
  1563.                                   $FILE{$nom}=$file;
  1564.                                   $NOM{$nom}=$nom;
  1565.                                   }
  1566.                           else
  1567.                                   {
  1568.                                   if ( $buildver2 > $buildvers )
  1569.                                                   {
  1570.                                              print "$file2 : $buildver2 est mieux que $file : $buildvers\n";
  1571.                                              unlink($file);
  1572.                                                   }
  1573.                                   else
  1574.                                                   {
  1575.                                           print "$file2 : $buildver2 is older than $file : $buildvers\n";
  1576.                                               unlink($file2);
  1577.                                               $VERSION{$nom}=$version;
  1578.                                               $BUILDVERS{$nom}=$buildvers;
  1579.                                               $FILE{$nom}=$file;
  1580.                                               $NOM{$nom}=$nom;
  1581.                                                   }
  1582.                                   }
  1583.                           }
  1584.                   }
  1585.           else
  1586.                   {
  1587.                   $VERSION{$nom}=$version;
  1588.                   $BUILDVERS{$nom}=$buildvers;
  1589.                   $FILE{$nom}=$file;
  1590.                   $NOM{$nom}=$nom;
  1591.                   }
  1592.           }
  1593.  
  1594.   # we do the hard thing here
  1595.   #
  1596.   system("$redhatdir/misc/src/install/genhdlist $redhatdir");
  1597.  
  1598.  
  1599.  
  1600.  
  1601.  
  1602.  
  1603.  
  1604.  
  1605.  
  1606.  
  1607.  
  1608.  
  1609.  
  1610.  
  1611.  
  1612.  
  1613.  
  1614.  
  1615.  
  1616.  
  1617.  
  1618.  
  1619.  
  1620.  
  1621.  
  1622.  
  1623.  
  1624.  
  1625.  
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631.  
  1632.  
  1633.  
  1634.  
  1635.  
  1636.  
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642.  
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648.  
  1649.  
  1650.  
  1651.