########################################################################## # RHCE Notes # # Anuradha Weeraman, 23 November 2003 # # Warning: Some of the information here maybe outdated # # $Id: RHCE.txt,v 1.1 2004/06/02 21:17:53 anuradha Exp $ # ########################################################################## ** HARDWARE BASICS ** Tier 1 - hardware that rh linux can detect and reliably use Tier 2 - hardware the rh linux should be able to detect and use; however, some users experience problems using this hardware. Tier 3 - Hardware that is problematic or for which only experimental drivers currently exist. Linux SMP supports as many as 16 processors, however, the Intel architecture supports no more than 8. standard rh kernel cannot autodetect or use more than 1 GB or RAM. edit include/asm-i386/page.h to change this. also pass the mem parameter to lilo after this. when running on Intel arch, rh linux only permits totally virtual memory of 4GB, both physical and swap. standard rh linux supports upto 192 serial ports. this can be changed in drivers/char/serial.c. only the device file /dev/ttyS0-3 exist. any other serial ports have to be configured using setserial. setserial /dev/ttySn irq x port y skip_test autoconfig similarly on /dev/lp0-2 are created by default, to increase the number of parrallel ports, edit drivers/char/lp.c sometimes, winmodems can be configured using isapnp and setserial. a maximum of 8 ide drives are supported, though only two interfaces (up to four drives) are automatically probed. additional interfaces can be probed at boot time by: ide2=0x1e8,0x3ee,11 ide3=0x168,0x36e,10 linux now supports ide/eide drives larger than 33.8GB. drive geometry sometimes need to be specified on boot: linux hda=1023,63,255 disk geometry of a hard drive describes the possible addresses at which data can be stored and accessed. physical address - the data is addressed by the cylinder, head, and sector that contain them. logical block address (LBA) - the data is addressed by a relative sector number. many bios drivers can only access the first 1024 cylinders (0-1023) via the physical address. since lilo uses the BIOS to load the kernel during boot time, the system cannot be started if the kernel exists outside this boundary. also, when using logical block addressing, the maximum relative sector number is that only about 8GB of disk space is addressable. also this only affects during boot since the bios is not used after that by linux. there can be only four primary partitions, including the extended partition if any. an extended partition can have upto 12 logical partitions. therefore the total number of partitions on a pc is 16. the first logical partition is always designated as partition 5. the linux kernel supports a swap partition as large as 2GB. upto 8 swap partitions can be specified. ** UNIX BASICS ** lpr filex lpr -P lazer filex mke2fs /dev/hda2 mkswap /dev/hda3 fdisk /dev/hda in fdisk, the 'blocks' columns specifies the size of the partition in 1024 byte blocks. to force an e2fsck scan even if drive is clean (-f), to check for badblocks (-c), and to automatically correct errors (-p), run: e2fsck -f -c -p /dev/hda1 < file - take stdin from a file > file - write stdin to a file >> file - append stdin to a file >&2 - write stdout to stderr 2> file - write stderr to a file 2>&1 - write stderr to stdout x | y - send stdout of x as stdin to y cmd & - execute cmd in the background cmd1 ; cmd2 - execute cmd1 followed by cmd2 (cmd1 ; cmd2) - execute cmd1 followed by cmd2, treating them as one command group cmd1 `cmd2` - use the output of cmd2 as the arguments of cmd1 cmd1 && cmd2 - execute cmd1; execute cmd2 only if cmd1 succeeds cmd1 || cmd2 - execute cmd1; execute cmd2 only if cmd1 fails { cmd1 ;; cmd2 } - execute cmd1 followed by cmd2 in the current environment. x=y x=${y} x=$y x=${y}es x=$yes x='$y' x=\$y export x,y,z export x=$y if test-command then commands else commands fi if test -e /etc/hosts then echo 'hosts file exists!' fi -d file - file is a directory -e file - file exists -f file - file is a regular file -r file - file is readable -s file - file has size greater than 0 -w file - file is writable -x file - file is executable file1 -nt file2 - file1 is newer than file2 file1 -ot file2 - file1 is older than file2 s1 = s2 - string s1 is identical to string s2 s1 != s2 - string s1 is not identical to string s2 n1 -eq n2 - integer n1 is equal to integer n2 n2 -ge n2 - int. n1 is greater than or equal to int. n2 n1 -gt n2 - int. n1 is greater than int. n2 n1 -le n2 - int. n1 is less than or equal to int. n2 n1 -lt n2 - int. n1 is less than int. n2 n1 -ne n2 - int. n1 is not equal to int. n2 ! cnd - true if and only if condition cnd is false cnd1 -a cnd2 - true if condition cnd1 and cnd2 are both true cnd1 -o cnd2 - true if either condition cnd1 or cnd2 is true case string in pattern) commands ;; pattern2) commands ;; esac while test-command do commands done until test-command do commands done for list do commands done for x in list do commands done 'break' can be used in for, while and until to immediately terminate the loop. 'continue' can be used in for, while and until to end the current iteration of the loop. 'exit' command terminate the execution of the shell script and sets the exit code to the value specified as its argument : exit 0 ** TCP/IP NETWORKING ** IPV6 will provide 128-bit IP Addresses subnetting let you split a network into several smaller networks. supernetting lets you join consecutively numbered networks into a larger network. a service is associated with a port, a 16-bit number that identifies the service. UDP and TCP ports are distinct. Accessing ports 0-1023 under UNIX requires root privileges and are therefore known as privileged ports. /etc/services has a list of 'well-known ports'. to determine which daemons are currently running or which daemons will be started by inetd, issue the command : netstat -ap --inet | grep LISTEN secure shell computes a cryptographic key when started, so making it an inetd process instead of a standalone daemon will make the process slower. some daemons such as nfsd do not restart properly, in which case, it needs to be stopped first and started again. in rh linux, instead of specifying the full pathname to the rc directory where the startup script is situated when you want to start, stop or restart a daemon, you can easily say 'service daemon operation' to do the same thing. ** HISTORY OF LINUX ** Multics was funded by AT&T's Bell Labs, MIT and General Electric in the 1960s. Dennis Ritchie and Ken Thompson wrote UNICS (which later became UNIX) for the DEC PDP-7 so that they can play Space Travel. the Free Software Foundation (FSF) started in 1984. the GPL is a form of copyright, known as copyleft, designed to protect, not preclude, rights to use, study, copy and distribute software. Linus Torvalds started work on the kernel in 1990. He posted the first usenet posting regarding its development in August 1991 on comp.os.minix. in 1994 Linux 1.0 was released. at that time there were about 100,000 devotees. Red Hat Inc. was founded in 1994 by Bob Young and Marc Ewing. ** INSTALLATION PLANNING ** have all the information about your hardware before you start to install. rh linux provides two different installation types to choose from. you can choose to do an Install or an Upgrade. if you choose to upgrade, your configuration files will be backed up as a .rpmsave before being updated. the rh linux installation procedure provides three default installation classes : GNOME Workstation, KDE Workstaton, Server. the Workstation classes can be used to setup dual boot systems as they do not disturb existing partitions other than ext2 partitions which will get erased. they will make a 64MB swap partition, 16MB /boot partition and a / partition. Both of them require about 600MB of disk space. Server installation class deletes all existing partitions, including DOS/WINDOWS partitions. it requires about about 1.6GB of disk space. it creates a 64MB swap partition, a 16MB /boot partition, a 256MB / partition, a 256MB /var partition. remaining disk space will be split between /home and /usr. when partitioning, remember that /, /etc, /lib, /bin, /sbin, /dev should be kept on one partition. that is, the root (/) partition. directories that are often made mount points of separate partitions include: /home, /opt, /tmp, /usr, /usr/local, /var. if making a boot disk to install from cd, make a boot disk out of boot.img. if installing via network, it should be bootnet.img. if you are accessing pcmcia devices during install, it should be pcmcia.img. use rawrite or dd : dd if=boot.img of=/dev/fd0H1440 the different installation media are: FTP, NFS, HTTP, Local Hard Disk, CD-ROM. only NFS is available from the graphical mode installation of rh linux. a component is a set of related packages. eg, GNOME component consists of over three dozen packages that are necessary or useful to the GNOME desktop manager. ** INSTALLATION OVERVIEW ** during graphical install : CTRL-ALT-F1 - text-based installation procedure CTRL-ALT-F2 - shell prompt CTRL-ALT-F3 - messages from installation program CTRL-ALT-F4 - kernel messages CTRL-ALT-F5 - other messages, including fs creation messages CTRL-ALT-F6 - empty CTRL-ALT-F7 - graphical installation procedure. the expert mode installation suppresses automatic device probes and gives you almost complete control over the installation procedure. you can create a SOFTWARE RAID Drive using Disk Druid. ** ADVANCED INSTALLATIONS ** LILO can act as both the primary boot loader and secondary boot loader. when used as the primary boot loader LILO is installed on the MBR so that BIOS loads it on startup. when used as the secondary boot loader, LILO is installed on the boot sector of /boot partition and by using the existing boot manager, an entry is made to this to boot linux. if LILO is configured to boot unattended, the LILO prompt can be brought up by holding down shift or caps lock during this part of the bootup process. if you press the tab key at the LILO prompt, it displays the boot images that it is configured to boot. boot arguments in the form of name=value can be specified along with the boot image. LILO recognizes and process several of those arguments, if it doesn't it will pass it on to the kernel. kernel takes care of those that it recognizes and if it still doesn't, it passes it on to init in the form of environmental variables. to start linux in single user mode : LILO: linux S LILO: linux 1 LILO: linux single LILO loads up in two stages, first is from the MBR or boot sector of partition. second is /boot/boot.b. it shows its prompt letter one by one so an incomplete LILO boot up can reveal a lot of clues. if LILO shows : nothing : LILO did not load L : first stage loaded LI : second stage loaded LIL : second stage started LIL? : second stage loaded at incorrect address LIL- : descriptor table is corrupt LILO : LILO loaded correctly to load linux using NT Boot Loader, boot into linux first and dd if=/dev/hda3 of=linux.ldr bs=512 count=1 copy it to an msdos floppy and transfer it to your windows partition. add the following line to c:\boot.ini : c:\linux.ldr="Linux" you can write a kickstart file or even easier, create one using 'mkkickstart' on a completed installation. it is usually 'ks.cfg'. you can specify the kickstart file in /etc/dhcpd.conf : filename "/home/ftp/pub/ks.cfg"; so that it will automatically be got down using ftp during install. it can also be distributed using nfs. if you want different systems to get different kickstart files have the usual 'filename "/home/ftp/pub/kickstart"' and in the /home/ftp/pub/kickstart directory, have different files in the form of xxx.xxx.xxx.xxx-kickstart where the xxx.xxx.xxx.xxx is the ip address of the machine. by default the client tries to import an nfs share exported by the dhcp server itself from where it will install redhat. if you want to use a different host, add : next-server nfserver; to /etc/dhcpd.conf. you can also give a kickstart directive of the form nfs --server server directory to perform a kickstart installation via DHCP or NFS, do a LILO: linux ks if the kickstart file is found on the root of the floppy : LILO: linux ks=floppy during kickstart, if any information is missing, the installation will prompt you for it. ** CONFIGURING INSTALL-TIME OPTIONS AFTER INSTALLATION ** kbdconfig - configure keyboard kernel keymaps mouseconfig - as the name implies timeconfig - ditto sndconfig - configure sound linuxconf - to configure basically every aspect of the system in a curses environment. one confusing aspect of linuxconf is that it makes some configuration changes immediately while some require to be explicitly activated. to enable shadow passwords : pwconv to disable shadow passwords : pwunconv ** ADMINISTERING USER ACCOUNTS AND GROUPS ** /etc/passwd : username:password:uid:gid:gecos:homedir:shell kinds of user accounts : ordinary user accounts ppp accounts slip accounts uucp accounts pop accounts virtual pop accounts - for users who access mail via pop, on a server that provides virtual email domains. userconf - easily administer users when adding users using userconf, denied field means that the user lacks the privilege. granted means that the user must confirm by entering the login password. granted/silent means that the user has the privilege and need not confirm. PPP users are members of the pppusers group. default PPP command interpreter is /usr/lib/linuxconf/lib/ppplogin. slip users are members of the slipusers group. default slip command interpreter is /sbin/diplogin. uucp users are members of the uucp group. default uucp command interpreter is /usr/sbin/uucico. default home directory of a uucp user is /var/spool/uucppublic. pop users are members of the popusers group. doesn't have a default command interpreter. if you want to lock a particular user, you could disable his/her account. when you delete an account, you have the option of archiving his/her homedir, deleting it or just letting it be. a user may own files in directories other than the home directory. they are known as orphan files when the account gets deleted. if another account with the same uid is then created, the new account owns those files. be warned. user accounts can be administered on the command line using useradd, userdel, usermod, chsh and chfn. remove home directory and get rid of user : userdel -r anuradha when specifying shells for a user, only those found in /etc/shells can be given. /etc/group : groupname:password:gid:members groups can be administered on the command line using groupadd, groupdel, groupmod. when a user logs into bash, the following files are executed : /etc/bashrc - establishes aliases and functions /etc/profile - set environment variables, executes files in /etc/profile.d when a new account is created, contents of /etc/skel is copied to the home directory. the files are : .Xdefaults, .bash_logout, .bash_profile, .bashrc, .kde, .kderc, Desktop 'mkpasswd' can be used to automatically generate passwords. 'mkpasswd user' will automatically generate and assign the user a new password. ** IMPLEMENTING USER AND GROUP DISK SPACE QUOTAS ** if a partition is mounted as /home, the files that stores the quotas assigned to the users will be /home/quota.user and /home/quota.group. the 'quotacheck' command is used to create these files if they don't exist. they can't be edited directly and 'edquota' needs to be used to do so. 'repquota' will display the contents of the file. /etc/rc.d/rc.sysinit starts quota usage on boot. people who exceed the 'soft limit' will be notified by mail when 'warnquota' runs. people who exceed the 'hard limit' will be prevented from using further disk space. you can also specify a grace period if want to be lenient. the email message that gets sent is hardcoded into 'warnquot.c' and you need to install the source rpm and recompile to customize this. to implement quotas : configure the kernel install quota package revise /etc/fstab establish quota files set quotas turn on quota checking the kernel must be compiled with CONFIG_QUOTA. the /etc/fstab should have 'usrquota' or 'grpquota' in the options field for the particular filesystem : /dev/hda6 /home ext2 defaults,usrquota 1 2 /dev/hda6 /home ext2 defaults,grpquota 1 2 /dev/hda6 /home ext2 defaults,usrquota,grpquota 1 2 mount -o remount /home to establish the quota files : quotacheck -avug the files then created should have read and write permissions only for root. to set the quota for a user : edquota -u user this launches the editor as given by $EDITOR. to then check up on the quota of a user : quota -u user to set the group quota : edquota -g group to see the quota of a group : quota -g group to set the grace period : edquota -t when setting quotas, a limit of 0 means there is no limit. you can also use a single account as a template for others : edquota -p user edquota user edquota -p user user1 user2 user3 ... where user is the account which you want to use as a template finally, turn on quota checking by : quotaon -av this turns on both user and group quotas, to do so only for users : quotaon -avu for only groups : quotaon -avg to turn off quotas : quotaoff -av quotaoff -avu quotaoff -avg to see quota reports : quota -u user a user can view his/her quota using : quota to view the quotas of multiple users : repquota -a in this case, all the users. users in violation will be flagged with a +. if you want to enable disk quotas for nfs mounts, enable them for the local user which nfs maps as the remote user. ** THE RED HAT PACKAGE MANAGER (RPM) ** the RPM subsystem consists of : package files the RPM database the RPM command package files are like ordinary TAR files except that it contains additional information, they are: name and version of the package dependency information build date and build host description of the package size and md5 checksum of each contained file identity of the person or organization that built the package package group to which the package belongs the package filename usually has the following structure : package-version-buildarchitecture.rpm RPM database resides in /var/lib/rpm. the RPM command does the following : installing packages updating packages removing packages querying the rpm database querying a package file building a package file from source code validating a package validating a package file when installing, updating or removing rpm packages, rpm does the following checks : checks to see whether there is sufficient disk space checks for dependencies checks for files that might get overwritten these checks can be overridden by command line options. rpm -i gnorpm-0.9.10-i386.rpm rpm -ivh gnorpm-0.9.10-i386.rpm -v prints verbose messages -h prints 50 # marks as a kind of status indicator rpm -ivh ftp://contrib.redhat.com/i386/RedHat/RPMS/gnorpm-0.9-10.i386.rpm rpm -ivh ftp://contrib.redhat.com/i386/RedHat/RPMS/gnorpm* rpm -ivh ftp://user:pass@server/path rpm -ivh ftp://user:pass@server:port/path you can specify all the files in any order and rpm will install them without any conflicts in dependencies within themselves. but if a package requires another which is not specified in the command line, then it gives an error. when updating rpm packages, it does not overwrite existing files, instead it renames them with a .rpmsave extension. the following command line arguments do what you think they do : --force overwrites newer packages or existing files --nodeps skips dependency checking --replacefiles replaces files owned by another package to remove installed packages : rpm -e package_name rpm --uninstall package_name here the package name is something like 'gnorpm' rather than gnorpm-0.9-10.... to see the complete listing of package installed : rpm -qa you can use '--nodeps' when removing packages too. to upgrade a package : rpm -Uvh package_file_name to upgrade only the packages that are installed : rpm -Fvh gnorpm-0.9-10.i386.rpm you can apply security updates this way by checking into www.redhat.com/support/errata/. you can see if a particular package is installed by : rpm -q solfege rpm -q elvis to see which package owns a particular file : rpm -qf filename the following queries and verifications can be performed on installed rpms using the rpm command : print a description of a package list the files contained in a package print scripts executed when installing of uninstalling a package verify the integrity and authenticity of package contents to print the description of a package rpm -qi package_name rpm -qip package_file_name to list the contents of a package rpm -ql package_name rpm -qlp package_file_name to print the pre-installation and post-installation scripts of a package rpm -qp --scripts package_file_name rpm database contains a record in each and every file, it contains : file size ownership permissions md5 checksum if its a link, it contains the path to which the link refers if its a device file, it contains the associated major and minor device numbers to use this to see which files have been modified since install of package : rpm -V package_name the output has three fields : status configuration - contains a 'c' if the file is a configuration file and or a space otherwise filename the status codes : . no change 5 MD5 checksum has changed D device major or minor number has changed G owning group has changed L link path has changed M file modes have changed S file size has changed T modification time has changed U owning user has changed an example : rpm -V setup S.5....T c /etc/exports S.5....T c /etc/hosts.allow etc. you can also do these checks against package files rather than the rpm database if you suspenct that the database is either corrupt or compromised. to do this : rpm -Vp package_file_name to verify all installed packages : rpm --verify -a rpm -Va after downloading redhat's GPG key, you can verify the authenticity of rpm packages using : rpm -K package_file_name you can specify the query format using the switch --queryformat. to display the sorted list of all the packages installed along with their sizes : rpm -qa --queryformat "%-32{NAME}\t%10{SIZE}\n" | sort the syntax of --queryformat resembles that of C printf library function. to see the query tags that you can use with the queryformat argument, do a : rpm --querytags if you install the 'rpmdb-redhat' package you can find out which package owns a particular file by using the --redhatprovides switch. for example if you want to know which package owns libsample.so.1 : rpm -q --redhatprovides libsample.so.1 source rpm filename follow the following format : package-version-build.src.rpm when you install a source rpm, they go into /usr/src/redhat. the /usr/src/redhat directory has the following structure : BUILD - the source RPM is uncompressed, untarred and patched here. RPMS - when you compile a source rpm, the new binary rpm is saved here. SOURCES - the source code (tar files) and patches reside here. SPECS - contains SPEC files that list package sources, patches, compile-time options, post-install steps, and package info. SRPMS - when you create a new source rpm, it is saved here. to build a binary rpm from the source rpm, move to the SPECS directory and : rpm -bb spec_file you can also do the following with SPEC files : -bp %prep stage: unpack and patch source -bl %files stage: check that files exist -bc %build stage: make install -bb builds binary package -ba builds binary and source packages --test check syntax of SPEC file if a spec file is contained within a TAR file, just replace -b with -t. you need not install a source rpm to compile it, simply : rpm --recompile source_package_file also rpm --rebuild source_package_file gnorpm is gui frontend tool to rpm. ** RED HAT LINUX FILESYSTEM LAYOUT ** rh linux adheres to the File System Hierarchy Standard (pathname.com/fhs) /boot directory usually contains : LILO's second stage, boot.b linux kernel module information that identifies system modules by name system map file that records the location of kernel modules and symbols copies of disk areas overwritten by the loader during installation /dev directory contains: device files the installation script /dev/MAKEDEV important device files : console system console cua* deprecated - serial ports fd* floppy drives hd* ide harddisks or cdrom lp* parallel ports md* RAID arrays null null output device ramdisk RAM disk sd* scsi hard disk sr* scsi cd-rom st* scsi tape tpqic*, ntpqic* rft*, nrft* QIC tape tty* terminal or pseudoterminal ttyS* serial ports vc* contents of tty device such as a virtual console zero all binary 0s input device /tmp directory contains temporary files which are automatically deleted within 10 days by the 'tmpwatch' utility. ** SYSTEM INITIALIZATION ** all the system V runlevel scripts in redhat is located in /etc/rc.d the following bootup sequence is followed : rc.sysinit -> rc.serial -> rc -> runlevel scripts -> rc.local THE COMPLETE BOOTUP SEQUENCE /etc/rc.d/rc.sysinit initializes file systems and devices. it also checks for /etc/sysconfig/network and exists it if present else sets default variables to turn off networking and sets hostname to localhost. it also sources the file /etc/rc.d/init.d/functions which contains generic routines used by other rc scripts. displays welcome banner that includes prompt for interactive start-up sets the logging level mounts the /proc file system, configures kernel parameters using sysctl, and sets the system clock loads the default kemap if /etc/sysconfig/console/default.kmap exists, otherwise loads the one specified in /etc/sysconfig/keyboard runs /sbin/setsysfont, which sets the default system font activates swap partitions specified in /etc/fstab sets the hostname and NIS domain name, if applicable remounts root file system in read-only mode and checks its status if there is a problem with the root file system. if there is a problem the script starts a shell that allows you to correct the error. setup configured ISA plug-and-play devices remounts the root file system in read-write mode checks disk quotas on the root file system setup /etc/mtab, which lists mounted file systems, and /etc/HOSTNAME which identifies host setup support for loadable kernel modules load the sound module, if a sound card is specified in /etc/conf.modules; loads the MIDI module, if a MIDI interface is also specified load the RAID devices specified in /etc/raidtab checks the non-root file systems, gives a shell if a serious error is found. checks disk quotas and automatically mounts those specified in /etc/fstab. then it turns on quota checking remove unneeded temporary files of various sorts, such as lock files initialize serial ports by running /etc/rc.d/rc.serial, it usually contains the 'setserial' command. it is generally included as support for legacy devices loads the SCSI tape module is such a device is present creates the header file /boot/kernel.h under some circumstances create symbolic links for /boot/System.map-kernel_version copy boot messages to /var/log/dmesg so that they can be read by the dmesg command (ring buffer) END OF BOOTUP /etc/rc.d/rc script runs scripts specified in /etc/inittab for the particular runlevel. the scripts are located in : /etc/rc.d/rc[0-6].d Runlevel Description 0 system halt 1 single-user mode 2 multi-user mode, no NFS 3 full multi-user mode 4 unused 5 full multi-user mode, with X-based login 6 system reboot /etc/rc.d/rc?.d directory contains symbolic links to startup and stop scripts located in /etc/rc.d/init.d. most of these scripts can be given the arguments, start, stop, restart, reload and status to do the appropriate function relating to the service. the files starting with K in ascending order will first be given the stop argument and then those starting with S with the start argument. if you start services apart from using rc scripts, linux might not successfully clean up lock files and stuff like that. the script passes a completion status to the operating system on completion. 'OK' means that it successfully started 'Passed' means that the program recovered even after encoutering errors 'Failed' means that it was unable to start since editing /etc/rc.d/rc?.d files may introduce errors, there are some frontends to it, like : chkconfig - a command line utility ksysv - KDE-based utility ntsysv - a text-mode graphical utility tksysv - an X-based utility chkconfig is the most handiest. to list installed services : chkconfig --list chkconfig --list | sort chkconfig requires the scripts to contain a special comment like : # chkconfig: 25 20 80 which means that the service runs at runlevels 2 and 5 and has start priority 20 and stop priority 80. the second comment consists of one or more lines that describe the service. each line other than the last of the comments must end with a \ to indicate its continuation onto the next line. to add a service : chkconfig --add name to delete a service : chkconfig --del name to associate a service with one or more runlevels : chkconfig name reset to specify the runlevels on the command line : chkconfig --level levels name on chkconfig --level 35 inetd on specifies that the inetd service will run on runlevels 3 and 5 chkdonfig --level 35 inetd off /etc/rc.d/rc.local has priority 99 so will run after all other rc scripts. it creates : /etc/issue file - shows on local logins /etc/issue.net file - shows on remote logins ** UNDERSTANDING CONFIGURATION FILES AND SCRIPTS ** /etc/rc.d/init.d/network start-up script configures network devices by running scripts in /etc/sysconfig/network-scripts.