Table of Contents
Purpose of `/usr`
The /usr directory holds most of the user-facing software and data that are not required to bring the system to a minimal bootable state. It is usually where the bulk of applications, libraries, and read-only shared data live.
Historically the name meant “user,” but on modern systems /usr is better understood as “Unix System Resources.” Ordinary user files such as documents and personal configuration are not stored here, they belong in /home, which is covered separately.
On many systems /usr can be mounted read-only or even shared between multiple machines, because its contents are intended to be static and identical across systems that run the same distribution and version.
Important rule: /usr is for installed software and shared, mostly read-only data, not for personal files or temporary data.
Relationship with `/` and package management
The root filesystem / contains only what is needed to boot and mount other filesystems. Once /usr is available, almost all user commands and libraries are found underneath it.
Package managers install most of their files into subdirectories of /usr. When you install a program with APT, DNF, Pacman, or another system package manager, the executable, its manual pages, libraries, and shared data almost always appear somewhere under /usr.
Because /usr is managed by the distribution, you normally should not modify it by hand. Placing your own custom files directly in /usr can lead to conflicts with the package manager, which expects full control over that tree.
Do not manually delete or overwrite files inside /usr. Let your distribution’s package manager manage this directory.
Executables in `/usr/bin` and `/usr/sbin`
Within /usr, executable programs are split among different directories. The most important are /usr/bin and /usr/sbin.
/usr/bin contains the vast majority of user commands that are not essential for basic system boot. Typical utilities, text editors, compilers, and graphical application binaries live here. When you run a command by name, the shell often finds it in /usr/bin.
/usr/sbin usually contains system administration commands that are not required for the earliest boot phase. Many networking tools, daemon management utilities, and configuration tools used by administrators live in this directory. While regular users may be able to execute some of these commands, they often require elevated privileges to be useful.
On many modern systems, there is some unification between /bin and /usr/bin, as well as /sbin and /usr/sbin, using symbolic links. However, from a beginner perspective, you only need to understand that everyday commands are under /usr/bin and advanced system utilities are under /usr/sbin.
Libraries in `/usr/lib`
Libraries used by programs are stored under /usr/lib and architecture-specific subdirectories of it. These are shared components that many programs load at runtime.
Dynamic libraries are often named with a .so suffix. For example, the standard C library and graphical libraries like those used by desktop environments are kept here. This structure allows multiple programs to share the same compiled code instead of each one including its own copy.
You do not normally interact with /usr/lib directly. The dynamic loader and the applications handle it automatically. Commands such as ldd will show which libraries a binary uses, and most of those paths will point into /usr/lib.
Shared data in `/usr/share`
The /usr/share directory contains architecture-independent data for installed software. This means files that are the same regardless of the CPU type, such as text, icons, and documentation.
Applications store many types of resources here, including:
Help files and manuals that are part of programs.
Localized messages and translation files for different languages.
Icons, themes, desktop entry files, and similar graphical resources.
For example, many manual pages under /usr/share/man are accessed when you use the man command. Similarly, desktop environments read .desktop files from directories under /usr/share to know how to present applications in menus.
Although /usr/share is read by many tools, you rarely need to edit files here manually. It is mainly a place for the distribution to install shared assets.
Headers and development files in `/usr/include` and related paths
If development tools and libraries are installed, header files for compiling programs are usually located under /usr/include. These files are used by compilers so that source code can call into the system and library functions.
Associated with these are additional development artifacts in /usr/lib, such as static libraries and configuration files that tell compilation tools how to find the correct libraries.
As a new user, you will only encounter /usr/include directly if you begin compiling software from source or writing C and C++ programs. Otherwise, these directories remain in the background, serving development tools.
Local vs system `/usr`: the role of `/usr/local`
Inside /usr there is a special subtree, /usr/local. This is reserved for software that you install locally, outside the control of the distribution’s standard package manager.
Typical uses include:
Software you compile from source using ./configure, make, and make install, which by default often choose /usr/local as the target prefix.
Special tools or in-house programs that should not interfere with system packages.
Within /usr/local you will notice a structure that mirrors the main /usr tree. For example, there is /usr/local/bin for locally installed binaries, /usr/local/lib for their libraries, and /usr/local/share for their shared data. This parallel layout keeps locally installed software separate from the system-managed packages.
Use /usr/local for custom or manually installed software to avoid conflicts with system packages in the main /usr.
Configuration under `/usr` and interaction with `/etc`
Most configuration files for programs live under /etc, not under /usr. Files under /usr are usually considered default or packaged data that should not be edited directly.
However, some software may ship example configuration files or templates under /usr/share or other parts of /usr. System tools then read real configuration from /etc, sometimes falling back to defaults bundled under /usr.
As a practical rule, when you need to adjust settings for software installed into /usr, you look for the configuration file under /etc rather than editing anything under /usr itself.
Summary of how you will interact with `/usr`
As a beginner, your main interactions with /usr will be indirect:
When you run commands, you are often executing files located in /usr/bin or /usr/sbin.
When you install or remove packages, your package manager is adding or deleting files inside various subdirectories of /usr.
If you start compiling or installing software by hand, you will encounter /usr/local as the intended destination for those installations.
Knowing that /usr holds the bulk of installed software and read-only shared resources gives you a mental map of where things live and explains why user files and configuration settings belong elsewhere in the filesystem hierarchy.