17. /usr

/usr usually contains by far the largest share of data on a system. Hence, this is one of the most important directories in the system as it contains all the user binaries, their documentation, libraries, header files, etc.... X and its supporting libraries can be found here. User programs like telnet, ftp, etc.... are also placed here. In the original Unix implementations, /usr was where the home directories of the users were placed (that is to say, /usr/someone was then the directory now known as /home/someone). In current Unices, /usr is where user-land programs and data (as opposed to 'system land' programs and data) are. The name hasn't changed, but it's meaning has narrowed and lengthened from "everything user related" to "user usable programs and data". As such, some people may now refer to this directory as meaning 'User System Resources' and not 'user' as was originally intended.

/usr is shareable, read-only data. That means that /usr should
be shareable between various FHS-compliant hosts and must not be written to.
Any information that is host-specific or varies with time is stored elsewhere.

Large software packages must not use a direct subdirectory under the /usr
hierarchy.

/usr/X11R6

Another large subdirectory structure begins here, containing libraries, executables, docs, fonts and much more concerning the X Window System. Its inclusion here is somewhat inconsistent and so is the difference between '/usr' and '/usr/X11R6' directories. One would assume that programs that run on X only have their files in the '/usr/X11R6' hierarchy, while the others use '/usr'. Regrettably, it isn't so. KDE and GNOME put their files in the '/usr' hierarchy, whereas the window manager Window Maker uses '/usr/X11R6'. Documentation files for X11R6 are not in '/usr/X11R6/doc', but primarily in '/usr/X11R6/lib/X11/doc'. This mess is due to the fact that in contrast to other operating systems, the graphical desktop isn't an integral part of the system. Linux is still primarily used on servers, where graphical systems don't make sense.

This hierarchy is reserved for the X Window System, version 11 release 6, and related files. To simplify matters and make XFree86 more compatible with the X Window System on other systems, the following symbolic links must be present if /usr/X11R6 exists:

  /usr/bin/X11 -> /usr/X11R6/bin
  /usr/lib/X11 -> /usr/X11R6/lib/X11
  /usr/include/X11 -> /usr/X11R6/include/X11

In general, software must not be installed or managed via the above symbolic links. They are intended for utilization by users only. The difficulty is related to the release version of the X Window System - in transitional periods, it is impossible to know what release of X11 is in use.

/usr/X11R6/bin

XFree86 system binaries. These are necessary for the initialisation, configuration and running of the X windowing system. X, xf86config, xauth, xmodmap and even xpenguin are located here.

/usr/X11R6/include

XFree86 system header files. There are required for the compilation of some applications that utilise the X toolkit.

/usr/X11R6/lib

XFree86 system libraries.

/usr/X11R6/lib/modules

XFree86 system modules. These are the modules that X loads upon startup. Without these modules video4linux, DRI and GLX extensions and drivers for certain input devices would cease to function.

/usr/X11R6/lib/X11/fonts

XFree86 system fonts. Fonts that are utilised by 'xfs' (the X Font Server) and programs of that ilk.

/usr/bin

This directory contains the vast majority of binaries on your system. Executables in this directory vary widely. For instance vi, gcc, gnome-session and mozilla and are all found here.

/usr/doc

The central documentation directory. Documentation is actually located in /usr/share/doc and linked from here.

/usr/etc

Theoretically, that's another directory for configuration files. Virtually unused now.

/usr/games

Once upon a time, this directory contained network games files. Rarely used now.

/usr/include

The directory for 'header files', needed for compiling user space source code.

/usr/include/'package-name'

Application specific header files.

/usr/info

This directory used to contain the files for the info documentation system. Now they are in '/usr/share/info'.

/usr/lib

This directory contains program libraries. Libraries are collections of frequently used program routines.

/usr/local

The original idea behind '/usr/local' was to have a separate ('local') '/usr' directory on every machine besides '/usr', which might be just mounted read-only from somewhere else. It copies the structure of '/usr'. These days, '/usr/local' is widely regarded as a good place in which to keep self-compiled or third-party programs. The /usr/local hierarchy is for use by the system administrator when installing software locally. It needs to be safe from being overwritten when the system software is updated. It may be used for programs and data that are shareable amongst a group of hosts, but not found in /usr. Locally installed software must be placed within /usr/local rather than /usr unless it is being installed to replace or upgrade software in /usr.

/usr/man

It once held the man pages. It has been moved to /usr/share/man.

/usr/sbin

This directory contains programs for administering a system, meant to be run by 'root'. Like '/sbin', it's not part of a user's $PATH. Examples of included binaries here are chroot, useradd, in.tftpd and pppconfig.

/usr/share

This directory contains 'shareable', architecture-independent files (docs, icons, fonts etc). Note, however, that '/usr/share' is generally not intended to be shared by different operating systems or by different releases of the same operating system. Any program or package which contains or requires data that doesn't need to be modified should store that data in '/usr/share' (or '/usr/local/share', if installed locally). It is recommended that a subdirectory be used in /usr/share for this purpose."

