Embora ambos sejam projetados para conter arquivos que não pertencem ao sistema operacional, /opt
e /usr/local
não devem conter o mesmo conjunto de arquivos.
/usr/local
é um local para instalar arquivos criados pelo administrador, geralmente usando o comando make
(por exemplo, ./configure; make; make install
). A idéia é evitar conflitos com arquivos que fazem parte do sistema operacional, que seriam sobrescritos ou sobrescreveriam os locais (por exemplo, /usr/bin/foo
é parte do sistema operacional, enquanto /usr/local/bin/foo
é uma alternativa local).
Todos os arquivos em /usr
são compartilháveis entre instâncias do sistema operacional, embora isso raramente seja feito com o Linux. Essa é uma parte em que o FHS é ligeiramente autocontraditório, pois /usr
é definido como somente leitura, mas /usr/local/bin
precisa ser de leitura / gravação para que a instalação local do software seja bem-sucedida. O padrão do sistema de arquivos SVR4, que era a principal fonte de inspiração da FHS, recomenda evitar /usr/local
e usar /opt/local
para superar esse problema.
/usr/local
é um legado do BSD original. Naquela época, o código-fonte dos comandos /usr/bin
OS estava em /usr/src/bin
e /usr/src/usr.bin
, enquanto a origem dos comandos desenvolvidos localmente estava em /usr/local/src
e seus binários em /usr/local/bin
. Não havia noção de embalagem (fora de tarballs).
Por outro lado, /opt
é um diretório para a instalação de pacotes não incluídos (ou seja, pacotes que não fazem parte da distribuição do Sistema Operacional, mas são fornecidos por uma fonte independente), cada um em seu próprio subdiretório. Eles já são pacotes completos construídos fornecidos por um distribuidor independente de software de terceiros. Ao contrário de /usr/local
stuff, esses pacotes seguem as convenções de diretório (ou pelo menos deveriam). Por exemplo, someapp
seria instalado em /opt/someapp
, com um de seus comandos sendo /opt/someapp/bin/foo
, seu arquivo de configuração estaria em /etc/opt/someapp/foo.conf
e seus arquivos de log em /var/opt/someapp/logs/foo.access
.