Run man hier to see extensive list of directories and description of the filesystem hierarchy.
/srv
- owner is root
- contains site-specific data which is served by this system
- place for your workspace - your software development tree.
- code repository (possibly in /srv/sourcerepo or something), and then
developers would check out their own working copies into their home
directories.
- place for my source code (though I usually use /srv/vcs/sourcerepo)
/usr
- the location where Distribution-based items are placed
/usr/src
- owner is root
- Source files for different parts of the system, included with some
packages for reference purposes. Don't work here with your own
projects, as files below /usr should be read-only except when installing
software (optional).
- meant for source code for the binaries that come with your system's installation.
For example, it could contain the source code for your kernel, tools
such as ls, passwd, cp, mv etc, which are all installed BY YOUR
DISTRIBUTION. If you upgrade your OS from source, all the source code
would go here, when you rebuild your system. You DON'T want to put any
software that you install BY YOURSELF in here, because they may get
overwritten when you upgrade your system. In general, files that are in
/, /usr/bin, /usr/sbin, /bin, /sbin etc. have their source code in
/usr/src.
- is a system directory. You should not change the owner from root for security reasons
- contains the linux headers and source code of the kernel. Since the
system compiles the kernel from there, it IS a security breach to change
the ownership to anything other than root
- if you wanted to recompile an Ubuntu package from source, their
package manager would place the source for package in /usr/src/{package
dir}
/usr/local
- owner is root
- location where you'd place your own localized changesod the Distribution (/usr/local will be empty after a base install)
- contains the following subdirectories:
- bin
- etc
- games
- include
- lib
- man
- sbin
- share
- src
- this directory tree is meant to be used for software that you install by yourself, without using the distribution CD(s). For example, /usr/local/bin, /usr/local/sbin are for the binaries that are installed by you separately, /usr/local/etc is for config files etc. Thus /usr/local/src is for source files that you yourself downloaded. Example: go (binary distribution) gets installed in /usr/local/go.
- If you upgrade your system, files under the /usr tree get overwritten, such as /usr/bin, /usr/sbin, /usr/src etc. However, anything under /usr/local will not be touched. This is why all the software you installed separately should go to /usr/local tree.
- a place to install files built by the administrator, typically by
using the make command (e.g., ./configure; make; make install). The idea
is to avoid clashes with files that are part of the operating system,
which would either be overwritten or overwrite the local ones otherwise
(e.g., /usr/bin/foo is part of the OS while /usr/local/bin/foo is a
local alternative).
- for self, inhouse, compiled and maintained software.
- reserved for software installed locally by the sysadmin
- place where you want to install software along with source files (for other programs to use or for people to look at)
- It's not meant, however, to be a workspace. Since it is local, you
can do whatever you want, of course, but this isn't designed to be the
place to put your software development tree.
- for use by the system administrator when installing software locally.
It needs to be safe from being overwritten when the system software is updated.
/usr/local/bin
- for programs that a normal user may run
- binaries at this path are accessible to all user accounts
/usr/local/src
- owner is root
- Source code for locally installed software
- If you downloaded a program not managed by your distribution and
wanted to compile/install it, FHS dictates that you do that in
/usr/local/src.
- a good place for downloading third party source code (eg for patching and rebuilding packages), not my own source code
/opt
- This directory is reserved for all the software and add-on packages
that are not part of the default installation. All third party
applications should be installed in this directory. (Linux Filesystem Hierarchy: /opt)
- a directory for installing unbundled packages (i.e. packages not
part of the Operating System distribution, but provided by an
independent source), each one in its own subdirectory. They are already
built whole packages provided by an independent third party software
distributor. Unlike /usr/local stuff, these packages follow the
directory conventions (or at least they should). For example, someapp
would be installed in /opt/someapp, with one of its command being
/opt/someapp/bin/foo, its configuration file would be in
/etc/opt/someapp/foo.conf, and its log files in
/var/opt/someapp/logs/foo.access. (What is the difference between /opt and /usr/local?)
- for non-self, external, prepackaged binary/application bundle installation
- directory where you can just toss things and see if they work makes a
whole lot of sense. I know I'm not going to go through the effort of
packaging things myself to try them out. If the app doesn't work out,
you can simply rm the /opt/mytestapp directory and that application is
history.
- used for third-party software, which in the context of Ubuntu, means
precompiled software that is not distributed via Debian packages
- A program that is installed in /opt is supposed to be self-contained.
- The main reason for using /opt is to provide a common standard path
where external software can be installed without interfering with the
rest of the installed system. /opt does not appear in standard compiler
or linker paths (gcc -print-search-dirs or /etc/ld.so.conf etc.), so
headers and libraries installed there are somewhat isolated from the
main system and shouldn't interfere with already-installed programs. (Why should I move everything into /opt?)
Resources:
executable - What is /usr/local/bin? - Unix & Linux Stack Exchange