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 .