/usr/share/doc

Location of package specific documentation files. These directories often contain useful information that might not be in the man pages. They may also contain templates and configuration files for certain utilities making configuration that much easier.

/usr/share/info

Location of 'info' pages. This style of documentation seems to be largely ignored now. Manual pages are in far greater favour.

/usr/share/man

Manual pages. They are organised into 8 sections, which are explained below.

man1: User programs
Manual pages that describe publicly accessible commands are contained 
in this chapter. Most program documentation that a user will need to 
use is located here.

man2: System calls
This section describes all of the system calls (requests for the kernel 
to perform operations).

man3: Library functions and subroutines 
Section 3 describes program library routines that are not direct calls 
to kernel services. This and chapter 2 are only really of interest to
programmers.

man4: Special files
Section 4 describes the special files, related driver functions, and 
networking support available in the system. Typically, this includes 
the device files found in /dev and the kernel interface to networking 
protocol support.

man5: File formats
The formats for many data files are documented in the section 5. This 
includes various include files, program output files, and system files.

man6: Games
This chapter documents games, demos, and generally trivial programs.
Different people have various notions about how essential this is.

man7: Miscellaneous Manual pages that are difficult to classify are 
designated as being section 7. The troff and other text processing 
macro packages are found here.

man8: System administration Programs used by system administrators
for system operation and maintenance are documented here. Some of
these programs are also occasionally useful for normal users.

/usr/src

The 'linux' sub-directory holds the Linux kernel sources, header-files and documentation.

/usr/src/RPM

RPM provides a substructure for building RPMs from SRPMs. Organisation of this branch is fairly logical with packages being organised according to a package's architecture.

/usr/src/RPM/BUILD

A temporary store for RPM binary files that are being built from source code.

/usr/src/RPM/RPMS/athlon, /usr/src/RPM/RPMS/i386, /usr/src/RPM/RPMS/i486, /usr/src/RPM/RPMS/i586, /usr/src/RPM/RPMS/i686, /usr/src/RPM/RPMS/noarch

These directories contain architecture dependant RPM source files.

/usr/src/RPM/SOURCES

This directory contains the source TAR files, patches, and icon files for software to be packaged.

/usr/src/RPM/SPECS

RPM SPEC files. A SPEC file is a file that contains information as well as scripts that are necessary to build a package.

/usr/src/RPM/SRPMS

Contains the source RPM files which result from a build.

/usr/src/linux

Contains the source code for the Linux kernel.

/usr/src/linux/.config

The last kernel source configuration. This file is normally created through the 'make config', 'make menuconfig' or 'make xconfig' steps during kernel compilation.

/usr/src/linux/.depend, /usr/src/linux/.hdepend

'make dep' checks the dependencies of the selections you made when you created your .config file. It ensures that the required files can be found and it builds a list that is to be used during compilation. Should this process be successful these two files are created.

/usr/src/linux/COPYING

GNU License

/usr/src/linux/CREDITS

A partial credits-file of people that have contributed to the Linux project. It is sorted by name and formatted to allow easy grepping and beautification by scripts. The fields are: name (N), email (E), web-address (W), PGP key ID and fingerprint (P), description (D), and snail-mail address (S).

/usr/src/linux/MAINTAINERS

List of maintainers and details on how to submit kernel changes.

/usr/src/linux/Makefile

Contains data necessary for compilation of a working kernel. It allows developers and end-users to compile a kernel with a few simple steps (ie. make dep, make clean, make bzImage, make modules, make modules_install) and also not have to worry about re-compiling everything from scratch if parts of it have already been done so and are up to date.

/usr/src/linux/README

These are the release notes for Linux version 2.4. Read them carefully, as they tell you what this is all about, explain how to install the kernel, and what to do if something goes wrong.

/usr/src/linux/REPORTING-BUGS

A suggested procedure for reporting Linux bugs. You aren't obliged to use the bug reporting format, it is provided as a guide to the kind of information that can be useful to developers - no more.

/usr/src/linux/Rules.make

This file contains rules which are shared between multiple Makefiles.

/usr/src/linux/Documentation

Contains documentation that may be necessary in order to re-compile a kernel. However, it also provides quite a lot of information about your Linux system in general as well. For those who wish to seek further information on the contents of this directory you may consult the /usr/src/linux/Documentation/00-INDEX file. Further, more detailed documentation may be found in /usr/src/linux/Documentation/Docbook. Of course, the contents of this directory is written in Docbook but may be converted to pdf, ps or html using the make targets of 'pdfdocs', 'psdocs' and 'htmldocs' respectively.

/usr/tmp

User space temporary files. This directory is not found on modern distributions at all and was most likely created as a consequence of Linux's UNIX heritage.